sábado, 1 de agosto de 2009

.NET 3.5 - Usando el Nuevo tipo SqlDbType.Structured para pasar parámetros de tipo Table a Stored Procedures en SQL Server 2008

En SQL Server 2008 se ha agregado la posibilidad (largamente esperada) de pasar un parámetro de tipo Table a un Stored Procedure, pueden ver una explicación aquí:
http://sqldata.blogspot.com/2009/08/mejoras-en-t-sql-de-sql-server-2008-el.html

La pregunta es como hacer desde .NET 3.5 para invocar este tipo de stored procedures, lo cual se resuelve fácilmente con el nuevo sqltype de tipo Structured

El código que viene a continuación es un ejemplo de lo dicho, como verán todo esto es código conocido, la única novedad es que pasamos directamente un datatable completo al value del parámetro, definido como Structured, veamos el ejemplo:

//creo un data table para almacenar algunos registros de ejemplo
DataTable dtClientes = new DataTable("Clientes");
DataColumn dcNombre = new DataColumn("nombre", typeof(string));
DataColumn dcApellido = new DataColumn("apellido", typeof(string));
DataColumn dcEmail = new DataColumn("Email", typeof(string));
dtClientes.Columns.Add(dcNombre);
dtClientes.Columns.Add(dcApellido);
dtClientes.Columns.Add(dcEmail);
//agrego un cliente
DataRow drCustomer = dtClientes.NewRow();
drCustomer["nombre"] = "aaa.net";
drCustomer["apellido"] = "XYZ";
drCustomer["Email"] = "info@kyriosdata.com.ar";
dtClientes.Rows.Add(drCustomer);
//Agrego otro cliente
drCustomer = dtClientes.NewRow();
drCustomer["nombre"] = "bbb.net";
drCustomer["apellido"] = "XYZ";
drCustomer["Email"] = "info@kyriosdata.com.ar";
dtClientes.Rows.Add(drCustomer);
//Y otro cliente mas
drCustomer = dtClientes.NewRow();
drCustomer["nombre"] = "ccc.net";
drCustomer["apellido"] = "XYZ";
drCustomer["Email"] = "info@kyriosdata.com.ar";
dtClientes.Rows.Add(drCustomer);
//Creo la conexion, recuerde modificar el connection string
// y modifique server e indique SU servidor
// y modifique en base de datos e indique SU base de datos
SqlConnection conn = new SqlConnection("server=.;database=Ejemplo;Integrated Security=true");
conn.Open();
//Lo tradicional, creamos un comando que invoque al store "Agrega clientes"
// que está definido y se pueden encontrar en el enlace siguiente:
// http://sqldata.blogspot.com/2009/08/mejoras-en-t-sql-de-sql-server-2008-el.html
SqlCommand cmdCustomer = new SqlCommand("AgregaClientes", conn);
cmdCustomer.CommandType = CommandType.StoredProcedure;
//Aquí en realidad se encuentra lo único distinto con respecto
// a la lógica que veníamos usando en .NET
// y es crear el parámetro pero usando el nuevo sqldbtype Structured
// el cual puede recibir un datatable completo
// el s.p. matchea con un parámetro de tipo table, ver el link
SqlParameter paramCustomer = cmdCustomer.Parameters.Add("@ClientesTVP", SqlDbType.Structured);
paramCustomer.Value = dtClientes;
//Ejecutamos
cmdCustomer.ExecuteNonQuery();

Y si revisamos la tabla Clientes debiéramos encontrar los nuevos registros agregados a la tabla cliente.

Nuevamente y por si a alguien se le escapó el detalle, la información acerca de este nuevo tipo de parámetros como asimismo la definición del Stored Procedure se encuentra en el siguiente enlace:

http://www.sqlexperto.com.ar/index.php?topic=20.msg21#new





1 comentario:

IvanKike dijo...

Saludos roman, muy bueno el post, te felicito y te agradesco por la colaboracion....mira tengo una duda, y es en la parte del llamado del stored procedure desde .net...tu lo haces mediante sqlcommand...como puedo hacerlo si utilizo la clase sqlhelper? mira yo invoco los SP de las siguiente forma...

SqlHelper.ExecuteNonQuery(Conex.cnxString, "[SP_Registra]", dato);

como seria la sintaxis en este caso para el envio de una tabla o un list con varios datos como lo muestra tu post?