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

Posted

技术标签:

【中文标题】使用 SqlBulkCopy 将 DataTable 中的列映射到 SQL 表【英文标题】:Mapping columns in a DataTable to a SQL table with SqlBulkCopy 【发布时间】:2013-07-02 09:41:28 【问题描述】:

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

using (SqlBulkCopy s = new SqlBulkCopy(conn))

    s.DestinationTableName = destination;
    s.WriteToServer(Ads_api_ReportData);

【问题讨论】:

SQL 大容量复制也可以在没有列映射的情况下工作,但是有一个问题是初始化数据表行的顺序 - sql server 期望表中的列顺序相同。因此,在使用 sqlbulkcopy @user2545743 时必须添加列映射 【参考方案1】:

这变得如此普遍,我为此编写了这个助手:

public static void AutoMapColumns(SqlBulkCopy sbc, DataTable dt)

    foreach (DataColumn column in dt.Columns)
    
        sbc.ColumnMappings.Add(column.ColumnName, column.ColumnName);
    

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

【讨论】:

好方法。谢谢 这个小sn-p 为我节省了大量时间!非常感谢。 我自己想出了这个方法,心想“该死,我是个天才!”所以我来SO分享一下。你打败了我!【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

 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

【讨论】:

【参考方案5】:

使用ColumnMappings:

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

【讨论】:

以上是关于使用 SqlBulkCopy 将 DataTable 中的列映射到 SQL 表的主要内容,如果未能解决你的问题,请参考以下文章

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

使用 SQLBulkCopy 插入/更新数据库

如何使用 SqlBulkCopy 并通过 Glimpse 跟踪批量插入

使用 IDatareader 和 SqlBulkCopy 将 Dictionary 元素作为行插入 SQL 表

使用SqlBulkCopy将DataTable中的数据批量插入数据库中

使用 SqlBulkCopy 插入数据时出错