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 “Contraseña” 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 contraseñas 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 “Contraseña”
value.SubItems.Add(dr.GetValue(1).ToString());
}
con.Close();

Ahora veremos como se como realizar la misma operacion pero esta vez  ejecutando un 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());
}
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 System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
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 consulta 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 “Contraseña 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.

Bibliografia

1.- Data Developer Center, Call stored procedure in C#, Recuperado Febrero 28, 2012,  http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataproviders/thread/e9d17dcf-55ce-4a67-9a56-f5955638e51e

2.-How to execute a stored procedure fromC# program, Recuperado Febrero 28, 2012, http://stackoverflow.com/questions/1260952/how-to-execute-a-stored-procedure-from-c-sharp-program