32

我想知道在将数据添加到数据库之前如何将数据库表中的列映射到 c# 中的数据表。

using (SqlBulkCopy s = new SqlBulkCopy(conn))
{
    s.DestinationTableName = destination;
    s.WriteToServer(Ads_api_ReportData);
}
4

5 回答 5

46

你可能需要一些类似的东西

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

参考:如何使用 SqlBulkCopyColumnMappingCollection? . .

另请参阅http://www.codeproject.com/Articles/18418/Transferring-Data-Using-SqlBulkCopy

于 2013-07-04T11:47:45.600 回答
34

这成为一项常见的任务,我为此编写了这个助手:

public static void AutoMapColumns(SqlBulkCopy sbc, DataTable dt)
{
    foreach (DataColumn column in dt.Columns)
    {
        sbc.ColumnMappings.Add(column.ColumnName, column.ColumnName);
    }
}

由于我是DataTable自己创建的,因此我将其列命名为与 SQL 表相同。

于 2017-09-06T20:47:42.590 回答
12

知道如果源查询(或表)和目标表中的列具有相同的名称并且顺序完全相同,则不需要显式写出映射,因为这SqlBulkCopy将创建一个具有此默认顺序的默认映射。

于 2015-08-09T22:44:18.893 回答
1

使用ColumnMappings

s.ColumnMappings.Add("Name", "Name");
s.ColumnMappings.Add("Address", "Address");
于 2013-07-04T11:46:57.780 回答
0

Add on ColumnMappings 集合的方法允许您将列从源表映射到目标表。ColumnMappings.Add 方法接受四种不同的方式来映射列。

SQLBulkCopy 对在将其添加到 ColumnMappings 集合时必须考虑的两列的数据类型非常严格

于 2013-07-08T17:30:24.207 回答