今天在调试程序的时候意外发现一个Bug,折腾了我一个下午!因为在开发时数据库中的数据是手工插入的,所以当时没有出现任何问题,当我把数据都清空后才会出现。因为我天生愚钝,到最后也没有理解到最终的错误原理,不过还是想把解决方案贴出来供大家参考。
查询的sql语句为:select sum(cou) from aa 也就是我要计算aa表中的cou字段之和。
因为懒惰最初我使用的是System.Data.OracleClient.OracleCommand 的ExecuteScalar()直接读取数据。但当我把aa表数据清空之后出现了:“OCI-22060: 参数 [2] 是一个无效或未初始化的数值”的错误。百思不得其解!最后我用System.Data.OracleClient.OracleCommand 的ExecuteReader()读出来,然后在手工去取数据,发现没有问题!
这时候我有点晕了,上网查查,发现有兄弟也遇到过。他的解决方案是把sql改成:select sum(cou) from aa where cou is not null。根据他的提示,我把sql改成select sum(nvl(cou,0)) from aa 一样可以正常运行。通过上面的方法可以意识到写一个健壮的sql语句是多么的重要!
但是我并没有满足于这些,而是跑去查看微软写的源代码,发现System.Data.OracleClient.OracleCommand 的ExecuteScalar()方法调用了
ExecuteScalarInternal方法,里面用到了OCI类。而Oracle自己提供的DLL确是跟我们正常写代码一样使用了
OracleDataReader来读数据。尝试取读懂
ExecuteScalarInternal方法但以失败告终,不知道在博客园是否有高手能赐教一下那~
转载于:https://www.cnblogs.com/zguilin/archive/2007/01/05/612601.html