如何在C#中从datareader强制转换空布尔值?
我尝试使用以下方法从数据库强制转换空布尔值:如何在C#中从datareader强制转换空布尔值?,c#,casting,boolean,datareader,C#,Casting,Boolean,Datareader,我尝试使用以下方法从数据库强制转换空布尔值: bool? primaryFlag = reader["primaryflag"] is DBNull ? null: (bool?)reader["primaryflag"]; 我一直得到一个指定的强制转换无效异常。我使用的方法有什么问题?您不能直接将其强制转换为可空的。但您可以将用作运算符: bool? primaryFlag = reader["primaryflag"] as bool?; 这是因为如果值为DBNull.value,则强制
bool? primaryFlag = reader["primaryflag"] is DBNull ? null: (bool?)reader["primaryflag"];
我一直得到一个指定的强制转换无效异常。我使用的方法有什么问题?您不能直接将其强制转换为
可空的。但您可以将用作运算符:
bool? primaryFlag = reader["primaryflag"] as bool?;
这是因为如果值为DBNull.value
,则强制转换将失败,因此它将正确分配bool?
,即null
或者这个不那么优雅的版本:
bool? primaryFlag = null;
int colOrdinal = reader.GetOrdinal("primaryflag");
if(!reader.IsDBNull(colOrdinal))
primaryFlag = reader.GetBoolean(colOrdinal);
您还必须使用(bool?)强制转换null
值。null
问题是读取器中的值从来不是bool?
当然,如果您强制转换为bool
,您将在三元上得到一个错误,因为没有编译器可以推断的公共类型。我使用了一个简单的技巧:
reader["primaryFlag"] is DBNull ? default(bool?) : (bool)reader["primaryFlag"];
default(bool?
的意思与运行时的null
完全相同,但就编译器而言,它使null“类型化”
将此作为扩展方法也非常方便,因此您可以执行以下操作
reader.GetNullable<bool>("primaryFlag")
reader.GetNullable(“primaryFlag”)
有两种逻辑解决方案:
1正在将DB值强制转换为所需任务:
bool? primaryFlag = (bool?)reader["primaryflag"]
2与您的方法更相似:
bool? primaryFlag = reader["primaryflag"] is DBNull ? (bool?) null: (bool)reader["primaryflag"];