Inserciones masivas de Base de Datos en C#

Hace un tiempo tuve que modificar un programa que recibía muchos datos y los iba insertando en la base de datos, lo cual constituía un cuello de botella por la gran cantidad de inserciones realizadas, con lo cual se nos ocurrió agrupar en bloques esas inserciones y realizarlas por lotes, cada cierto tiempo, de forma transaccional. Este fue el resultado, por si a alguien le interesa:

SqlConnection connection = null;
int ret = 1;
try
{
//Nos conectamos a la BD
connection = new SqlConnection(ConsultasBd.ConnString);

//Insertamos en nuestro dataTable los valores que posteriormente vamos a volcar de golpe
dtHistoricos.Rows.Add(new object[] { dtHistoricos.Rows.Count, eq.IdVehiculo, pos.EstadoNavegacion, pos.PrecisionPos, pos.Latitud, pos.Longitud, pos.Heading, pos.VelocidadGiro, pos.SOG, pos.COG, pos.Fecha, pos.IDMensaje, pos.IDEstacionBase, eq.IdDestino });

//hacemos lotes cada ‘numregistros’ filas
if (dtHistoricos.Rows.Count > numregistros)
{
//vamos a volcar a la base de datos un lote:
//conectamos y activamos los triggers que se vean afectados por la inserción masiva
SqlBulkCopy bcp = new SqlBulkCopy(ConsultasBd.ConnString, SqlBulkCopyOptions.FireTriggers);

//el tamaño del lote será de ‘batch’
bcp.BatchSize = batch;
//bcp.NotifyAfter = numRegistros;
bcp.DestinationTableName = “PNC_HIS_AISPosiciones”;
//bcp.SqlRowsCopied += new SqlRowsCopiedEventHandler(OnSqlRowsCopied);

// Realizo la copia masiva
if (connection.State == ConnectionState.Closed)
connection.Open();

//volcamos a la base de datos el lote completito
bcp.WriteToServer(dtHistoricos);
dtHistoricos.Rows.Clear();
}
}
catch (Exception e)
{
//Escribir información en fichero de log
Log.Write(e.Message + ” en: ” + e.StackTrace, true);
ret = -1;
dtHistoricos.Rows.Clear();
}
finally
{
connection.Close();
}

————————————————————

Donde la función que crea la estructura del DataTable es:

————————————————————

private static DataTable crearTablaHistoricos()
{
//Crea la estructura de un DataTable con la de la tabla PNC_HIS_AISPosiciones

DataTable dt = new DataTable();
DataColumn dc;
try
{
dc = new DataColumn();
dc.DataType = System.Type.GetType(“System.Int32”);
dc.ColumnName = “iIdPosicion”;
dc.Unique = true;
dt.Columns.Add(dc);

dc = new DataColumn();
dc.DataType = System.Type.GetType(“System.Int32”);
dc.ColumnName = “iIdVehiculo”;
dc.Unique = false;
dt.Columns.Add(dc);

dc = new DataColumn();
dc.DataType = System.Type.GetType(“System.Int32”);
dc.ColumnName = “iEstadoNavegacion”;
dc.Unique = false;
dt.Columns.Add(dc);

dc = new DataColumn();
dc.DataType = System.Type.GetType(“System.Boolean”);
dc.ColumnName = “bPrecisionPosicion”;
dc.Unique = false;
dt.Columns.Add(dc);

dc = new DataColumn();
dc.DataType = System.Type.GetType(“System.Double”);
dc.ColumnName = “dLatitud”;
dc.Unique = false;
dt.Columns.Add(dc);

dc = new DataColumn();
dc.DataType = System.Type.GetType(“System.Double”);
dc.ColumnName = “dLongitud”;
dc.Unique = false;
dt.Columns.Add(dc);

dc = new DataColumn();
dc.DataType = System.Type.GetType(“System.Int32”);
dc.ColumnName = “iTrueHeading”;
dc.Unique = false;
dt.Columns.Add(dc);

dc = new DataColumn();
dc.DataType = System.Type.GetType(“System.Int32”);
dc.ColumnName = “iVelocidadGiro”;
dc.Unique = false;
dt.Columns.Add(dc);

dc = new DataColumn();
dc.DataType = System.Type.GetType(“System.Int32”);
dc.ColumnName = “iSOG”;
dc.Unique = false;
dt.Columns.Add(dc);

dc = new DataColumn();
dc.DataType = System.Type.GetType(“System.Int32”);
dc.ColumnName = “iCOG”;
dc.Unique = false;
dt.Columns.Add(dc);

dc = new DataColumn();
dc.DataType = System.Type.GetType(“System.DateTime”);
dc.ColumnName = “dtFecha”;
dc.Unique = false;
dt.Columns.Add(dc);

dc = new DataColumn();
dc.DataType = System.Type.GetType(“System.Int32”);
dc.ColumnName = “iIdMensaje”;
dc.Unique = false;
dt.Columns.Add(dc);

dc = new DataColumn();
dc.DataType = System.Type.GetType(“System.Int32”);
dc.ColumnName = “iIdBase”;
dc.Unique = false;
dt.Columns.Add(dc);

dc = new DataColumn();
dc.DataType = System.Type.GetType(“System.Int32”);
dc.ColumnName = “iIdDestino”;
dc.Unique = false;
dt.Columns.Add(dc);
//retornamos el datatable creado
return dt;
}
catch (Exception eo)
{
Log.Write(“Ocurrió un error al crear la ESTRUCTURA del DataTable para la inserción masiva. Error “+eo.Message+” Traza: “+eo.StackTrace,true);
return null;
}
}

Las líneas comentadas no son necesarias. Tal cual está escrito el código se va construyendo un DataTable con los datos que se van recibiendo, y cuando esta estructura de datos alcanza cierto tamaño, se vuelca su contenido en la base de datos.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s