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

25

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

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个回答

28

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

尝试这个:

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

2
如果您的值可能为空,您可能需要类似于 bool isConfirmed = sqlDataReader["IsConfirmed"] != DBNull.Value && (bool)sqlDataReader["IsConfirmed"] 这样的内容。 - Steve Smith

16

如果您想使用列名,可以使用以下代码:

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

8

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

2
这是处理错误情况最彻底和完整的答案。+1 - My Stack Overfloweth

1
尝试这样做:Convert.ToBoolean(reader["Columnname"]),或者使用Ordinal,例如:Convert.ToBoolean((3))

0

对于可空布尔值(如果您可能具有空布尔值),您可以尝试使用以下代码:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接