【问题标题】:How to cast a null boolean from the datareader in C#?如何从 C# 中的数据读取器中转换一个空布尔值?
【发布时间】:2016-02-06 12:31:56
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# casting boolean datareader


    【解决方案1】:

    您不能直接将其转换为 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);
    

    【讨论】:

      【解决方案2】:

      问题在于阅读器中的值是从不bool?

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

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

      default(bool?) 在运行时与null 的含义完全相同,但就编译器而言,它使 null “类型化”。

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

      reader.GetNullable<bool>("primaryFlag")
      

      【讨论】:

        【解决方案3】:

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

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

        2 对你来说更相似:

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-08-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-11-28
            相关资源
            最近更新 更多