Oracle.ManagedDataAccess.dll折腾了我两天

有个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

 

 

posted @ 2021-04-25 14:53  81  阅读(1478)  评论(0编辑  收藏  举报