我正在將一些基於存儲過程的報告例程轉換爲在C#中運行。總的想法是使用C#/ .NET Framework的所有奇蹟,然後將結果反饋回數據庫。除了昨天遇到的一個問題,今天解決之外,所有事情都一直在順風順水。獲取SqlBulkCopy以兌現列名
要進行導入,我以編程方式創建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比較將只將其附加到同步表上,使其成爲最後一列)。
這嚴重影響了我的解決方案。現在,這些只是'導入'表,所以如果需要的話,我可以刪除並重新創建它們,作爲序號完整的任何遷移腳本的一部分。我寧願不這樣做。
有沒有辦法強制SqlBulkCopy尊重你告訴它填充的列名稱?
P.S.,在Red Gate SQL Compare中有一個名爲「強制列順序」的項目選項,可在新列同步期間保持列的順序相同。 (請注意,這需要對錶格進行刪除和重新構建,但在過去絕對需要時對我很有幫助。) – Funka