¿Cómo usar SqlBulkCopyColumnMappingCollection?

.net c# columnmappings sqlbulkcopy

Pregunta

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);
    }
}

Respuesta aceptada

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);
    }
}


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué