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

Yul*_*ian 18 c# boolean sqldatareader bit

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

select * from dbo.[User] u where u.Email = @email
Run Code Online (Sandbox Code Playgroud)

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

bool isConfirmed = int.Parse(sqlDataReader["IsConfirmed"].ToString()) == 1;
Run Code Online (Sandbox Code Playgroud)

然后我得到一个FormatException错误,指出"输入字符串的格式不正确.".

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

bool isConfirmed = sqlDataReader.GetBoolean(0);
Run Code Online (Sandbox Code Playgroud)

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

Sla*_*ade 20

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

试试这个:

bool isConfirmed = (bool)sqlDataReader["IsConfirmed"]
Run Code Online (Sandbox Code Playgroud)

  • 如果您的值可以为空,您可能需要类似 `bool isConfirmed = sqlDataReader["IsConfirmed"] != DBNull.Value && (bool)sqlDataReader["IsConfirmed"]` (2认同)

dot*_*tom 11

如果要使用可以使用的列名称

bool isConfirmed = sqlDataReader.GetBoolean(sqlDataReader.GetOrdinal("IsConfirmed"));
Run Code Online (Sandbox Code Playgroud)


Ste*_*eve 6

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

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

int colPos = sqlDataReader.GetOrdinal("IsConfirmed");
bool isConfirmed = sqlDataReader.IsDBNull(colPos) ? false : sqlDataReader.GetBoolean(colPos));
Run Code Online (Sandbox Code Playgroud)

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

public static class ReaderExtensions
{
    public static bool IsDBNull(this SqlDataReader reader, string colName)
    {
        int colPos = reader.GetOrdinal(colName);
         return reader.IsDBNull(colPos);
    }
}
Run Code Online (Sandbox Code Playgroud)

并调用它

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

  • 这也是处理错误情况的最彻底、最完整的答案。+1 (2认同)