Can I cast from DBNull to a Nullable Bool in one line?
我有一个数据库查询,它将返回
我希望将该值存储在c_中的
我似乎找不到一个可以接受的混合解释和转换,这样做一个简单的方式,没有例外被抛出。
它能在一行可读的行中完成吗?
编辑:按要求编码
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"]; |
你可以写
注意这有点低效。
对于这个问题,我使用扩展方法。
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"))); } |