我正在将一些基于存储过程的报表程序转换为在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")));
导入表的字段顺序如下。
...
Stock decimal(18,4),
Orders decimal(18,4),
Receipts decimal(18,4)
...
基本上,Receipts的值被放入了Orders中,反之亦然。
显然,这是因为SqlBulkCopy似乎没有遵守我告诉它要填充的列名 - 它只按序数位置进行操作。
对我来说,这是一个问题,因为我们使用Redgate的SQL Compare。在将更改从一个数据库推送到另一个数据库时,列的序数位置不一定保持不变。(例如,如果您将新列插入为第三个序数字段,则SQL Compare将仅在同步表时将其附加到表末尾,即成为最后一列)。
这严重影响了我的解决方案。现在,这些只是“import”表,因此如果需要,我可以作为任何迁移脚本的一部分删除并重新创建它们,并保持顺序位置不变。不过,我宁愿不这样做。
有没有办法强制SqlBulkCopy遵守您要填写的列名?