lunes, 3 de agosto de 2015

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 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.