2014-02-28 46 views
16

我使用SqlBulkCopy將行的集合插入到表中。我忘了在行上設置一個整數值。缺少的列用於引用另一個表,並且這是使用外鍵約束強制執行的。SqlBulkCopy如何繞行外鍵約束?

對於插入的每一行,最終的整數值都是零,並且零沒有標識相關表中的一行。當我將該值修改爲有效值,然後嘗試將其切換回零時,它不會接受它。

所以我的問題是SqlBulkCopy如何管理讓數據庫處於無效狀態?

回答

18

SqlBulkCopy如何管理將數據庫置於無效狀態?

它禁用您要插入到的表上的外鍵。

是的,這是一個可怕的默認值。如果您完全可以負擔​​得起,請務必設置選項CHECK_CONSTRAINTS(或CheckConstraintsSqlBulkCopy)。

它也默認情況下不會觸發對數據一致性同樣糟糕的觸發器。觸發器是有原因的。

+0

但是,當它重新打開外鍵時,爲什麼它不會在此時拋出異常? –

+0

它不會打開它們。外鍵可以在SQL Server中處於「DISABLED」狀態,它是永久的。從這時起,你的FK就不會做任何事情,直到你手動採取行動。 – usr

+1

我沒有手動打開FK,但它阻止了我添加與它相反的新值。所以FK在大容量插入後再次工作。 –

4

默認情況下,CHECK和FOREIGN KEY約束在大容量複製操作過程中被忽略。 SqlBulkCopy是一個託管類,提供類似於SQL Server bcp命令提供的功能。 bcp命令具有-h提示,除非您提供了CHECK_CONSTRAINTS提示CHECK和FOREIGN KEY約束在批量加載期間將被忽略。 Technet文章指出 - http://technet.microsoft.com/en-us/library/ms162802.aspx

類似的SqlBulkCopy類有一個構造函數,它接受SqlBulkCopyOptions枚舉。你將不得不設置CHECKCONSTRAINTS枚舉選項,以確保約束檢查 - http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopyoptions(v=vs.110).aspx

這裏是談論約束檢查控制的一篇文章 - http://technet.microsoft.com/en-us/library/ms186247(v=sql.105).aspx

希望這有助於。