如何从 C# 中的数据读取器转换为空布尔值?

How to cast a null boolean from the datareader in C#?

我正在尝试使用此方法从数据库中转换一个空布尔值:

bool? primaryFlag = reader["primaryflag"] is DBNull ? null: (bool?)reader["primaryflag"];

我不断收到指定转换无效异常。我使用的方法有什么问题?

您不能将其直接转换为 Nullable<bool>。但是您可以使用 as 运算符:

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);

您还必须将 null 值转换为 (bool?) null

问题是 reader 中的值是 never a bool?.

当然,如果您转换为 bool,您将在三元中遇到错误,因为编译器无法推断出通用类型。我改用一个简单的技巧:

reader["primaryFlag"] is DBNull ? default(bool?) : (bool)reader["primaryFlag"];

default(bool?) 在运行时与 null 的含义完全相同,但就编译器而言,它使 "typed" 为空。

把它作为扩展方法也很方便,所以你可以做类似的事情

reader.GetNullable<bool>("primaryFlag")

有两个合乎逻辑的解决方案: 1 正在将 DB 值转换为所需的任务:

bool? primaryFlag = (bool?)reader["primaryflag"]

2 更适合你的方法:

bool? primaryFlag = reader["primaryflag"] is DBNull ? (bool?) null: (bool)reader["primaryflag"];