You are on page 1of 9

Código C# - SQL

Tips y Trucos
Ejecutar un procedimiento almacenado de SQL desde C# Con el siguiente código podemos ejecutar un procedimiento almacenado pasándole sus parámeros y recibiendo los resultados en una variable. Supongamos que tenemos un procedimiento almacenado llamado "getXML", que recibe como parámetro 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 código en C# para pasarle los parámetros necesarios, ejecutarlo y recibir el resultado sería 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 sería 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

Parameters["@Type"]. conn).Open(). obtener los datos y asignarlos a un ArrayList y devolver un arreglo hacemos la siguiente función en .ExecuteReader().CommandType = CommandType.AppSettings["ConnectionName"]. Campo.Int).StoredProcedure. } return db. conn.[getData] @Type INT AS BEGIN SELECT Id. SqlDataReader reader = Query. SqlCommand Query = new SqlCommand("showData". ejecutar el DataReader.Value = _idType.Parameters.Net static public string[] getTypeData(int _idType) { ArrayList List = new ArrayList(). } catch { db = null. Query. conn.SELECT * FROM TableName END Posteriormente para llamar al procedimiento y devolver un DataSet hacemos la siguiente función en . Query. para ello creamos un procedimiento almacenado llamado [getData]: CREATE PROCEDURE [dbo]. Query.Add("@Type". } Un caso más sería ejecutar un procedimiento almacenado que realiza una consulta y asignar el resultado a un DataReader y posteriormente leerlo. Query.AppSettings["ConnectionName"]. try { SqlConnection conn = new SqlConnection (ConfigurationManager. SqlCommand Query = new SqlCommand("getData".Fill(db). try { SqlConnection conn = new SqlConnection (ConfigurationManager.ToString()).Type FROM TableName WHERE Type=@Type END Posteriormente para llamar al procedimiento.ToString()). conn). .Close().Net static public DataSet showData() { DataSet db = new DataSet(). SqlDbType.Open(). SqlDa. SqlDataAdapter SqlDa = new SqlDataAdapter(Query).CommandType = CommandType. conn.StoredProcedure.

} Introduccion En mi publicacion anterior explique como crear un procedimiento almacenado con SQL server 2008 express edition y ejecutarlo desde el SQL analyzer.Close(). 168.Read()) { List. Despues de insertar nues tros controles. agreagaremos dos culumnas a nuestro listView las cuales llamaremos “Usuario” y “Contraseña” estos campos pertenecen a una tabla llamada “Table_Users” la cual fue creada previamente para este ejercicio. cambiaremos el texto de nuestros botones por “Query” y “Stored Procedure” respectivamente como se muestra en la figura 2. en caso de que no sepas como crear un proyecto en VS2010 puedes ver lo dando clic sobre este link.ToString()). } catch { List = null. 2 Botones con las siguientes dimenciones: 75.0 y 4. 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 . dicha tabla contiene el registro de unos ususarios y sus respectivas contraseñas como se muestra en la figura 1. Figura 1.0. dichas instrucciones trabajan bien con los frameworks 2.Add(reader["Campo"]. Luego de haber agregado nuestras columnas en nuesttro listView en donde mostraremos el contenido de la tabla.0. 4. ahora me gustaria mostrar como ejecutar un procedimiento almacenado desde una aplicacion de escritorio desarrollada en Visual Studio 2010 y C#. 3. } rveader. .0. Despues de tener listo nuestro proyecto de WindowsForm agregaremos los siguientes controles : 1 listView con las siguientes dimensiones: 386.0.0 por lo que no deberian tener problemas al trabajar con versiones antiguas del del Visual Studio 2005 o 2008. el cual nombraremos “ExecutingStoredProcedure” en Visual Studio 2010 y usando como lenguaje de programacion C#. Para este articulo utilizare el procedimiento almacenado del articulo anterior como ejemplo para esta practica.ToArray(typeof(string)).Close(). conn. } return (string[])List.while (reader.

ejecutando un .ToString()).ToString()).”).StoredProcedure.ToString()). El siguiente codigo realiza una consulta de la Tabla_Users y despues lo vacia al listView para que el usuario pueda verlo.Open(). Initial Catalog = Test.GetValue(0).Add(dr.ToString()). while(dr. cmd = new SqlCommand(“MiPrimerStoredProcedure”. value.CommandType = CommandType. dr = cmd.SubItems. Integrated Security = SSPI.Open(). while (dr. Codificacion Ahora empezaremos a modelar la logica de negocios de nuestra aplicacion.Items.GetValue(0). // 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.Items. con).GetValue(1).Figura 2. //Este renglon te permite insertar cada uno de los datos obtenidos de la consulta en la “Contraseña” value.ExecuteReader(). query = “SELECT * FROM Table_Users”.Add(dr.ExecuteReader(). } con. con = new SqlConnection(@”Data Source = HOME-A30C6C1EFD\SQLEXPRESS. // crear un objecto tipo command para identificar // el procedimiento almacenado en esta caso ingresamos nombre del procedimiento en lugar de un query.Close().Add(dr. Ahora veremos como se como realizar la misma operacion pero esta vez procedimiento almacenado “MiPrimerStoredProcedure”.0. cmd = new SqlCommand(query. Integrated Security = SSPI. Initial Catalog = Test. con.Read()) { //Este renglon te permite insertar cada uno de los datos obtenidos de la consulta en la “Usuario” value = listView1.GetValue(1). con = new SqlConnection(@”Data Source = HOME-A30C6C1EFD\SQLEXPRESS. // execute the command dr = cmd.Add(dr.con).”). con.Read()) { value = listView1.SubItems.

SqlClient. string stored_procedure = “MiPrimerStoredProcedure”.Collections. System. dr = cmd. System. con). SqlCommand cmd. Initial Catalog = Test. System. } string query. Integrated Security = SSPI. System.} con.”). 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. while(dr.//Esta variable almacena el nombre del stored procedure que vamos a ejecutar SqlConnection con. SqlDataReader dr.Text.Linq. System.Items. //Este renglon te permite insertar cada uno de los datos obtenidos de la consulta en la “Contraseña System.Add(dr.Data.Drawing.ToString()). ListViewItem value. .ExecuteReader(). namespace ExecutingStoredProcedure { public partial class Form1 : Form { public Form1() { InitializeComponent(). query = “SELECT * FROM Table_Users”.Generic.Windows. System.Data. con.Forms.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. System.Open().GetValue(0).Close(). void Query_Select() { con = new SqlConnection(@”Data Source = HOME-A30C6C1EFD\SQLEXPRESS.ComponentModel. cmd = new SqlCommand(query.

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

com/2011/02/c-aplicacion-de-escritorio-sistemas-de_23.html Creando los reportes en crystal report http://hwongu.blogspot.blogspot.blogspot.el como invocar procedimientos almacenados desde sus interfaces o aplicaciones. 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.com/2011/02/c-aplicacion-de-escritorio-sistemas-de_5596.blogspot.0.html Creando la capa de presentacion http://hwongu.blogspot.com/2012/10/25/recuperar-1-valor-devuelto-deprocedimiento-almacenado-en-c/ . 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.com/2011/02/c-aplicacion-de-escritorio-sistemas-de_5944. Figura 4.0. Creando la Base de Datos http://hwongu.html http://desdeceronetsql2.html Creando la capa de datos http://hwongu. 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.com/2011/02/c-aplicacion-de-escritorio-sistemas-de_22.wordpress.com/2011/02/c-aplicacion-de-escritorio-sistemas-de. insercion de un nuevo registro y eliminacion de datos especificos.0.html Creando la capa de negocios http://hwongu.Figura 3.

Ahora. [direccion] [nchar](50) COLLATE Modern_Spanish_CI_AS NULL. @email nchar(100) AS Insert into cliente values (@nombres. EventArgs e) { try { string ConnectionString = Catalog=MiBD. en C# hacemos una llamada al procedimiento almacenado.[InsertarCliente] @nombres nchar(50).\SQLEXPRESS. @email) Finalmente.aspx Primeramente. El código sería el siguiente: private void button4_Click(object sender. [email] [nchar](100) COLLATE Modern_Spanish_CI_AS NULL. 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].[cliente]( [idCliente] [bigint] IDENTITY(1. @apellidos nchar(50). [nombres] [nchar](50) COLLATE Modern_Spanish_CI_AS NULL. @direccion nchar(50). @apellidos.Integrated Security=True”. [apellidos] [nchar](50) COLLATE Modern_Spanish_CI_AS NULL. IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] Luego. ”Data Source=. @direccion.Initial .http://geeks.ms/blogs/quintas/archive/2007/07/13/parameters-addwithvalue-withcuidadito. CONSTRAINT [PK_cliente] PRIMARY KEY CLUSTERED ( [idCliente] ASC )WITH (PAD_INDEX = OFF. voy a crearme una tabla de SQL Server de clientes: SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo]. creamos algunos datos en la tabla (ese trabajito les dejo como tarea).1) NOT NULL.

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