2014-02-28 24 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

希望这有助于。