SqlBulkCopy因字符串转换问题而失败

.net sql sqlbulkcopy

我有一个视图,它生成了许多列,我想将它们批量加载到另一个具有相同名称列的表中。

当我循环遍历SqlDataReader并且每次使用SqlCommand使用SqlParameters进行插入时,此过程运行正常。显然,对于许多100000行,这太慢了。

我切换到使用SqlBulkCopy,因为它似乎可以工作,因为视图列名和目标数据库表列名和类型匹配(因为上面的过程工作!)。

但是,在第一个记录上,它失败并出现InvalidOperationException,指出“String类型的给定值无法转换为指定目标列的smalldatetime类型”。第一行中只有一个日期列,其值为NULL。

视图仅返回列的子集,但它不是可以为空的。

任何帮助,将不胜感激。

一般承认的答案

sqlbulkcopy不会在具有相同名称的列之间自动映射。它假定您的select将按照它在目标表中看到的顺序返回列。

因此,如果目标表中有7列,并且视图返回5,则会尝试将这5列放在目标表的前5列中。

SqlBulkCopy类可以采用列映射的集合。这应该够了吧


热门答案

尝试将SET DATEFORMAT设置为正确的格式(ymd,dmy,mdy,...)以进行连接并重试。如果您有本地化格式的日期而不是与语言环境无关的格式,则通常会发生此错误。

至于在一个插入中执行所有操作,建议不要这样做,因为这被认为是一个长时间运行的事务而不是批量插入操作。



许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow