如何使用SqlDataReader获取一些值并将其转换为bool?

时间:2014-06-07 13:45:37

标签: c# boolean bit sqldatareader

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

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专栏的索引而且我不想知道它。我想使用列名。

5 个答案:

答案 0 :(得分:20)

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

试试这个:

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

答案 1 :(得分:10)

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

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

答案 2 :(得分:4)

如果您的专栏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;

答案 3 :(得分:0)

请尝试以下操作:Convert.ToBoolean(reader["Columnname"])或使用Ordinal,例如:Convert.ToBoolean((3))

答案 4 :(得分:0)

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

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