我可以在一行中从 DBNull 转换为可为空的布尔值吗?
本文关键字:转换 布尔值 DBNull 一行 我可以 | 更新日期: 2023-09-27 17:56:37
我有一个数据库查询,它将返回NULL
或布尔(位)值。
我希望将此值存储在 C# 中 Nullable<bool>
类型的变量中。
我似乎找不到可以接受的显式强制转换和转换组合,这些组合以简单的方式执行此操作而不会抛出异常。
可以在一行可读的行中完成吗?
编辑:按要求编写代码
private Nullable<bool> IsRestricted;
...//data access
IsRestricted = (bool?)DataBinder.GetPropertyValue(dataObj, "IsRestricted");
或者也许
IsRestricted = (bool?)(bool)DataBinder.GetPropertyValue(dataObj, "IsRestricted");
假设您有一个数据读取器博士:
bool? tmp = Convert.IsDBNull(dr["dbnullValue"]) ? null: (bool?) dr["dbnullValue"];
---添加----
或者也许您可以使用?? 如果您不必检查 DBNull,但我不确定编译器会喜欢这个(我现在无法测试它)
bool? tmp = dr["dbnullValue"] ?? (bool?) dr["dbnullValue"];
你可以写value as bool?
.
如果value
不是类型 bool
,这将返回null
。
请注意,这有些低效。
while (reader.Read()) {
bool? IsRestricted = (reader.IsDBNull(reader.GetOrdinal("IsRestricted"))) ? (null) : ((bool)reader.GetOrdinal("IsRestricted")));
}
我使用扩展方法来解决这个问题。
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);
}
您可以执行以下操作
bool? myNullableBoolean = SqlConvert.ToType<bool?>(reader["myNullableBooleanColumn"]);