.net在读取oracle数据库时用read()方法读到最后条一记录时抛出ORA-01002的异常

.net在读取oracle数据库时用read()方法时,当读到最后一条记录时,按常理read()返回的值是false,但此时却抛出ORA-01002的异常,在debug的时侯有时不会再现,如果直接运行,几乎每次都再现,只XP系统下会再现,但若同样代码换另一个xp系统执行就不会出错,确认过环境变量Path里面几乎都一样
请教高手,这个是什么原因造成的,如何解决,谢谢
在read()的循环语句里有对数据库的插入处理,而且是在循环外面commit的,会有影响么?

大概知道原因了,是因为查询语句中有锁表的操作:for update wait的语句的关系,去掉就不会出现这个bug了

  ORA-01002异常,做以下检查:
  1、是否从指针读取数据,即使是在最后一行已经被检索之后,并且返回ora 1403错误信息?如果是的话,在最后一行被检索之后不要再进行读取。
  2、指针是否是在for update 子句中公开了?如果是的话,那么如果commit语句是在循环里面,那么在commit之后读取就会返回这个错误信息。不要在读取循环中使用commit。

  3、是否重新绑定了任意的占位符变量?然后在再次执行这个语句之前进行读取,即返回这个错误信息。这样的话,需要做的事情就是再次执行它,在重新绑定了and之后再读取。
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-11-25
oracle数据不是和sqlserver一样的~~ 关键是看他目录里面的配置ini 以及几个ora文件。。环境变量只是拿来看能不能正常运行打开他的服务,查看他的数据,如果你能够用pl sql直接在oracle查数据,那就是你的C#代码有问题了本回答被网友采纳
第2个回答  2012-07-13
原因可能有这几点:
1)你是否从指针读取数据,即使是在最后一行已经被检索之后,并且返回ORA 1403错误信息?如果是的话,在最后一行被检索之后不要再进行读取。
  2)指针是否是在FOR UPDATE 子句中公开了?如果是的话,那么如果COMMIT语句是在循环里面,那么在commit之后读取就会返回这个错误信息。不要在读取循环中使用commit。
  3)你是否重新绑定了任意的占位符变量?然后在再次执行这个语句之前进行读取,即返回这个错误信息。这样的话,你需要做的事情就是再次执行它, 在重新绑定了AND之后再读取。
第3个回答  2012-07-12
有可能两个系统的Oracle的client不一样。
那就不用read方法,直接用DataSet读取数据,再循环读取数据好了。追问

确认过了都是oracle11g,但按常理两种方法都应该可以,只是如果可能是环境的问题的话能不改代码最好,维护项目。。。

追答

虽然都是11g,但Oracle客户端也可以配置的,配置可以不一样的,而且配置不是想java在path那里设置的,而是在注册表里设置的,需要对比注册表。
确定问题的最好办法是做一台虚拟机进行测试。
11g的Oracle可不可以卸载得很干净,如果不行请重新安装系统。

追问

做虚拟机很麻烦吧?没做过~~
如果要是比较注册表该如何比较呢?

追答

上次说得有问题不是对比注册表,
是对比/etc/profile ,sqlnet.ora ,tnsnames.ora 文件。
最好还是重装系统吧

追问

文件应该是没问题的,因为这个bug有时也不再现,可以正常运行的,也行是oracle客户端的问题,唉!~要是没办法的话就只能先卸了重装试试了~
谢谢了~