Можно ли сделать свойства обнуляемыми (по крайней мере те, которые могут хранить нулевое значение в базе данных)?
Хотя вы не можете хранить типы значений, допускающие значение NULL, в типизированном DataSet
, вы можете заставить столбцы набора данных принимать значения DBNull
(column.AllowDBNull = true;
) и создать пару вспомогательных функций, которые будут выполнятьэтот перевод для вас.
public static T? DBToNullable<T>(object dbValue) where T: struct
{
if (dbValue == DBNull.Value)
return null;
else
return (T)dbValue;
}
public static object NullableToDB<T>(T? value) where T: struct
{
if (value.HasValue)
return (object)(T)value;
else
return DBNull.Value;
}
Затем их можно использовать так:
int? value = ....
DataRow row = ....
row["MyDataColumn"] = NullableToDB(value);
value = DBToNullable<int>(row["MyDataColumn"]);
Это должно немного облегчить боль.
Если нет, то почемубыл ли он спроектирован таким образом?
Вероятно, он был спроектирован таким образом по историческим причинам, которые относятся к концептуальной разнице между значением NULL
базы данных (то есть: значение неизвестно) и C # null
ссылка (имеется в виду: эта ссылка еще не была назначена).Конечно, эти значения изменились после того, как в C # были добавлены типы значений, которые можно обнулять, но к тому времени набранный корабль DataSet
уже отплыл.