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

37

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

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

1
SQL批量复制即使没有列映射也可以工作,但是有一个问题,就是数据表行初始化的顺序 - SQL服务器期望表中具有相同的列顺序。因此,在使用sqlbulkcopy时必须添加列映射。 - dhinesh
6个回答

50
你可能需要类似的东西。
 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


41
这个任务变得如此普遍,以至于我为它编写了这个帮助程序:

这项任务变得如此普遍,以至于我为其编写了这个辅助工具:

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

自己创建DataTable时,我将其列命名与SQL表相同。
Translated: 在创建DataTable的过程中,我将其列命名与对应的SQL表相同。

很棒的方法。谢谢。 - Darthchai
这个小片段节省了我大量的时间!非常感谢。 - Dave Morris
2
我刚刚自己想出了这个方法,心想“我真是个天才!”所以我来到SO分享它。没想到你比我更快! - Michael Glass

14

如果源查询(或表)和目标表中的列具有相同的名称完全相同的顺序,那么就可以知道以下信息将很有用:无需显式编写映射,因为SqlBulkCopy将使用此默认顺序创建默认映射。


1
是的,但在这种情况下,想法是将除标识列以外的所有列进行1:1映射... - David V. Corbin

2
使用 ColumnMappings
s.ColumnMappings.Add("Name", "Name");
s.ColumnMappings.Add("Address", "Address");

1

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

SQLBulkCopy非常严格地要求您考虑添加到ColumnMappings集合中的两个列的数据类型。


0
您可以使用以下代码。
                using (OleDbConnection con = new OleDbConnection(excelCS))
                {
                    OleDbCommand cmd = new OleDbCommand("select * from [Sheet1$]", con);
                    con.Open();
                    // Create DbDataReader to Data Worksheet  
                    DbDataReader dr = cmd.ExecuteReader();
                    // SQL Server Connection String  
                    //string CS = ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString;
                    string CS = objCommon.TestConnection;
                    // Bulk Copy to SQL Server   
                    SqlBulkCopy bulkInsert = new SqlBulkCopy(CS);

                    bulkInsert.ColumnMappings.Add("Kcode", "Kcode");
                    bulkInsert.ColumnMappings.Add("MDMCode", "MDMCode");

                    bulkInsert.DestinationTableName = "tbl_MDMKcodeMapping";
                    bulkInsert.WriteToServer(dr);
                    
                    lblMessage.Text = "Your file uploaded successfully";
                    lblMessage.ForeColor = System.Drawing.Color.Green;
                }

请注意,在

  bulkInsert.ColumnMappings.Add("Kcode", "Kcode");

第一个参数应该是您的Excel列名,第二个参数应该是您的SQL表列名


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接