.net2.0中SqlBulkCopy批量复制数据出错原因分析!
在项目后台数据库选择SqlServer,进行批量复制数据时,.net2.0中提供的SqlBulkCopy不失为一个好的选择,性能相当可观;最近亲手实验一把,效果不错,大家可以参见http://www.cnblogs.com/webabcd/archive/2007/04/09/705165.html
不过在使用的过程中也遇到让人抓狂的问题,最突出的就是在程序执行中提示" error: 0"错误,然后Sql服务器就被关闭.解决的方法竟然是因为一列的长度搞错了!
问题的起因如下:项目中需要提供针对不同数据源进行数据导入操作,现提供两种:Excel,DBF.
在用Excel为数据源,就可以直接进行数据导入! 但导入数据源用的是DBF,相关的数据信息已经读取到内存,但在执行到bulkCopy.WriteToServer(sourceData);时 就会出现如下错误:
"在从服务器接收结果时发生传输级错误。 (provider: TCP 提供程序, error: 0 - 远程主机强迫关闭了一个现有的连接。)" 然后sqlserver的服务会被停止!
在调试时,数据已经读到DT中,开始估计应该是列映射类型没做好的原因!但没前SqlBulkCopoy没有找到怎样映射列类型;由于SqlBulkCopy的与BCP类似,于是对问题分析的重点转向分析BCP的导入导出,在进行将DBF文件导入SqlServer时,出现了奇怪的问题,数据类型为Datetime的列竟然在导入时不能被识别,必须手动的进行设置,大家可以试一下(vfp文件导入sql2005);
随着对上面问题的分析,没办法,服务被停止,问题太大了,只有老老实实的从头做起,先用最基本的字段测试SqlBulkCopy,DBF文件用简单的一个字段测试,通过,两个字段,也通过,加上DateTime字段,也通过,奇怪了???
在仔细检查原来导入出错的DBF文件,原来是因为当中有一字段类型与数据库中字段长度不相同,改过来之后问题就解决了!
为什么会这样,简单的一个小问题,会出现这么可怕的结果"sql服务被停止",是不是SqlBulkCopy的BUG呢?