Как мне обработать Преобразование из типа 'DBNull' в тип 'String' недопустимо - PullRequest
7 голосов
/ 11 февраля 2009

Мне нужен некоторый ожидаемый совет о том, как обрабатывать следующее: - У меня есть поле данных misc_text_2, которое имеет тип varchar (25) и допускает NULL. Теперь, если я использую следующий синтаксис

<asp:Label ID="lblPrinter" runat="server"  Text='<%# iif(eval("misc_text_2") is dbnull.value, "", iif(eval("misc_text_2") like "NA", "None", iif(eval("misc_text_2") like "KP1", "Kitchen Printer 1", iif(eval("misc_text_2") like "KP2", "Kitchen Printer 2", iif(eval("misc_text_2") like "KP3", "Kitchen Printer 3", iif(eval("misc_text_2") like "BP1", "Bar Printer 1", iif(eval("misc_text_2") like "BP2", "Bar Printer 2", iif(eval("misc_text_2") like "BP3", "Bar Printer 3", Eval("misc_text_2")))))))))%>'></asp:Label>

Я продолжаю получать сообщение об ошибке. Сведения об исключении: System.InvalidCastException: недопустимо преобразование типа DBNull в тип String.

Я знаю, что что-то упустил, но что ...

Заранее спасибо

Ответы [ 8 ]

13 голосов
/ 11 февраля 2009

Вы должны явно проверить DBNull.Value и выполнить преобразование самостоятельно.

Другими словами, создайте метод, который будет выполнять преобразование для вас с учетом DBNull.Value.

3 голосов
/ 11 октября 2011

Каждый раз, когда вы используете Eval, вам нужно как-то подсунуть ленивую оценку. Для этого замените каждый экземпляр:

iif(eval("misc_text_2") like ...

с

iif(IsDbNull(eval("misc_text_2")) OrElse eval("misc_text_2") like ...

OrElse предотвратит любую попытку преобразования DbNull в логическое значение. Однако, с более фундаментальной точки зрения, взрыв является наиболее правильным. Все это должно быть выполнено за кодом, вероятно, в обработчике события ItemDataBound (или RowDataBound).

При дальнейшем размышлении ...

О.П. также может использовать в своем коде метод Convert.ToString(), который преобразует DBNulls в String.Empty.

3 голосов
/ 11 февраля 2009

Не отвечая на ваш вопрос, но: Вы должны действительно создать метод кода, который выполняет преобразование. Это облегчит понимание и отладку кода и позволит повторно использовать код.

0 голосов
/ 01 марта 2016

Как предполагает SpiritUMTP, если вы используете конструктор наборов данных, измените DataColumn.NullValue с «Throw exception» на «empty» или «Nothing». Я выбрал последнее, и это решило проблему. Теперь я просто проверяю ничего (если IsNothing (columnFax), то ...)

0 голосов
/ 05 марта 2014

Для преобразования DBNull или IsDBNull вы можете попробовать это следующим образом:

  1. Преобразовать DBNull в пустую строку

    (DBNullObj) .ToString

  2. Создание функции DBNull Converter

    Открытая функция ConvertDBNullToString (DBNullObj As Object) в виде строки

    если IsDBNull (DBNullObj), то

    возврат ""

    конец, если

    return DBNullObj

    Функция завершения

0 голосов
/ 22 октября 2012

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

Исключение NullValue для "Пусто" вместо "Бросить исключение".

надеюсь, это поможет вам всем.

0 голосов
/ 23 июня 2010

Поскольку у нас есть устаревшая база данных, которая была настроена для MS-Dynamics (Solomon), наш метод обработки нулей - преобразовать их в нулевые строки в коде ASP или VB.NET. т.е.

Trim$(misc_text_2 & " ")

Избавляется от проблемы для любой версии VB.

0 голосов
/ 11 февраля 2009

Вы можете в вашем sql запросе использовать isNull (misc_text_2, ''), чтобы вернуть пустую строку вместо DBNull.

...