如何使用SqlDataReader获得位值并将其转换为bool值

本文关键字:转换 bool SqlDataReader 何使用 | 更新日期: 2023-09-27 18:07:44

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

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

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

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

然后我得到一个FormatException错误,指出"Input string was not in a correct format."

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

bool isConfirmed = sqlDataReader.GetBoolean(0);

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

如何使用SqlDataReader获得位值并将其转换为bool值

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

试试这个:

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

如果您想使用列名,可以使用

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

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

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

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;

试试这个:Convert.ToBoolean(reader["Columnname"])或与序数例如:Convert.ToBoolean((3))

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

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