从数据库中读取布尔值?

Posted

技术标签:

【中文标题】从数据库中读取布尔值?【英文标题】:Read boolean values from DB? 【发布时间】:2011-08-21 22:54:21 【问题描述】:

在 C# 中,使用 SqlDataReader,有没有办法从 DB 中读取布尔值?

while (reader.Read())

    destPath = reader["destination_path"].ToString();
    destFile = reader["destination_file"].ToString();
    createDir = reader["create_directory"].ToString();
    deleteExisting = Convert.ToBoolean(reader["delete_existing"]);
    skipIFolderDate = reader["skipifolderdate"].ToString();
    useTempFile = reader["useTempFile"].ToString();
    password = reader["password"].ToString();

在上面的代码中,delete_existing 在数据库中始终为 1 或 0。我在 MSDN 上读到 Convert.ToBoolean() 不接受 1 或 0 作为有效输入。它只接受真或假。有没有另一种方法可以将 DB 值转换为布尔值?还是我需要在 SqlDataReader 之外执行此操作?

另外,我无法更改 DB 值,所以请不要回答“将 DB 值从 1 和 0 更改为 true 和 false”。

谢谢!

【问题讨论】:

【参考方案1】:

如果delete_existing的类型是sqlserver 'bit' 类型,你可以这样做:

var i = reader.GetOrdinal("delete_existing"); // Get the field position
deleteExisting = reader.GetBoolean(i);

或者(但是如果delete_existing可以是DBNull,它会崩溃)

deleteExisting = (bool)reader["delete_existing"];

或者更好,下面这个是DBNull证明,如果列是DBNull,则返回false

deleteExisting = reader["delete_existing"] as bool? ?? false;

否则如果数据库类型为int

deleteExisting = (reader["delete_existing"] as int? == 1) ? true : false;

或者如果是varchar

deleteExisting = (reader["delete_existing"] as string == "1") ? true : false;

【讨论】:

@Laurent 嗯...我宁愿选择第三个选项,因为有人可以在表格中添加一列,然后,显然,应用程序会中断。但是,你能解释一下第二个选项到底发生了什么吗?我对“as bool? ?? false;”感到困惑特别是 3 ?'s... 第三种解决方案:我正在尝试将 reader["delete_existing"] 转换为可为空的布尔值(布尔值?)。这样,如果字段包含 DBNull.Value,则转换失败并返回 null。因为我更喜欢弄错,所以我正在使用 ??它将 null 转换为任何值(即:null ?? 45 = 45)。我经常使用这个。 第二个解决方案:我正在直接转换为布尔值。如果值不是布尔类型,这将引发异常。例如,如果它是 DBNull.Value。这就是为什么它应该与非空位数据库字段一起使用。随便选一个就行了^^ delete_existing btw 的数据库类型是什么? @Laurent 如果我使用 .ToString() 有什么区别?例如... deleteExisting = (reader["delete_existing"].ToString() == "1") ?真:假; ***.com/questions/2099900/… 这回答了我上面的问题。感谢您的所有帮助!【参考方案2】:

铸造作品: myVar = (bool)dataReader["myColumn"];

【讨论】:

如果返回的值实际上是一点点,那就可以了。如果有人懒惰地选择了 1 或 0 作为整数,则强制转换将失败。【参考方案3】:

这个怎么样?

deleteExisting = (reader["delete_existing"] as int?) == 1;

Boolean 可能是最容易转换的类型。这是“Y”、“N”版本:

deleteExisting = string.Equals(reader["delete_existing"] as string, "Y", StringComparision.OrdinalIgnoreCase);

【讨论】:

【参考方案4】:

如果您在 SELECT 中使用 CASE 并想使用 GetBoolean,则在读取之前使用 CAST 将列更改为位。

例如:

SELECT CAST((CASE WHEN [Condition] THEN 1 ELSE 0 END) as bit) FROM Table_Name

那么你可以使用

reader.GetBoolean(0)

【讨论】:

【参考方案5】:
deleteExisting = reader.GetBoolean(reader["delete_existing"]);

【讨论】:

此语句返回错误。我认为这是因为 GetBoolean 函数想要传入一个 Int,而 reader["delete_existing"] 还不是一个 int... 尝试投射它?我相信它应该自动转换为 int 但您可以尝试明确地执行 reader.GetBoolean((int)reader["delete_existing"]); 对不起,在GetBoolean(x)中,x不是一个要转换成bool的值,而是一个整数,它是datareader中要读取的字段的位置。 GetBoolean 期望获得列的序数 = 索引。

以上是关于从数据库中读取布尔值?的主要内容,如果未能解决你的问题,请参考以下文章

从 H2 数据库中读取 TINYINT 值作为布尔值/布尔值时出现 MappingException

用于存储布尔值的 MySQL 数据类型

用于存储布尔值的 MySQL 数据类型

用于存储布尔值的 MySQL 数据类型

使用 Swift,从 plist 加载数据时,如何区分布尔值和整数值?

如何更改数据库中的布尔值调用href中的函数?