Десятичное арифметическое переполнение - PullRequest
3 голосов
/ 26 января 2012

Я просто не могу решить это, я пытаюсь суммировать значение ВСЕГО на основе условия ниже, что вызывает ArithmeticOverflow:

var rawData = (from e in Context.TOTALS
                where (e.PAN == "2600000246701" || e.PAN == "2600000246696")
                select e.TOTAL).Sum();

Однако, если я отделю условие вработает два отдельных запроса:

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

Значение явно вписывается в десятичное число, и я не понимаю, почему будут происходить какие-либо сужающие преобразования.

Я использую EntityКаркас с бэкэндом Oracle.

Ответы [ 3 ]

5 голосов
/ 26 января 2012

В первом случае сумма выполняется в базе данных.В последнем случае сумма выполняется в памяти, на стороне клиента, в .NET.Я подозреваю, что вы переполнены в базе данных.Поскольку вы не указали нам тип данных в базе данных и то, является ли PAN уникальным идентификатором для TOTALS, у нас недостаточно информации, чтобы точно это сделать, но я определенно сосредоточусь на этом.Внимание в первую очередь.

Редактировать: Вот способ увидеть разницу.Перепишите ваш код как

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 с.В вашей первой версии вы суммируете по всем экземплярам TOTALS с указанными PAN с.Вот почему я должен быть немного осторожнее и только сказать, что похоже, что вы переполняете базу данных, но мы не можем сказать наверняка.

0 голосов
/ 26 января 2012

Полагаю, у вас в базе данных более одного e.PAN == "2600000246696" и / или более одного e.PAN == "2600000246701"

Первые запросы получают все строки из базы данных и дают вам сумму.В Oracle все в порядке (не переполнится).Было бы большим числом (которое не вписывается в десятичное число).

Последние два запроса занимают одну строку для первой и одну строку для второй.

0 голосов
/ 26 января 2012

если вы уверены, что значение соответствует десятичному числу, вам следует проверить журнал в вашей базе данных Oracle.Операция Sum () выполняется на нем, поэтому, возможно, это является причиной, а переполнение вызвано в вашей базе данных, а не в .NET Framework.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...