如何从 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"];
我正在尝试使用此方法从数据库中转换一个空布尔值:
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"];