Подтвердить что ты не робот

Могу ли я бросить из 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");
4b9b3361

Ответ 1

Предполагая, что у вас есть datareader dr:

bool? tmp = Convert.IsDBNull(dr["dbnullValue"]) ? null: (bool?) dr["dbnullValue"];

--- ДОБАВЛЕНО ----

или, может быть, вы можете использовать если вам не нужно проверять DBNull, но я не уверен, что компилятору понравится это (я не могу проверить его сейчас)

bool? tmp = dr["dbnullValue"] ?? (bool?) dr["dbnullValue"];

Ответ 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);
    }