获取SqlBulkCopy以兑现列名称

c# sqlbulkcopy tsql

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

要进行导入,我是以编程方式创建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")));

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

...
Stock decimal(18,4),
Orders decimal(18,4),
Receipts decimal(18,4)
...

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

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

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

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

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

一般承认的答案

来自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上的 “映射列”


热门答案

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

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

在我的情况下,我从一个带有随机顺序列的电子表格加载。这是一个快速修复(表是我的DataTable,'有序顺序',而bulkCopy是SqLBulkCopy对象)

foreach (DataColumn col in table.Columns)
{
    bulkCopy.ColumnMappings.Add(col.ColumnName, col.ColumnName);
}

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




许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因