获取SqlBulkCopy以兑现列名称

Pau*_*lor 20 c# t-sql sqlbulkcopy

我正在将一些基于存储过程的报告例程转换为在C#中运行.一般的想法是使用C#/ .NET Framework的所有奇迹,然后将结果反馈到数据库中.除了我昨天遇到的一个问题并且今天已经解决之外,一切都在游动.

要进行导入,我是以编程方式创建DataTable并使用SqlBulkCopy将结果移动到服务器.

例如

 DataTable detail = new DataTable();
 detail.Columns.Add(new DataColumn("Stock", Type.GetType("System.Decimal")));
 detail.Columns.Add(new DataColumn("Receipts", Type.GetType("System.Decimal")));
 detail.Columns.Add(new DataColumn("Orders", Type.GetType("System.Decimal")));
Run Code Online (Sandbox Code Playgroud)

导入表按以下顺序包含字段.

...
Stock decimal(18,4),
Orders decimal(18,4),
Receipts decimal(18,4)
...
Run Code Online (Sandbox Code Playgroud)

从本质上讲,收据的价值是进入订单,反之亦然.

显然,这是因为SqlBulkCopy似乎没有尊重我告诉它填充的列名 - 它只是按顺序位置.

这对我来说是一个问题,因为我们使用Redgate的SQL Compare.将更改从一个数据库推送到另一个数据库时,不一定保持列的序号位置.(例如,如果您插入一个新列作为第三个序数字段,SQL Compare将在同步时将其附加到表中,使其成为最后一列).

这严重困扰我的解决方案.现在,这些只是"导入"表,因此如果需要,我可以删除并重新创建它们作为任意迁移脚本的一部分,序数位置保持不变.我宁愿不这样做.

有没有办法强制SqlBulkCopy遵守您告诉它填充的列名?

tto*_*sen 23

这是解决这个'错误'的解决方案.

默认是按顺序/位置映射.

就我而言,我是从一个带有随机顺序列的电子表格中加载的.这是一个快速修复(表是我的DataTable,'有序顺序',而bulkCopy是SqLBulkCopy对象)

foreach (DataColumn col in table.Columns)
{
    bulkCopy.ColumnMappings.Add(col.ColumnName, col.ColumnName);
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我只是强迫它按名称重新排序,即使名称是IDENTICAL.


Yah*_*hia 17

来自http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.columnmappings.aspx:

但是,如果列数不同,或者序数位置不一致,则必须使用ColumnMappings确保将数据复制到正确的列中.

有关示例代码,请参阅http://www.sqlteam.com/article/use-sqlbulkcopy-to-quickly-load-data-from-your-client-to-sql-server上的 "映射列" .