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总是很长小数位 的数值,请问是为什么?谢谢~~
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总是很长小数位 的数值,请问是为什么?谢谢~~
Oracle应该没问题,同意是.net中的控件属性设置(缺省)问题。
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是用这两个字段分组的,他们存在四舍五入的问题,他们有记录双精度时,可能还存在微小的差别,所以产生错误;
你把这两个字段的内容转换为字符串,然后再分组看看
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能否控制字段的输出样式(长度)。
已分行注释过,就是rdr[1]有问题,但是后台sql取数显示rdr[1]是和rdr[0]一样的精度。不用asp.net控制输出样式,在做ToDecimal操作时出错,已使用过ToString,还是报溢出错误……胸闷了好几天了~~