Обнуляемый Int Column в DataSet - PullRequest
6 голосов
/ 18 мая 2009

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

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

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

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

Спасибо.

Ответы [ 3 ]

8 голосов
/ 01 июня 2009

Я думаю, что этот пост на форуме ASP.NET поможет вам в этом вопросе: Строго типизированный выпуск столбца DataSet / Nullable

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

2 голосов
/ 19 мая 2009

DBNull был в основном задействован для игры с необнуляемыми типами значений, до .NET 2.0. Благодаря дизайну ADO.NET вы не сможете избежать DBNull, если не выберете более прямой подход. DBNull является встроенным ядром ADO.NET, поэтому вам придется научиться жить с этим, если вы хотите продолжать его использовать.

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

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

0 голосов
/ 19 мая 2009

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