Типизированные наборы данных не поддерживают обнуляемые типы. Они поддерживают Nullable столбцы .
Генератор набора типизированных данных создает ненулевые свойства и связанные методы для обработки нулевых значений. Если вы создаете столбец MyDate
типа DateTime
и AllowDbNull
, установленный на true
, подкласс DataRow
будет реализовывать свойство DateTime
, не допускающее обнуление, с именем MyDate
, метод SetMyDateNull()
и IsMyDateNull()
метод. Это означает, что если вы хотите использовать в своем коде обнуляемый тип, вы должны сделать это:
DateTime? myDateTime = myRow.IsMyDateNull() ? null : (DateTime?) row.MyDate;
Хотя это не полностью не лишает цели использования типизированных наборов данных, это действительно отстой. Обидно, что типизированные наборы данных реализуют пустые столбцы таким образом, что они менее удобны, чем, например, методы расширения System.Data
.
Особенно плохо, потому что типизированные наборы данных do в некоторых местах используют обнуляемые типы - например, метод Add<TableName>Row()
для таблицы, содержащей столбец DateTime со значением NULL, описанный выше, примет параметр DateTime?
.
Давным-давно я спрашивал об этой проблеме на форумах MSDN, и в конечном итоге менеджер проекта ADO объяснил, что типы nullable были реализованы одновременно с типизированными наборами данных, и его команда не успела полностью объединить эти два элемента. к дате поставки .NET 2.0. И, насколько я могу судить, с тех пор они не добавляли новые функции в наборы типизированных данных.