如何使用 SqlDataReader 获取位值并将其转换为布尔值?

Posted

技术标签:

【中文标题】如何使用 SqlDataReader 获取位值并将其转换为布尔值?【英文标题】:How to get a bit value with SqlDataReader and convert it to bool? 【发布时间】:2014-07-28 16:05:14 【问题描述】:

我正在使用一个简单的查询从数据库中检索用户信息。

select * from dbo.[User] u where u.Email = @email

然后我尝试获取名为 IsConfirmed 的列的值(在数据库中表示为位类型列)并将其转换为 bool。

bool isConfirmed = int.Parse(sqlDataReader["IsConfirmed"].ToString()) == 1;

然后我收到一个 FormatException 错误,指出“输入字符串的格式不正确。”。

我看到了一个类似的问题,答案提供了这个代码:

bool isConfirmed = sqlDataReader.GetBoolean(0);

但这不适用于我的情况,因为我不知道 IsConfirmed 列的索引,也不想知道它。我想使用列名。

【问题讨论】:

【参考方案1】:

从数据读取器索引器属性返回的值是对象类型,但可以转换为它所存储的数据类型。

试试这个:

bool isConfirmed = (bool)sqlDataReader["IsConfirmed"]

【讨论】:

如果你的值可以为空,你可能想要bool isConfirmed = sqlDataReader["IsConfirmed"] != DBNull.Value && (bool)sqlDataReader["IsConfirmed"]【参考方案2】:

如果要使用列名可以使用

bool isConfirmed = sqlDataReader.GetBoolean(sqlDataReader.GetOrdinal("IsConfirmed"));

【讨论】:

【参考方案3】:

如果您的列 IsConfirmed 中没有任何空值,您的代码应该可以工作。 通常这些位列具有 NOT NULL 属性和/或默认值 0,但它可能碰巧具有 null 值,在这种情况下,您的代码将因上述错误而失败。

您可以通过这种方式修复它(但是,您将需要列位置来进行此检查)

int colPos = sqlDataReader.GetOrdinal("IsConfirmed");
bool isConfirmed = sqlDataReader.IsDBNull(colPos) ? false : sqlDataReader.GetBoolean(colPos));

如果您真的不喜欢通过调用来查找列位置,您可以创建一个扩展方法来隐藏调用

public static class ReaderExtensions

    public static bool IsDBNull(this SqlDataReader reader, string colName)
    
        int colPos = reader.GetOrdinal(colName);
         return reader.IsDBNull(colPos);
    

并调用它

bool isConfirmed = int.Parse((sqlDataReader.IsDBNull("IsConfirmed") 
                    ? "0" : sqlDataReader["IsConfirmed"].ToString())) == 1;

【讨论】:

这也是处理错误情况的最彻底和最完整的答案。 +1【参考方案4】:

试试这个:Convert.ToBoolean(reader["Columnname"]) 或使用 Ordinal 例如:Convert.ToBoolean((3))

【讨论】:

【参考方案5】:

对于可空的布尔值(如果你可能有空布尔值),你可以试试

bool? isConfirmed = sqlDataReader["IsConfirmed"] as bool?;

【讨论】:

以上是关于如何使用 SqlDataReader 获取位值并将其转换为布尔值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中使用 SqlDataReader 获取行数

如何从 SqlDataReader 中只获取一些行?

如何从 SqlDataReader 获取列的表名

如何存储 128 位值?

如何从 SqlDataReader 获取 int32 和字符串。收到错误 System.IndexOutOfRangeException: 'StudentID'

如何使用 SqlDataReader 像使用 SqlDataAdapter 一样快地填充 DataTable?