Sei sulla pagina 1di 9

Cdigo C# - SQL

Tips y Trucos
Ejecutar un procedimiento almacenado de SQL desde C# Con el siguiente cdigo podemos ejecutar un procedimiento almacenado pasndole sus parmeros y recibiendo los resultados en una variable. Supongamos que tenemos un procedimiento almacenado llamado "getXML", que recibe como parmetro un valor Id de tipo int llamado "@Id" y devuelve un dato de tipo varchar llamado "@XML".

CREATE PROCEDURE [dbo].[getXML] @Id INT, @XML VARCHAR(8000) OUTPUT AS BEGIN ... ... ... END
El cdigo en C# para pasarle los parmetros necesarios, ejecutarlo y recibir el resultado sera el siguiente.

using System.Data.SqlClient; using System.Data; static public string getStringXML(int _id) { string _XML = string.Empty; SqlConnection conn = new SqlConnection( ConfigurationManager.ConnectionStrings["ConnectionName"].ToString()); conn.Open(); SqlCommand Query = new SqlCommand("getXML", conn); Query.CommandType = CommandType.StoredProcedure; Query.Parameters.Add("@Id", SqlDbType.Int, 4); Query.Parameters["@Id"].Value = _id; Query.Parameters.Add("@XML", SqlDbType.VarChar, 8000); Query.Parameters["@XML"].Direction = ParameterDirection.Output;

Query.ExecuteNonQuery(); conn.Close(); _XML = Query.Parameters["@XML"].Value.ToString(); return _XML; }


Otro caso sera ejecutar un procedimiento almacenado que realiza una consulta y devolver un DataSet. Para poder lograr lo anterior creamos un stored procedure llamado [showData] que realiza un select a una tabla:

CREATE PROCEDURE [dbo].[showData] AS BEGIN

SELECT * FROM TableName END


Posteriormente para llamar al procedimiento y devolver un DataSet hacemos la siguiente funcin en .Net

static public DataSet showData() { DataSet db = new DataSet(); try { SqlConnection conn = new SqlConnection (ConfigurationManager.AppSettings["ConnectionName"].ToString()); conn.Open(); SqlCommand Query = new SqlCommand("showData", conn); Query.CommandType = CommandType.StoredProcedure; SqlDataAdapter SqlDa = new SqlDataAdapter(Query); SqlDa.Fill(db); conn.Close(); } catch { db = null; } return db; }
Un caso ms sera ejecutar un procedimiento almacenado que realiza una consulta y asignar el resultado a un DataReader y posteriormente leerlo, para ello creamos un procedimiento almacenado llamado [getData]:

CREATE PROCEDURE [dbo].[getData] @Type INT AS BEGIN SELECT Id, Campo,Type FROM TableName WHERE Type=@Type END
Posteriormente para llamar al procedimiento, ejecutar el DataReader, obtener los datos y asignarlos a un ArrayList y devolver un arreglo hacemos la siguiente funcin en .Net

static public string[] getTypeData(int _idType) { ArrayList List = new ArrayList(); try { SqlConnection conn = new SqlConnection (ConfigurationManager.AppSettings["ConnectionName"].ToString()); conn.Open(); SqlCommand Query = new SqlCommand("getData", conn); Query.CommandType = CommandType.StoredProcedure; Query.Parameters.Add("@Type", SqlDbType.Int); Query.Parameters["@Type"].Value = _idType; SqlDataReader reader = Query.ExecuteReader();

while (reader.Read()) { List.Add(reader["Campo"].ToString()); } rveader.Close(); conn.Close(); } catch { List = null; } return (string[])List.ToArray(typeof(string)); }

Introduccion
En mi publicacion anterior explique como crear un procedimiento almacenado con SQL server 2008 express edition y ejecutarlo desde el SQL analyzer, ahora me gustaria mostrar como ejecutar un procedimiento almacenado desde una aplicacion de escritorio desarrollada en Visual Studio 2010 y C#. Para este articulo utilizare el procedimiento almacenado del articulo anterior como ejemplo para esta practica, si no sabes como crear un Stored Procedure o Procedmiento almacenado puedes ver lo dando clic sobre este link El primer paso es crear un proyecto WindowsForm , el cual nombraremos ExecutingStoredProcedure en Visual Studio 2010 y usando como lenguaje de programacion C#, en caso de que no sepas como crear un proyecto en VS2010 puedes ver lo dando clic sobre este link, dichas instrucciones trabajan bien con los frameworks 2.0, 3.0 y 4.0 por lo que no deberian tener problemas al trabajar con versiones antiguas del del Visual Studio 2005 o 2008. Despues de tener listo nuestro proyecto de WindowsForm agregaremos los siguientes controles : 1 listView con las siguientes dimensiones: 386, 168. 2 Botones con las siguientes dimenciones: 75, 4. Despues de insertar nues tros controles, agreagaremos dos culumnas a nuestro listView las cuales llamaremos Usuario y Contrasea estos campos pertenecen a una tabla llamada Table_Users la cual fue creada previamente para este ejercicio, dicha tabla contiene el registro de unos ususarios y sus respectivas contraseas como se muestra en la figura 1.0.

Figura 1.0. Luego de haber agregado nuestras columnas en nuesttro listView en donde mostraremos el contenido de la tabla, cambiaremos el texto de nuestros botones por Query y Stored Procedure respectivamente como se muestra en la figura 2.0.

Figura 2.0.

Codificacion
Ahora empezaremos a modelar la logica de negocios de nuestra aplicacion. El siguiente codigo realiza una consulta de la Tabla_Users y despues lo vacia al listView para que el usuario pueda verlo. con = new SqlConnection(@Data Source = HOME-A30C6C1EFD\SQLEXPRESS; Initial Catalog = Test; Integrated Security = SSPI;); con.Open(); query = SELECT * FROM Table_Users; cmd = new SqlCommand(query, con); dr = cmd.ExecuteReader(); while(dr.Read()) { //Este renglon te permite insertar cada uno de los datos obtenidos de la consulta en la Usuario value = listView1.Items.Add(dr.GetValue(0).ToString()); //Este renglon te permite insertar cada uno de los datos obtenidos de la consulta en la Contrasea value.SubItems.Add(dr.GetValue(1).ToString()); } con.Close(); Ahora veremos como se como realizar la misma operacion pero esta vez procedimiento almacenado MiPrimerStoredProcedure. con = new SqlConnection(@Data Source = HOME-A30C6C1EFD\SQLEXPRESS; Initial Catalog = Test; Integrated Security = SSPI;); con.Open(); // crear un objecto tipo command para identificar // el procedimiento almacenado en esta caso ingresamos nombre del procedimiento en lugar de un query. cmd = new SqlCommand(MiPrimerStoredProcedure,con); // Indicamos al sistema el tipo de comando a ejecutar en este caso nuestro procedimiento almacenado // Por dafault el metodo SqlCommand() recibe un query y por eso es necesario definirlo cmd.CommandType = CommandType.StoredProcedure; // execute the command dr = cmd.ExecuteReader(); while (dr.Read()) { value = listView1.Items.Add(dr.GetValue(0).ToString()); value.SubItems.Add(dr.GetValue(1).ToString()); ejecutando un

} con.Close(); Como podran observar en ambos segmentos de codigo solo varian en una linea de codigo lo cual nos hace questionar de que nos sirve este tipo de funciones que nos da SQL si no vemos reduccion de codigo?, como recordaran un procedimiento almacenado es una funcion o rutina el cual puede ejecutar uno o mas queries lo que nos da mucha ventaja al momento de ejecutarlos ya que no tendremos que escribir cada una de las funciones para nuestras consultas en lo cual nos ahorra tiempo en este tipo de tareas. A continuacion mostrare el codigo completo: using using using using using using using using using System.Data.SqlClient; namespace ExecutingStoredProcedure { public partial class Form1 : Form { public Form1() { InitializeComponent(); } string query; string stored_procedure = MiPrimerStoredProcedure;//Esta variable almacena el nombre del stored procedure que vamos a ejecutar SqlConnection con; SqlCommand cmd; SqlDataReader dr; ListViewItem value; void Query_Select() { con = new SqlConnection(@Data Source = HOME-A30C6C1EFD\SQLEXPRESS; Initial Catalog = Test; Integrated Security = SSPI;); con.Open(); query = SELECT * FROM Table_Users; cmd = new SqlCommand(query, con); dr = cmd.ExecuteReader(); while(dr.Read()) { //Este renglon te permite insertar cada uno de los datos obtenidos de la co nsulta en la Usuario en nuestro listView en su respectiva columna value = listView1.Items.Add(dr.GetValue(0).ToString()); //Este renglon te permite insertar cada uno de los datos obtenidos de la consulta en la Contrasea System; System.Collections.Generic; System.ComponentModel; System.Data; System.Drawing; System.Linq; System.Text; System.Windows.Forms;

en nuestro listView en su respectiva columna value.SubItems.Add(dr.GetValue(1).ToString()); } con.Close(); } void Stored_Procedure() { con = new SqlConnection(@Data Source = HOME-A30C6C1EFD\SQLEXPRESS; Initial Catalog = Test; Integrated Security = SSPI;); con.Open(); // 1. create a command object identifying // the stored procedure cmd = new SqlCommand(stored_procedure,con); // 2. set the command object so it knows // to execute a stored procedure cmd.CommandType = CommandType.StoredProcedure; // execute the command dr = cmd.ExecuteReader(); // iterate through results, printing each to Listview while (dr.Read()) { value = listView1.Items.Add(dr.GetValue(0).ToString()); value.SubItems.Add(dr.GetValue(1).ToString()); } con.Close(); } private void button1_Click(object sender, EventArgs e)// Boton Query { listView1.Items.Clear(); Query_Select(); } private void button2_Click(object sender, EventArgs e)// Boton Stored Procedure { listView1.Items.Clear(); Stored_Procedure(); } } } Por ultimo solo presionaremos el boton F5 y a continuacion el sistema mostrara nuestra aplicacion como se muestra en la figura 3.0.

Figura 3.0. En este punto solo debemos dar click a cualquiera de nuestros botones para ejecutar nuestra consulta y acontinuacion obtener nuestros registros como seve en la figura 4.0.

Figura 4.0.

Conclusiones
Espero que este articulo les sea de utilidad y de su agrado y por mi parte considero este un tema esencial para cualquier programador ya debe conocer,el como invocar procedimientos almacenados desde sus interfaces o aplicaciones, y me gustaria agregar que esta semana tratare este mismo tema pero con el uso de parametros de entrada lo caul es de gran utildad al momento de realizar consultas refinadas, insercion de un nuevo registro y eliminacion de datos especificos.

Creando la Base de Datos http://hwongu.blogspot.com/2011/02/c-aplicacion-de-escritorio-sistemas-de.html Creando la capa de datos http://hwongu.blogspot.com/2011/02/c-aplicacion-de-escritorio-sistemas-de_22.html Creando la capa de negocios http://hwongu.blogspot.com/2011/02/c-aplicacion-de-escritorio-sistemas-de_5596.html Creando la capa de presentacion http://hwongu.blogspot.com/2011/02/c-aplicacion-de-escritorio-sistemas-de_23.html Creando los reportes en crystal report http://hwongu.blogspot.com/2011/02/c-aplicacion-de-escritorio-sistemas-de_5944.html

http://desdeceronetsql2.wordpress.com/2012/10/25/recuperar-1-valor-devuelto-deprocedimiento-almacenado-en-c/

http://geeks.ms/blogs/quintas/archive/2007/07/13/parameters-addwithvalue-withcuidadito.aspx

Primeramente, voy a crearme una tabla de SQL Server de clientes: SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[cliente]( [idCliente] [bigint] IDENTITY(1,1) NOT NULL, [nombres] [nchar](50) COLLATE Modern_Spanish_CI_AS NULL, [apellidos] [nchar](50) COLLATE Modern_Spanish_CI_AS NULL, [direccion] [nchar](50) COLLATE Modern_Spanish_CI_AS NULL, [email] [nchar](100) COLLATE Modern_Spanish_CI_AS NULL, CONSTRAINT [PK_cliente] PRIMARY KEY CLUSTERED ( [idCliente] ASC )WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] Luego, creamos algunos datos en la tabla (ese trabajito les dejo como tarea). Ahora, voy a crear un procedimiento almacenado que inserta datos en mi tabla de clientes:

set ANSI_NULLS ON set QUOTED_IDENTIFIER ON GO CREATE PROCEDURE [dbo].[InsertarCliente] @nombres nchar(50), @apellidos nchar(50), @direccion nchar(50), @email nchar(100) AS Insert into cliente values (@nombres, @apellidos, @direccion, @email)
Finalmente, en C# hacemos una llamada al procedimiento almacenado. El cdigo sera el siguiente:
private void button4_Click(object sender, EventArgs e) { try { string ConnectionString = Catalog=MiBD;Integrated Security=True; Data Source=.\SQLEXPRESS;Initial

SqlConnection cnn = new SqlConnection(ConnectionString); SqlCommand cmd = new SqlCommand("InsertarCliente", cnn); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add("@nombres", SqlDbType.Char, 50); cmd.Parameters.Add("@apellidos", SqlDbType.Char, 50); cmd.Parameters.Add("@direccion", SqlDbType.Char, 50); cmd.Parameters.Add("@email", SqlDbType.Char, 100); cmd.Parameters["@nombres"].Value = textBox2.Text; cmd.Parameters["@apellidos"].Value = textBox3.Text; cmd.Parameters["@direccion"].Value = textBox4.Text; cmd.Parameters["@email"].Value = textBox5.Text; cnn.Open(); cmd.ExecuteNonQuery(); MessageBox.Show("Los datos fueron insertados correctamente"); cnn.Close(); this.button4.Visible = false; this.button1.Visible = true; CargarClientes(); } catch (Exception ex) { MessageBox.Show(ex.ToString()); } }

Potrebbero piacerti anche