C# 如何使用SqlDataReader获取位值并将其转换为bool?

C# 如何使用SqlDataReader获取位值并将其转换为bool?,c#,boolean,bit,sqldatareader,C#,Boolean,Bit,Sqldatareader,我使用一个简单的查询从数据库中检索用户信息 select * from dbo.[User] u where u.Email = @email 然后,我尝试获取一个名为isconfired的列的值(在数据库中表示为位类型列),并将其转换为bool bool isConfirmed = int.Parse(sqlDataReader["IsConfirmed"].ToString()) == 1; 然后我得到一个FormatException错误,指出“输入字符串的格式不正确” 我看到了一个类

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

select * from dbo.[User] u where u.Email = @email
然后,我尝试获取一个名为isconfired的列的值(在数据库中表示为位类型列),并将其转换为bool

bool isConfirmed = int.Parse(sqlDataReader["IsConfirmed"].ToString()) == 1;
然后我得到一个FormatException错误,指出“输入字符串的格式不正确”

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

bool isConfirmed = sqlDataReader.GetBoolean(0);

但这对我的案例不起作用,因为我不知道isconfired列的索引,也不想知道它。我想使用列名。

从数据读取器索引器属性返回的值属于object类型,但可以转换为存储为的数据类型

试试这个:

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

如果要使用列名,可以使用

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

如果列中没有任何空值
isconfirm

通常,这些位列具有NOTNULL属性和/或默认值0,但它可能恰好具有NULL值,在这种情况下,代码将失败并出现上述错误

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

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

并称之为

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

尝试以下操作:
Convert.ToBoolean(reader[“Columnname”])
或使用Ordinal,例如:
Convert.ToBoolean((3))
对于可为空的布尔值(如果可能有空布尔值),可以尝试


bool?isConfirmed=sqlDataReader[“isConfirmed”]作为bool

这也是处理错误案例最彻底、最完整的答案+1如果您的值可以为null,则可能需要类似于
bool isconfired=sqlDataReader[“isconfired”]!=DBNull.Value&(bool)sqlDataReader[“isconfirm”]
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;