Возможные причины ошибки: «Ошибка приведения к типу значения« Десятичное число », поскольку материализованное значение равно нулю» - PullRequest
1 голос
/ 18 апреля 2011

Я получаю сообщение об ошибках из производственной системы. У меня нет свободного доступа к производственной системе. Я получу все данные, которые мне нужны для этого в должное время, но я пытаюсь ускорить процесс решения этой проблемы. Я пытаюсь устранить как можно больше догадок.

Ошибка, которую я получаю это:

Расширенные свойства: исключение - System.InvalidOperationException: приведение к типу значения 'Десятичный' не удалось потому что материализованная ценность ноль. Либо общий тип результата параметр или запрос должен использовать обнуляемый тип.

Код ошибки:

IQueryable<AccountStatusModel> result = from d in Context.Debtors
    where // Condition here
    select new AccountStatusModel
    {
         // All of the below are decimal in the AccountStatusModel
         // and all of them are decimal NOT NULL in the database
         NotYetDue = d.sometable.dbcurrent,
         DueThisMonth = d.sometable.dbprd1bal,
         Overdue = d.sometable.dbprd2bal
                + d.sometable.dbprd3bal
                + d.sometable.dbprd4bal
                + d.sometable.dbprd5bal
                + d.sometable.dbprd6bal,
         PaymentRecievedNotAllocated = d.sometable.dbunalloc,
         OutstandingOrders = d.dmoutordval ?? 0,
         TotalBalance = d.sometable.dbcurrent
                + d.sometable.dbprd1bal
                + d.sometable.dbprd2bal
                + d.sometable.dbprd3bal
                + d.sometable.dbprd4bal
                + d.sometable.dbprd5bal
                + d.sometable.dbprd6bal
                + d.sometable.dbunalloc
                + (d.dmoutordval ?? 0),
         CreditLimit = d.dmcredlim,
         LastPayment = d.dmvallastpaid,

         // Some other properties here
         // ....
    };

Прежде чем кто-то прокомментирует имена полей, предположим, что это поддельные имена. знак равно Обратите внимание, что все запрашиваемые поля базы данных НЕ имеют значение NULL.

Я не могу воспроизвести эту ошибку в среде разработчика.

Я думаю, что причина этой ошибки в PROD заключается в том, что каким-то образом среди запрашиваемых полей одно помечается как NULL. У меня нет быстрого способа проверить это, но я в конечном итоге буду.

Мой вопрос сейчас таков: может ли быть какая-либо другая причина для этой ошибки? Возможно ли получить эту ошибку, если запрос такой же, как и выше, а поля действительно НЕ ПУСТО. (И почему?) Если это возможно, не могли бы вы привести пример.

Пожалуйста, отвечайте, только если вы уверены, что вы правы, т.е. мне нужно что-то более сильное, чем «я думаю это так».

Ответы [ 2 ]

1 голос
/ 26 апреля 2011

Итак, как я и подозревал в своем комментарии к ответу GregC, проблема была в соединении. Схема оказалась правильной. Однако любой запрос, который я цитировал, может возвращать нули, если у «sometable» нет записи для связанной записи «Debtors». Я в этом случае d.sometable. Все будет нулевым. Поскольку L2E объединяет NULLS, он не жалуется, что d.sometable имеет значение null, просто возвращая null для d.sometable.Anything вместо этого.

Так вот как и почему.

0 голосов
/ 18 апреля 2011

Ваш запрос выглядит хорошо. Ключом здесь является слово «материализовано», которое подразумевает, что исключение произошло при гидратации ячейки таблицы с DBNull в ней.

...