使用SqlBulkCopy将DataTable中的列映射到SQL表

问题描述 投票:20回答:5

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

using (SqlBulkCopy s = new SqlBulkCopy(conn))
{
    s.DestinationTableName = destination;
    s.WriteToServer(Ads_api_ReportData);
}
c# sql datatable sqlbulkcopy
5个回答
37
投票

你可能需要一些东西

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

参考:How to use SqlBulkCopyColumnMappingCollection?。 。

塞尔也http://www.codeproject.com/Articles/18418/Transferring-Data-Using-SqlBulkCopy


11
投票

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

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

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


6
投票

知道如果源查询(或表)中的列和目标表具有相同的名称并且顺序完全相同,则可能很有用,因此无需明确写出映射,因为SqlBulkCopy将创建具有此默认顺序的默认映射。


0
投票

使用ColumnMappings

s.ColumnMappings.Add("Name", "Name");
s.ColumnMappings.Add("Address", "Address");

0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.