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

时间:2009-12-11 10:35:19

标签: .net sql sqlbulkcopy

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

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

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

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

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

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:3)

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

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

SqlBulkCopy类可以采用列映射的集合。那应该是诀窍

答案 1 :(得分:0)

为什么不使用单个sql语句

INSERT INTO YourTable (Col1, Col2,...) SELECT Col1, Col2, .. FROM YourView

如果视图与表格具有相同的列,则可以在 YourTable 之后删除(Col1,Col2,...)并将语句更改为

INSERT INTO YourTable SELECT Col1, Col2, .. FROM YourView

但一般来说,指定要插入的列是一种很好的形式。

然后,您还可以将where子句应用于 YourView 中的选择。

答案 2 :(得分:0)

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

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