2010-06-04 7 views
11

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.Wie wird SqlBulkCopyColumnMappingCollection verwendet?

Jetzt muss ich auf einige von ihnen Mapping tun. 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.

Dies ist, was ich jetzt habe. 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); 
    } 
} 
+0

Sie nicht SqlBulkCopyColumnMappingCollection zu bulkCopy.ColumnMappings wie später nur erhalten hinzufügen kann. Sie können die Add-Methode von bulkCopy.ColumnMappings verwenden, um Zuordnungen einzeln hinzuzufügen. – iTSrAVIE

Antwort

20

Sie benötigen keine neue Instanz davon zu schaffen - die SqlBulkCopy Klasse hat eine Eigenschaft, die eine Abbildung Sammlung, 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); 
    }  
} 

EDIT:

Basierend auf den Kommentaren war das Ziel, eine generische Funktion, z muss das Mapping nicht explizit in der Funktion fest codieren. Da die ColumnMappingCollection nicht instanziiert werden kann, würde ich empfehlen, eine List<string> oder eine ähnliche Datei, die die Spaltenzuordnungsdefinition enthält, an die Funktion zu übergeben. Zum Beispiel:

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

Dann neu definieren die Funktion als

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

Ich bin mir dessen jedoch bewusst. Jetzt haben Sie diese Methode nur an eine einzige Tabelle gebunden (es sei denn, ich habe jede einzelne Tabelle mit den gleichen Spaltennamen). Ich versuche hier eine generische Methode zu erstellen, die ich in jeder Tabelle weitergeben kann und eine sqlbulkcopy mache. Wenn ich also 5 verschiedene sqlbulkcopy-Einfügungen brauche, habe ich nicht 5 dieser Methoden mit fast demselben Code außer dem Mapping. – chobo2

+0

Da die Funktion generisch sein sollte und Sie die ColumnMappingCollection nicht instanziieren können, würde ich empfehlen, eine Darstellung des Mappings zu übergeben - siehe oben. – goric

+3

Ja, das ist die Art und Weise, wie ich es herausgefunden habe, ich erwarte nur eine Liste von ColumnMappings anstelle von Strings. – chobo2

Verwandte Themen