Quiero hacer un método SqlBulkCopy que pueda usar para todos mis inserciones masivas pasando datos específicos a través de los parámetros.
Ahora necesito hacer mapeo en algunos de ellos. No sé cómo hacer un SqlBulkCopyColumnMappingCollection ya que ese era mi plan para pasar la colección de mapeo y usarla. Sin embargo no sé cómo hacerlo. No puedo hacer un nuevo objeto de ello.
Esto es lo que tengo ahora. ¿Cómo puedo agregarlo?
public void BatchBulkCopy(DataTable dataTable, string DestinationTbl, int batchSize)
{
// Get the DataTable
DataTable dtInsertRows = dataTable;
using (SqlBulkCopy sbc = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.KeepIdentity))
{
sbc.DestinationTableName = DestinationTbl;
// Number of records to be processed in one go
sbc.BatchSize = batchSize;
// Finally write to server
sbc.WriteToServer(dtInsertRows);
}
}
No es necesario que cree una nueva instancia de ella; la clase SqlBulkCopy tiene una propiedad que es una colección de mapeo que puede usar:
public void BatchBulkCopy(DataTable dataTable, string DestinationTbl, int batchSize)
{
// Get the DataTable
DataTable dtInsertRows = dataTable;
using (SqlBulkCopy sbc = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.KeepIdentity))
{
sbc.DestinationTableName = DestinationTbl;
// Number of records to be processed in one go
sbc.BatchSize = batchSize;
// Add your column mappings here
sbc.ColumnMappings.Add("field1","field3");
sbc.ColumnMappings.Add("foo","bar");
// Finally write to server
sbc.WriteToServer(dtInsertRows);
}
}
EDITAR:
Basado en los comentarios, el objetivo era hacer una función genérica, por ejemplo, no tener que codificar la asignación explícitamente en la función. Debido a que ColumnMappingCollection no se puede crear una instancia, recomendaría pasar una List<string>
o similar que contenga la definición de asignación de columna en la función. Por ejemplo:
var columnMapping = new List<string>();
columnMapping.Add("field1,field3");
columnMapping.Add("foo,bar");
A continuación, vuelva a definir la función como
public void BatchBulkCopy(DataTable dataTable, string DestinationTbl, int batchSize, List<string> columnMapping)
{
// Get the DataTable
DataTable dtInsertRows = dataTable;
using (SqlBulkCopy sbc = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.KeepIdentity))
{
sbc.DestinationTableName = DestinationTbl;
// Number of records to be processed in one go
sbc.BatchSize = batchSize;
// Add your column mappings here
foreach(var mapping in columnMapping)
{
var split = mapping.Split(new[] { ',' });
sbc.ColumnMappings.Add(split.First(), split.Last());
}
// Finally write to server
sbc.WriteToServer(dtInsertRows);
}
}