ExecuteScalar的使用

      今天在调试程序的时候意外发现一个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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值