asp.net使用oraclehelper访问oracle的程序包中的存储过程,在存储过程中的SQL中已经都加上round(x,2),在pl/sql develop中测试返回的结果集都是2位小数,但是使用oracledatareader返回数据时总是报OCI-22053溢出错误? 随便插了两个变量赋值发现返回的都是有很多位小数的数据,请问是什么原因?
SQL语句部分: 
select round(i.ivc_net_price,2) ivc_net_price, 
      round(i.ivc_net_price_with_tax,2) ivc_net_price_with_tax, 
      round(sum(i.curr_net_amt),2) curr_net_amt, 
      round(sum(i.curr_tax_amt),2) curr_tax_amt, 
      round(sum(i.curr_gross_amt),2) curr_gross_amt 
from CUSTOMER_ORDER_INV_ITEM i 
group by round(i.ivc_net_price,2),round(i.ivc_net_price_with_tax,2) ASP.NET程序部分: 
using (OracleDataReader rdr = OracleHelper.ExecuteReader(OracleHelper.ConnectionStringLocalTransaction, CommandType.StoredProcedure, SP_SALES_INFO_BY_SALES_GROUP, parms)) 
            { 
                while (rdr.Read()) 
                { 
                    SalesAmountInfo salesinfo = new SalesAmountInfo(); 
                    salesinfo.Contract = contract; 
                    salesinfo.StartDate = startDate; 
                    salesinfo.EndDate = endDate; 
                    salesinfo.IvcNetPrice = System.Convert.ToDecimal(rdr[0]); 
                    //decimal y = System.Convert.ToDecimal(rdr[0]); 
                    salesinfo.IvcNetPriceWithTax = System.Convert.ToDecimal(rdr[1]); 
                    salesinfo.CurrNetAmt = System.Convert.ToDecimal(rdr[2]); 
                    salesinfo.CurrTaxAmt = System.Convert.ToDecimal(rdr[3]); 
                    salesinfo.CurrGrossAmt = System.Convert.ToDecimal(rdr[4]); 
                    salesInfoBySalesGroup.Add(salesinfo); 
                } 
            } 
那个y总是很长小数位 的数值,请问是为什么?谢谢~~

解决方案 »

  1.   

    这个我认为是asp.net控件的属性你没有设置好,不同的字段设置属性不样的你可以用代码跟踪一个它返回的是什么数据?有多少位小数>
      

  2.   

    Oracle中使用round(x,2)时,总是输出不大于两位的小数。
    Oracle应该没问题,同意是.net中的控件属性设置(缺省)问题。
      

  3.   

    是System.Convert.ToDecimal(rdr[1])这一步操作报错,是rdr[1]超出.net的数据精度了?我觉得oracle中查询出的结果没错,返回到rdr中的数据就应该是2位小数啊,那就不应该出现这种错误啊
      

  4.   

    select round(i.ivc_net_price,2) ivc_net_price, 
          round(i.ivc_net_price_with_tax,2) ivc_net_price_with_tax, 
          round(sum(i.curr_net_amt),2) curr_net_amt, 
          round(sum(i.curr_tax_amt),2) curr_tax_amt, 
          round(sum(i.curr_gross_amt),2) curr_gross_amt 
    from CUSTOMER_ORDER_INV_ITEM i 
    group by round(i.ivc_net_price,2),round(i.ivc_net_price_with_tax,2) 
    我觉得这个语句有问题?
    round(i.ivc_net_price,2),round(i.ivc_net_price_with_tax,2)p是用这两个字段分组的,他们存在四舍五入的问题,他们有记录双精度时,可能还存在微小的差别,所以产生错误;
    你把这两个字段的内容转换为字符串,然后再分组看看
      

  5.   

    --1.对如下代码可分行进行注释,以便调试和发现问题:   salesinfo.IvcNetPrice = System.Convert.ToDecimal(rdr[0]);          
       salesinfo.IvcNetPriceWithTax = System.Convert.ToDecimal(rdr[1]); 
       salesinfo.CurrNetAmt = System.Convert.ToDecimal(rdr[2]); 
       salesinfo.CurrTaxAmt = System.Convert.ToDecimal(rdr[3]); 
       salesinfo.CurrGrossAmt = System.Convert.ToDecimal(rdr[4]); --2.查阅一下asp能否控制字段的输出样式(长度)。
      

  6.   


    已分行注释过,就是rdr[1]有问题,但是后台sql取数显示rdr[1]是和rdr[0]一样的精度。不用asp.net控制输出样式,在做ToDecimal操作时出错,已使用过ToString,还是报溢出错误……胸闷了好几天了~~