首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >十进制算术溢出

十进制算术溢出
EN

Stack Overflow用户
提问于 2012-01-26 22:03:50
回答 3查看 1.2K关注 0票数 3

我只是不能解决这个问题,我正在尝试根据下面的条件对TOTAL的值求和,这会导致ArithmeticOverflow:

代码语言:javascript
复制
var rawData = (from e in Context.TOTALS
                where (e.PAN == "2600000246701" || e.PAN == "2600000246696")
                select e.TOTAL).Sum();

但是,如果我将条件分离为两个单独的查询,它就会起作用:

代码语言:javascript
复制
var rawData1 = (from e in Context.TOTALS
                where (e.PAN == "2600000246696")
                select e.TOTAL).FirstOrDefault();

var rawData2 = (from e in Context.TOTALS
                 where (e.PAN == "2600000246701")
                 select e.TOTAL).FirstOrDefault();

decimal? output = rawData1 + rawData2; //output is 696768.0186M

这个值显然适合小数,我看不出为什么会有任何缩小转换进行。

我正在使用带有Oracle后端的Entity Framework。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-26 22:06:07

在第一种情况下,对数据库执行sum。在后一种情况下,sum是在内存中的客户端.NET中执行的,我怀疑您是在数据库上溢出。由于您没有告诉我们数据库上的数据类型以及PAN是否是TOTALS的惟一标识符,因此我们没有足够的信息来确定这一点,但这绝对是我首先关注的地方。

编辑:这里有一个看不同之处的方法。将您的代码重写为

代码语言:javascript
复制
var rawData = (from e in Context.TOTALS
               where (e.PAN == "2600000246701" || e.PAN == "2600000246696")
               select e.TOTAL
              ).AsEnumerable()
               .Sum();

其中的AsEnumerable强制在内存中计算Sum。如果没有它,将在数据库上执行Sum。在后一种情况下,您知道您得到的是溢出异常。在前一种情况下,我怀疑您不会。如果是这样,这说明问题出在数据库上。

此外,请注意代码的第二个版本不一定等同于代码的第一个版本。您还没有告诉我们,尽管看起来很像,但PAN是否是唯一标识符。如果不是,在第二种情况下,你只需要拉下一个TOTALS实例,它的PAN等于每个给定的PAN。在你的第一个版本中,你是用指定的PAN对所有TOTALS实例求和。所以,这就是为什么我必须稍微小心,只说看起来你在数据库上溢出了,但我们不能确定。

票数 5
EN

Stack Overflow用户

发布于 2012-01-26 22:12:38

如果您确定该值适合小数,则应检查Oracle数据库上的日志。Sum()操作在它上面执行,所以这可能是原因,溢出是在您的数据库上引起的,而不是由.NET框架引起的。

票数 0
EN

Stack Overflow用户

发布于 2012-01-26 22:12:49

我猜您的数据库中有多个e.PAN == "2600000246696"和/或多个e.PAN == "2600000246701"

第一个查询是从数据库中获取所有行,并给出总和。在Oracle中是可以的(不会溢出)。将是一个很大的数字(不适合小数)。

最后两个查询的第一行和第二行各占一行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9019244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档