Voglio creare un metodo SqlBulkCopy che possa essere utilizzato per tutti i miei inserimenti di massa passando dati specifici attraverso i parametri.
Ora ho bisogno di fare la mappatura su alcuni di loro. Non so come creare un oggetto SqlBulkCopyColumnMappingCollection poiché questo era il mio piano per passare nella raccolta di mappe e usarlo. Tuttavia non so come farlo. Non posso farne un nuovo oggetto.
Questo è quello che ho adesso. Come posso aggiungerlo fare mappatura metterlo in mano?
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);
}
}
Non è necessario creare una nuova istanza di esso - la classe SqlBulkCopy ha una proprietà che è una raccolta di mappe che è possibile utilizzare:
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);
}
}
MODIFICARE:
In base ai commenti, l'obiettivo era di creare una funzione generica, ad esempio non dover codificare esplicitamente il mapping nella funzione. Poiché non è possibile creare un'istanza di ColumnMappingCollection, si consiglia di passare un List<string>
o simile che contenga la definizione del mapping di colonne nella funzione. Per esempio:
var columnMapping = new List<string>();
columnMapping.Add("field1,field3");
columnMapping.Add("foo,bar");
Quindi ridefinire la funzione come
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);
}
}