Могу ли я бросить из DBNull в Nullable Bool в одной строке?
У меня есть запрос к базе данных, который либо вернет NULL
, либо значение boolean (bit).
Я хочу сохранить это значение в переменной типа Nullable<bool>
в С#.
Кажется, я не могу найти приемлемое сочетание эксплицитных бросков и преобразований, которые делают это простым способом без исключения Исключения.
Можно ли это сделать в одной читаемой строке?
EDIT: Код по запросу
private Nullable<bool> IsRestricted;
...//data access
IsRestricted = (bool?)DataBinder.GetPropertyValue(dataObj, "IsRestricted");
или, возможно,
IsRestricted = (bool?)(bool)DataBinder.GetPropertyValue(dataObj, "IsRestricted");
Ответы
Ответ 1
Предполагая, что у вас есть datareader dr:
bool? tmp = Convert.IsDBNull(dr["dbnullValue"]) ? null: (bool?) dr["dbnullValue"];
--- ДОБАВЛЕНО ----
или, может быть, вы можете использовать если вам не нужно проверять DBNull, но я не уверен, что компилятору понравится это (я не могу проверить его сейчас)
bool? tmp = dr["dbnullValue"] ?? (bool?) dr["dbnullValue"];
Ответ 2
Вы можете написать value as bool?
.
Это вернет null
, если value
не относится к типу bool
.
Обратите внимание, что это несколько неэффективно.
Ответ 3
while (reader.Read()) {
bool? IsRestricted = (reader.IsDBNull(reader.GetOrdinal("IsRestricted"))) ? (null) : ((bool)reader.GetOrdinal("IsRestricted")));
}
Ответ 4
Я использую методы расширения для этой проблемы.
var isRestricted = dataRecord.GetNullableValue<bool>("IsRestricted");
Существует код метода GetNullableValue:
public static Nullable<TValue> GetNullableValue<TValue>(
this IDataRecord record,
string name) where TValue : struct
{
return record.GetValue<TValue, Nullable<TValue>>(name);
}
И есть также простой код для метода GetValue:
private static TResult GetValue<TValue, TResult>(
this IDataRecord record,
string name)
{
var result = record[name];
return !result.Equals(DBNull.Value) ? (TResult)result : default(TResult);
}