【发布时间】:2016-02-06 12:31:56
【问题描述】:
我正在尝试使用这种方法从数据库中转换一个空布尔值:
bool? primaryFlag = reader["primaryflag"] is DBNull ? null: (bool?)reader["primaryflag"];
我不断收到指定的强制转换无效异常。我使用的方法有什么问题?
【问题讨论】:
标签: c# casting boolean datareader
我正在尝试使用这种方法从数据库中转换一个空布尔值:
bool? primaryFlag = reader["primaryflag"] is DBNull ? null: (bool?)reader["primaryflag"];
我不断收到指定的强制转换无效异常。我使用的方法有什么问题?
【问题讨论】:
标签: c# casting boolean datareader
您不能直接将其转换为 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);
【讨论】:
问题在于阅读器中的值是从不bool?。
当然,如果你转换为bool,你会在你的三元组上得到一个错误,因为编译器无法推断出通用类型。我改用一个简单的技巧:
reader["primaryFlag"] is DBNull ? default(bool?) : (bool)reader["primaryFlag"];
default(bool?) 在运行时与null 的含义完全相同,但就编译器而言,它使 null “类型化”。
把它作为扩展方法也很方便,所以你可以做类似的事情
reader.GetNullable<bool>("primaryFlag")
【讨论】:
有两个合乎逻辑的解决方案: 1 将 DB 值转换为所需的任务:
bool? primaryFlag = (bool?)reader["primaryflag"]
2 对你来说更相似:
bool? primaryFlag = reader["primaryflag"] is DBNull ? (bool?) null: (bool)reader["primaryflag"];
【讨论】:
您还必须将 null 值转换为 (bool?) null。
【讨论】: