В this SO post я нашел общий метод расширения, который возвращает значение по умолчанию, если значение, считанное с помощью SqlDataReader
является null
или DBNull.Value
, и правильно преобразовано значение в противном случае. Я реализовал это следующим образом:распаковка -1 и литье до NULLABLE <int> с использованием обобщенных типов дает InvalidCastException
public static T GetValueOrDefault<T>(this SqlDataReader reader, string columnName, T defaultValue = default(T))
{
object val = reader[columnName];
if (val == null || val == DBNull.Value)
{
return defaultValue;
}
return (T)val;
}
нижеперечисленных способом в должности, связанную выше, не использовать правильный синтаксис примеров, но все-таки предположить, что это также должно работать с обнуляемыми типами, такими как int?
.
Однако, я прочитал обнуляемый int
столбца из базы данных, как это:
MyProperty = reader.GetValueOrDefault<int?>("SomeColumnName")
где режим отладки показывает мне, что val
является -1
и T
является int?
, но я получаю InvalidCastException. От this post Я понял, что это невозможно, потому что unboxing и casting не могут быть выполнены за одну операцию (val
имеет тип object
, содержащий значение short
), но что я могу сделать, чтобы он работал в моем случае? Поскольку это общий метод, я не знаю, как вручную распаковать его перед выполнением преобразования.
MyProperty = reader.GetValueOrDefault («SomeColumnName») –
@TimSchmelter Это все еще не работает. Я предполагаю, что это потому, что значение -1 рассматривается как «короткий», но я не могу написать 'reader.GetValueOrDefault', потому что он мог фактически содержать большее число в базе данных. –
InvisiblePanda
@InvisiblePanda № Что такое тип столбца базы данных? Если база данных может содержать большое значение, она не будет иметь тип 'short' в' SqlDataReader' –