我想在SQL Server中插入许多行(从Entity Framework对象构造)。问题是,某些字符串属性的长度超出了数据库中列的长度,这会导致异常,然后所有行都无法插入到数据库中。
所以我想知道如果有办法告诉SqlBulkCopy自动截断任何超长行?当然,在将每个属性超出有限长度之前,我可以检查并对其进行子串,然后将其插入到DataTable中,但这会降低整个程序的速度。
我想在SQL Server中插入许多行(从Entity Framework对象构造)。问题是,某些字符串属性的长度超出了数据库中列的长度,这会导致异常,然后所有行都无法插入到数据库中。
所以我想知道如果有办法告诉SqlBulkCopy自动截断任何超长行?当然,在将每个属性超出有限长度之前,我可以检查并对其进行子串,然后将其插入到DataTable中,但这会降低整个程序的速度。
始终使用暂存/加载表进行批量操作。
然后,您可以在刷新到真实表之前处理,清理,擦除等数据。这包括LEFT,查找,重复数据删除等
所以:
INSERT realtable (..) SELECT LEFT(..), .. FROM Staging
不幸的是,这儿没有 直接 这样做的方式 SqlBulkCopy
。 SQL Bulk Inserts本质上几乎是“哑”,但这就是为什么它们如此之快。它们甚至没有记录(捕获除外) SqlRowsCopied
事件)所以如果出现问题,那么信息就不多了。你在寻找什么会在某种程度上违背这门课程的目的
但是可以有两种可能的方式:
你可以尝试使用 SqlBulkCopyOptions
枚举(传递给 SqlBulkCopy()构造函数)并使用 SqlBulkCopyOptions.CheckConstraints
(在插入数据时检查约束。默认情况下,不检查约束。)。
或者你可以使用 SqlBulkCopyOptions.FireTriggers
枚举(指定时,导致服务器触发插入到数据库中的行的插入触发器。)并在SQL Server中处理异常 Insert Trigger
。
始终使用暂存/加载表进行批量操作。
然后,您可以在刷新到真实表之前处理,清理,擦除等数据。这包括LEFT,查找,重复数据删除等
所以:
INSERT realtable (..) SELECT LEFT(..), .. FROM Staging
不幸的是,这儿没有 直接 这样做的方式 SqlBulkCopy
。 SQL Bulk Inserts本质上几乎是“哑”,但这就是为什么它们如此之快。它们甚至没有记录(捕获除外) SqlRowsCopied
事件)所以如果出现问题,那么信息就不多了。你在寻找什么会在某种程度上违背这门课程的目的
但是可以有两种可能的方式:
你可以尝试使用 SqlBulkCopyOptions
枚举(传递给 SqlBulkCopy()构造函数)并使用 SqlBulkCopyOptions.CheckConstraints
(在插入数据时检查约束。默认情况下,不检查约束。)。
或者你可以使用 SqlBulkCopyOptions.FireTriggers
枚举(指定时,导致服务器触发插入到数据库中的行的插入触发器。)并在SQL Server中处理异常 Insert Trigger
。
尝试在使用SQLBulkCopy类时使用SQLTransaction类