UN MÉTODO PARA INSERTAR MÚLTIPLES REGISTROS EN UNA TABLA DESDE .NET???
Un procedimiento para insertar múltiples registros en una tabla desde .Net, consiste en la utilización de Tipos de Tablas definidos por usuarios (User-Defined Table Types), estos tipos corresponden a una tabla que se pasa como parámetro a un procedimiento, al ser una tabla ADEMÁS de realizar la operación de INSERT se pueden leer los datos pasados como parámetro para realizar alguna otra operación que se requiera sobre estos.
Un procedimiento para insertar múltiples registros en una tabla desde .Net, consiste en la utilización de Tipos de Tablas definidos por usuarios (User-Defined Table Types), estos tipos corresponden a una tabla que se pasa como parámetro a un procedimiento, al ser una tabla ADEMÁS de realizar la operación de INSERT se pueden leer los datos pasados como parámetro para realizar alguna otra operación que se requiera sobre estos.
Un procedimiento de ejemplo para
la creación del TIPO de tabla se puede encontrar en: https://voiceofthedba.wordpress.com/2012/09/19/creating-a-user-defined-table-type/, de igual forma, la forma para cargar el parámetro para
el SP, se puede observar en http://www.codeproject.com/Tips/93248/SQL-Server-User-Defined-Table-Types-and-Table.
Un
ejemplo para consultar que se utiliza dentro de uno de los proyectos en una Clínica corresponde a la consulta de una información para generación de un
informe, la creación del tipo se realiza utilizando un script como el
siguiente:
CREATE TYPE [dbo].[TablaIds] AS TABLE(
[IdTabla]
[int] NULL
)
El tipo creado se puede localizar en:
En este caso el tipo es una tabla con IDs de ventas. La forma de
declarar la variable en el procedimiento es de la siguiente forma:
CREATE PROCEDURE [dbo].[spInformeVentas]
@FechaInicio DATETIME,
@FechaFin DATETIME,
@TablaIds TablaIds READONLY,
AS
BEGIN
………….
END
Para verificar el procedimiento desde SQL, se puede utilizar un script
como el siguiente:
DECLARE @FechaInicio DATETIME
DECLARE @FechaFin DATETIME
DECLARE @tablaIds TablaIds
–- Aquí se insertan tantos registros como se
requieran de la siguiente forma
-- Como la tabla tiene una sola columna de tipo
entero solo se inserta un valor,
-- en todo caso si se requieren tipos más complejos
se puede realizar la operación
-- de INSERT como corresponda.
INSERT INTO @tablaIds VALUES(7289)
INSERT INTO @tablaIds VALUES(29403)
SET @FechaInicio = '2014-01-01'
SET @FechaFin = '2014-06-30'
EXEC spInformeVentas @FechaInicio, @FechaFin,
@tablaIds
La forma de llamar el procedimiento desde .NET, de la forma que nosotros
consultamos aquí en el proyecto, es la siguiente:
public DataTable
ConsultarInformeVentas (DateTime
fechaInicio, DateTime fechaFinal, IEnumerable<Int32> codigosVentas)
{
DataTable dtIds = new DataTable();
dtIds.Locale = CultureInfo.CurrentCulture;
DataColumn[] dtc = new DataColumn[1];
dtc[0] = new DataColumn("IdTabla", System.Type.GetType("System.Int32"));
dtIds.Columns.AddRange(dtc);
foreach (Int32
codigoVenta in codigosVentas) {
DataRow dr = dtIds.NewRow();
dr[0] = codigoVenta;
dtIds.Rows.Add(dr);
}
List<SqlParameter>
parameters = new List<SqlParameter>();
parameters.Add(this.CrearParametro(“FechaInicio”, DbType.DateTime,
fechaInicio));
parameters.Add(this.CrearParametro(“FechaFin”, DbType.DateTime,
fechaFinal));
parameters.Add(new SqlParameter("@tablaIds",
dtIds));
return this.Consultar(“spInformeVentas”, parameters);
}
ALGUNAS NOTAS:
·
En caso
de requerir la modificación de un tipo, este se debe eliminar y para luego
recrear.
·
Este
tipo de parámetro se pasa como READONLY puesto que no se pueden realizar
modificaciones sobre este, solamente es posible realizar operaciones de
lectura.

No hay comentarios:
Publicar un comentario