Wie verwendet man SqlBulkCopyColumnMappingCollection?

.net c# columnmappings sqlbulkcopy

Frage

Ich möchte eine SqlBulkCopy-Methode erstellen, die ich für alle meine Masseneinfügungen verwenden kann, indem bestimmte Daten über die Parameter übergeben werden.

Jetzt muss ich auf einigen von ihnen Mapping machen. Ich weiß nicht, wie ich eine SqlBulkCopyColumnMappingCollection erstellen soll, da dies mein Plan war, in der Mapping-Sammlung zu übergeben und sie zu verwenden. Aber ich weiß nicht, wie ich es machen soll. Ich kann kein neues Objekt daraus machen.

Das habe ich jetzt. Wie kann ich es hinzufügen?

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

Akzeptierte Antwort

Sie müssen keine neue Instanz davon erstellen. Die SqlBulkCopy-Klasse verfügt über eine Eigenschaft, die eine Mapping-Auflistung ist, die Sie verwenden können:

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

BEARBEITEN:

Basierend auf den Kommentaren war das Ziel, eine generische Funktion zu machen, zB das Mapping nicht explizit in der Funktion fest codieren zu müssen. Da die ColumnMappingCollection nicht instanziiert werden kann, würde ich empfehlen, eine List<string> oder ähnliches, die die Spaltenzuordnungsdefinition enthält, an die Funktion zu übergeben. Beispielsweise:

var columnMapping = new List<string>();
columnMapping.Add("field1,field3");
columnMapping.Add("foo,bar");

Dann definieren Sie die Funktion als neu

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


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum