有个C#写的数据采集程序,我们负责把本地mysql数据库的数据周期性(5分钟)往Oracle数据库中插入数据。
我使用的是OracleDataAdapter.update操作上传的,同时使用了OracleCommandBuilder对象。
以前运行正常,这几天对方把表中的字段类型修改了,从varchar改成date了,我这边程序也可处理一下,然后问题来了:
总是出现 “空引用” 错误,由于我本地无法连接Oracle数据库,我只能在本地修改,然后把程序上传到数据库上运行。
程序会同时上传到两个表,我几乎逐句加日志(写日志表),最后得到结论,插入一个表时正常,另一个表时出“空引用”,并且是OracleDataAdapter.update这条语句触发的异常。而写入数据库操作是一个公用的函数,即两次插入调用的同一个函数,参数不一样。但成功的表插入数据少一些100条,失败的插入多一些600条左右(当时并未意识到数据多少的问题)。
最后没有办法,在服务器上安装了vs开发环境,单步跟踪,发觉两个插入全部执行成功,没有什么异常。但正常运行时又出“空引用”异常。
后来改为Relese编译发布,好像运行不出错了。但后来又出错了。
后来不知怎么想到把 UpdateBatchSize 改小一点试试,改成10吧,一试真好使,全部成功,无论Release还是Debug全部成功
至此,已定位出问题所在,把 UpdateBatchSize=100程序恢复正常。
前面单步跟踪时没有出错,是因为调试时未接收外部数据,造成插入的数据行数较少。
原来的代码UpdateBatchSize=0,因为文档上是说系统自动使用最大可用数量,设置为0时在mssql和mysql中都运行很正常。
Oralce在未修改字段类型前不知为何运行正常,这个也不想再研究了。
感觉是OracleDataAdapter.update的一个bug