Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net SqlBulkCopy因字符串转换问题而失败_.net_Sql_Sqlbulkcopy - Fatal编程技术网

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

.net SqlBulkCopy因字符串转换问题而失败,.net,sql,sqlbulkcopy,.net,Sql,Sqlbulkcopy,我有一个视图,它生成许多列,我想将这些列批量加载到另一个具有相同名称列的表中 当我在SqlDataReader上循环并每次使用SqlCommand使用SqlParameters进行插入时,这个过程工作得很好。显然,对于许多100000行来说,这太慢了 我切换到使用SqlBulkCopy,因为它似乎可以工作,因为视图列名和目标db表列名和类型匹配(因为上面的过程可以工作!) 但是,在第一条记录上,它失败,并出现InvalidOperationException,该异常表示“字符串类型的给定值无法转

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

当我在SqlDataReader上循环并每次使用SqlCommand使用SqlParameters进行插入时,这个过程工作得很好。显然,对于许多100000行来说,这太慢了

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

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

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


任何帮助都将不胜感激。

为什么不使用一条sql语句

INSERT INTO YourTable (Col1, Col2,...) SELECT Col1, Col2, .. FROM YourView
如果视图的列与表的列相同,则可以在表后删除(Col1,Col2,…),并将语句更改为

INSERT INTO YourTable SELECT Col1, Col2, .. FROM YourView
但一般来说,指定要插入的列是一种很好的形式


然后,您还可以将where子句应用于SELECTFROMYourView。

为什么不使用一条sql语句

INSERT INTO YourTable (Col1, Col2,...) SELECT Col1, Col2, .. FROM YourView
如果视图的列与表的列相同,则可以在表后删除(Col1,Col2,…),并将语句更改为

INSERT INTO YourTable SELECT Col1, Col2, .. FROM YourView
但一般来说,指定要插入的列是一种很好的形式

然后,您还可以将where子句应用于从视图中选择。请尝试将连接的格式设置为正确的格式(ymd、dmy、mdy等),然后重试。如果日期采用本地化格式,而不是独立于区域设置的格式,则通常会发生此错误

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

尝试将连接设置为正确的格式(ymd、dmy、mdy等),然后重试。如果日期采用本地化格式,而不是独立于区域设置的格式,则通常会发生此错误


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

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

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


SqlBulkCopy类可以获取列映射的集合。这应该可以做到这一点,sqlbulkcopy不会自动在具有相同名称的列之间映射。它假定select将以在目标表中看到的相同顺序返回列

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


SqlBulkCopy类可以获取列映射的集合。这应该可以解决问题

不幸的是,它们位于两个独立的数据库中,并且如上所述,使用SqlCommands运行单个Insert语句的速度很慢。我撤销了负数,因为我意识到在单个数据库配置中这是一个很好的解决方案。我猜它不能跨越多个连接?不过,这应该没有问题,可以使用4部分符号。Server.Database.dbo.table中的SELECCT*在应用程序中如何使用凭据?如果我将连接对象传递到SqlCommand,我看不出这是如何工作的,因为它们可能运行两个不同的域进行身份验证。您是否设置了链接服务器,然后可以使用它。不幸的是,它们位于两个不同的数据库中,并且使用SqlCommand运行单独的Insert语句,如上所述,速度很慢。我取消了负数,因为我意识到在单个数据库配置中这是一个很好的解决方案。我猜它不能跨越多个连接?不过,这应该没有问题,可以使用4部分符号。Server.Database.dbo.table中的SELECCT*在应用程序中如何使用凭据?如果我将连接对象传递到SqlCommand中,我看不出这是如何工作的,因为它们可能正在运行两个不同的域进行身份验证。您是否设置了链接服务器,然后可以使用这个。