Обнуляемый столбец Int в DataSet

Я работаю со строго типизированными наборами данных .NET и имею таблицу со столбцом int, допускающим значение NULL (а также столбцом DateTime, допускающим значение NULL).

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

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

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

Спасибо.


person goombaloon    schedule 18.05.2009    source источник
comment
УТОЧНЕНИЕ: набор данных использует DBNull (значение по умолчанию), а не null.   -  person goombaloon    schedule 18.05.2009


Ответы (3)


DBNull в основном использовался для работы с типами значений, не допускающими значения NULL, до .NET 2.0. Из-за дизайна ADO.NET вы не сможете избежать DBNull, если не выберете более прямой подход. DBNull встроен в ядро ​​ADO.NET, поэтому вам придется научиться жить с этим, если вы хотите продолжать его использовать.

Если вы предоставляете свои собственные объекты транспорта данных вместо того, чтобы полагаться на общее пространство имен System.Data, вы можете проверить (при чтении результатов с помощью средства чтения данных), имеет ли значение null, но вам понадобится какой-то способ сгенерировать строго типизированный объекты и сопоставления, потому что это действительно утомительная работа.

Насколько мне известно, DBNull встроен в конструкцию ADO.NET, и лучший способ создания ваших приложений, если вы его используете, - это объединить (нормализовать) DBNull и null. По сути, предоставьте свой собственный класс DbConvert, который перехватывает DBNull и возвращает фактическую нулевую ссылку, если значение равно DBNull. Это минимальное требование, но как только это будет выполнено, у вас будет меньше плавающих значений DBNull, о которых стоит беспокоиться.

person John Leidegren    schedule 18.05.2009

Я думаю, что этот пост на форуме ASP.NET поможет решить вопрос: Strongly-Typed DataSet / Nullable проблема с колонкой

Единственный способ установить для таких свойств значение null - использовать вспомогательные методы, которые также создает генератор набора данных. Эти методы названы по имени вашего столбца, поэтому в вашем случае у вас должны быть методы для объекта строки данных с именами IsApprovingUserNull () и SetApprovingUserNull ().

person Gabriel Chung    schedule 01.06.2009

Прошло некоторое время с тех пор, как я использовал типизированные наборы данных, но в своем старом коде я вижу, что использует атрибут codegen:nullValue. Я не думаю, что он поддерживается дизайнером, по крайней мере, в VS2005 (который я использовал для этого проекта), поэтому вам придется открыть файл xsd в редакторе xml и сделать это вручную.

В результате xml будет выглядеть примерно так:

<xs:sequence>
    <xs:element 
        name="MyIntColumn" 
        codegen:nullValue="0" 
        type="xs:int" 
        minOccurs="0" />
    <xs:element 
        name="MyBoolColumn" 
        codegen:nullValue="false" 
        type="xs:boolean" 
        minOccurs="0" />
    <xs:element 
        name="MyDateColumn" 
        codegen:nullValue="1900-01-01" 
        type="xs:dateTime" 
        minOccurs="0" />
</xs:sequence>
person Community    schedule 18.05.2009
comment
К сожалению, это вводит понятие магических чисел, чего я бы по возможности избегал. (То есть, Null очень явно равен нулю, а 0 - нет) - person lc.; 23.05.2012