OracleException: OCI-22053: 溢出错误

54 篇文章 0 订阅
36 篇文章 0 订阅

OracleException: OCI-22053: 溢出错误

本人近期遇到此问题,整理网上文摘,并进行相关处理的记录

 

该代码的主要功能是使用OracleDataAdapter填充DataSet。查了网上相关的内容后,得知是数字类型的字段的位数过多造成的。
对于数字类型的字段,填充DataSet的时候会调用GetValues方法,数字类型的值将从OracleNumber类型转换成System.Decimal类型,后者的取值范围比前者小,所以可能会引发溢出错误。解决的方法是不使用Fill方法填充DataSet,而是直接调用OracleDataReader.GetOracleValues。

 

原因分析

Oracle 数值数据类型最多可存储 38 个字节的精度。当将 Oracle 数值转换为公共语言运行库数据类型时,小数点后边的位数可能过多,这会导致此错误。

解决方法:

使用round()函数:
例如:select min(pval),max(pval),round(avg(pval),5) from hvm_data_dga .

round(avg(pval),5) 使数值小数点后按照四舍五入保留5位。

 

 

原来的代码类似于
Comander.CommandText = "SELECT 1/3 FROM DUAL ";
结果返回的小数点后位数太多,造成了dotnet转换后Oracle OCI-22053错误。
 
后来转换为字符型,改成 SELECT TO_CHAR(1/3) FROM DUAL这样就可以
或者把ROUND(1/3,2) 把小数位数限制下也可以。
个人小结
SELECT TO_CHAR(字段名)的方法较好,已经解决
使用ORACLE自带的.NET开发包
.NET开发中使用微软的System.Data.OracleClients访问ORACLE数据库时,
如果某字段的精度超出.NET的数据精度,就会发生OCI-22053错误。

在BAIDU上搜索了一番,只发现一个有限的解决方法:
http://www.dotnet247.com/247reference/msgs/50/252139.aspx
http://dev.csdn.net/article/73869.shtm
http://www.itpub.net/showthread.php?threadid=337574&pagenumber=

如果用fill方法的话,仍然不能解决问题。
经过几天的试验和查找,我找到一个彻底的解决方法:就是使用ORACLE自带的.NET开发包:
Oracle Data Provider For .NET 9.2.0.4.01 (OraWin9204.exe)
这个软件包在ORACLE网站上有免费下载。

Oracle.DataAccess.Client.OracleConnection oracleConnection1 = new Oracle.DataAccess.Client.OracleConnection();
oracleConnection1.ConnectionString =Boco.Common.Lib.Public.Util.ReadConfigString("ConnectionStringNrmdb");
Oracle.DataAccess.Client.OracleDataAdapter da1=new Oracle.DataAccess.Client.OracleDataAdapter(查询语句,oracleConnection1 );
da1.SafeMapping.Add("*",typeof(System.String));
DataSet ds1=new DataSet();
da1.Fill(ds1,"Data");

关键在于红色那一句,在内部对所有字段作了映射,把任意类型的字段都映射为字符串类型。
如果不想把所有字段都作映射,可以选择特定的字段作:
da1.SafeMapping.Add(字段名1,typeof(System.String));
da1.SafeMapping.Add(字段名2,typeof(System.String));
……

个人小结
该控件,网上文章较少,且以前微软写过此控件有漏洞,C#中是否有对应的帮助未验过,故未继续试验
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值