程序员来理财

理财并不是专家的特殊技能,作为程序员我们也应该加入理财大军!

博客园 首页 新随笔 联系 订阅 管理
      今天在调试程序的时候意外发现一个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方法但以失败告终,不知道在博客园是否有高手能赐教一下那~
posted on 2007-01-05 17:18  理财的程序员  阅读(4215)  评论(3编辑  收藏  举报