ExecuteScalar 聚合函数 空值引起的OCI-22060错误

noood 2006-12-16 07:53:58
sql语句:select max(e) from A_TEST
字段e值为空,使用pl/sql,toad等工具执行此语句正常
但,当使用cmd.ExecuteScalar执行此sql语句的时候会出现以下错误:
OCI-22060: 参数 [2] 是一个无效或未初始化的数值

错误是在执行sql语句的时候发生的
要怎么样才能捕获到这个错误,避免出现不友好信息。
...全文
527 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
noood 2006-12-18
  • 打赏
  • 举报
回复
to:liutaohero(Lero):
你所讲的方法和上面sp1234老兄讲的是一致的,都是通过首先通过sql语句将null值筛选掉,然后再进行选取。
我这里需要使用ExecuteScalar做一个取单个数据的基本方法,对于这个方法来讲,不可能预见和规定外部传递的Sql语句的形式以及数据库中数据的内容。所以要将所有有可能的错误都进行内部处理。
所以看来还是只有使用DataTable填充了
liujia_0421 2006-12-18
  • 打赏
  • 举报
回复
哦,原来如此...

我用的是VS2005作的测试 ...
noood 2006-12-18
  • 打赏
  • 举报
回复
感谢几位:)
今天测试了下,基本可以肯定是OracleClient命名空间下ExecuteScalar的BUG

现在还使用表A_TEST,对其中字段E使用聚合函数,select max(E) from A_TEST

在.NET Framework1.1下:
使用OracleClient命名空间下ExecuteScalar
数据库表中无值,没有问题
在数据库中有值,无论多少,但是E有空值的情况下就会出现OCI-22060错误

使用Oledb命名空间下的ExecuteScalar函数没有问题

在.NET Framework2.0下一切正常

这样的话在1.1下OracleClient命名空间下ExecuteScalar基本就是废的了,除非你保证所有可能用到聚合函数的字段都不可能有空值。
可怜,只有填充DataTable了
liutaohero 2006-12-18
  • 打赏
  • 举报
回复
select isnull(max(e),0) from A_TEST
为空做O处理
liujia_0421 2006-12-18
  • 打赏
  • 举报
回复
说明一下:

我上面的student表没有记录,为空表...
liujia_0421 2006-12-18
  • 打赏
  • 举报
回复
这个问题确实比较奇怪..

可能正如楼上所说,并非Null值就一定出现...

我今天来做了如下测试:

//测试连接oracle数据库
OracleConnection con = new OracleConnection("data source=oracle;user id=butc;password=butc");
con.Open();
OracleCommand cmd = new OracleCommand("select max(sage) from student", con);
object obj = cmd.ExecuteScalar();
con.Close();

我断点监视了一下,obj最后的值为{},然后我用obj.ToString()后,得到的值为""

没有出现异常...
hchxxzx 2006-12-17
  • 打赏
  • 举报
回复
这个问题我也碰到过,因为没有时间去深究,最后只好采取一个笨办法
直接使用填充datatable的方式来获取GetOneValue值.

这个错误,并非NULL值就一定出现,而是在某种特定的NULL值时出现.
noood 2006-12-17
  • 打赏
  • 举报
回复
多谢liujia_0421(SnowLover)兄。呵呵

使用google,baidu搜索错误:OCI-22060
总共发现两个类似问题,不过都没解决

以前没注意,刚才看了下他们的也都是使用Oracle的访问逻辑访问Oracle数据库
现在想象很有可能是OracleClient命名空间下ExecuteScalar的BUG
明天去也试试
:)
liujia_0421 2006-12-17
  • 打赏
  • 举报
回复
比较奇怪,明天我去公司用Oracle测试一下..
liujia_0421 2006-12-17
  • 打赏
  • 举报
回复
我不知道是不是数据库的问题,我现在的机器上没有Oracle,我用的SqlServer进行的测试:

SqlConnection con = new SqlConnection("server=.;database=student;uid=sa;pwd=0421");
con.Open();
SqlCommand cmd = new SqlCommand("select max(sage) from studentDetails", con);
object obj = cmd.ExecuteScalar();

现在我的数据库中没有一条记录,但我这样用没有一点问题...
noood 2006-12-17
  • 打赏
  • 举报
回复
对了,我是用的是Oracle数据库
操作数据库使用的是OracleClient命名空间下一系列的类
返回的异常类型为:
System.Data.OracleClient.OracleException
noood 2006-12-17
  • 打赏
  • 举报
回复
白天出去转了一圈.....

取空值是没有问题的,例如:字段"E"没有值的时候
select e from A_TEST
完全没有问题

当使用聚合函数(无论max,min等),sql语句变为
select max(e) from A_TEST
就出现问题,使用toad等工具执行此sql也是好的

异常是在执行cmd.ExecuteScalar();的时候发生,还并没有取出来值,返回的错误为:
OCI-22060: 参数 [2] 是一个无效或未初始化的数值
liujia_0421 2006-12-16
  • 打赏
  • 举报
回复
TO:
通过Select语句筛选没问题了。
但是,很难保证传递的每条sql语句都有恰当的非空筛选
就是想看看能不能通过程序来截获这种错误,并给出特殊返回值


即使你取上来的值是空值,即为null,你这样用
object obj=cmd.ExecuteScalar();
是没有任何问题的,因为一个null值赋给一个object对象怎么会有错?
我自己也实际做过测试,以前做过,刚刚又做过...

断点调试一下,看你的原因到底出在哪?

用try..catch捕获一下,看是什么异常....
noood 2006-12-16
  • 打赏
  • 举报
回复
to:vb_vs:
这个问题确实是由于字段“E”为空值引起的

to:sp1234
通过Select语句筛选没问题了。
但是,很难保证传递的每条sql语句都有恰当的非空筛选
就是想看看能不能通过程序来截获这种错误,并给出特殊返回值
  • 打赏
  • 举报
回复
cmd.CommandText="select max(e) from A_TEST where e is not null";
object ret=cmd.ExecuteScalar();
if(ret==null)
.....
else
.....
  • 打赏
  • 举报
回复
select max(e) from A_TEST where e is not null
vb_vs 2006-12-16
  • 打赏
  • 举报
回复
cmd.ExecuteScalar 只返回你的数组中的第一个数值
你去看看你的结果集是不是有NULL值或者只是一个空白
noood 2006-12-16
  • 打赏
  • 举报
回复
想要的效果就是可以怎么进行判断

可是object obj=cmd.ExecuteScalar();就是在cmd.ExecuteScalar()出错的,也就是还没给obj赋值就已经出错,

使用SqlDataReader是可以正常通过的,难道是ExecuteScalar有BUG?
liujia_0421 2006-12-16
  • 打赏
  • 举报
回复
这样抛出的异常属于"SqlException",但是抛出这个异常也不能说明就是因为空值...

可以作个判断:

object obj=cmd.ExecuteScalar();
if(obj==null)
{
//处理
}
else
{
//否则转换一下
string s=Convert.ToString(obj);
}


要么你就用SqlDataReader来做吧...
noood 2006-12-16
  • 打赏
  • 举报
回复
try chtch finally俺知道,不过它只是将错误屏蔽掉了。并且是所有的错误。
如果当E为空值的时候我需要进行一些操作(例如返回Nothing,0等值),这时如果用catch段进行处理的话,显然是不合理的,catch段抓到的错误不仅仅是E为空值。
有没有可以准确捕获这个异常的方法。就像可以使用System.DBNull.Value判断取出的值是否为空值一样。
加载更多回复(2)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧