关于c#:我可以在一行中从DBNull转换为Nullable Bool吗?

Can I cast from DBNull to a Nullable Bool in one line?

我有一个数据库查询,它将返回NULL或布尔(位)值。

我希望将该值存储在c_中的Nullable类型的变量中。

我似乎找不到一个可以接受的混合解释和转换,这样做一个简单的方式,没有例外被抛出。

它能在一行可读的行中完成吗?

编辑:按要求编码

1
2
3
private Nullable<bool> IsRestricted;
...//data access
IsRestricted = (bool?)DataBinder.GetPropertyValue(dataObj,"IsRestricted");

或者也许

1
IsRestricted = (bool?)(bool)DataBinder.GetPropertyValue(dataObj,"IsRestricted");


假设你有一个数据阅读器,博士:

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

------

或者你可以使用??如果您不必检查dbnull,但我不确定编译器会喜欢这个(我现在不能测试它)。

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


你可以写value as bool?。如果value不是bool类型,则返回null

注意这有点低效。


对于这个问题,我使用扩展方法。

1
var isRestricted = dataRecord.GetNullableValue<bool>("IsRestricted");

有GetNullableValue方法的代码:

1
2
3
4
5
6
    public static Nullable<TValue> GetNullableValue<TValue>(
        this IDataRecord record,
        string name) where TValue : struct
    {
        return record.GetValue<TValue, Nullable<TValue>>(name);
    }

还有一个简单的getValue方法代码:

1
2
3
4
5
6
7
        private static TResult GetValue<TValue, TResult>(
        this IDataRecord record,
        string name)
    {
        var result = record[name];
        return !result.Equals(DBNull.Value) ? (TResult)result : default(TResult);
    }


1
2
3
 while (reader.Read()) {
    bool? IsRestricted = (reader.IsDBNull(reader.GetOrdinal("IsRestricted"))) ? (null) : ((bool)reader.GetOrdinal("IsRestricted")));
 }