如何使用 SqlDataReader 获取位值并将其转换为布尔值?
Posted
技术标签:
【中文标题】如何使用 SqlDataReader 获取位值并将其转换为布尔值?【英文标题】:How to get a bit value with SqlDataReader and convert it to bool? 【发布时间】:2014-07-28 16:05:14 【问题描述】:我正在使用一个简单的查询从数据库中检索用户信息。
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 列的索引,也不想知道它。我想使用列名。
【问题讨论】:
【参考方案1】:从数据读取器索引器属性返回的值是对象类型,但可以转换为它所存储的数据类型。
试试这个:
bool isConfirmed = (bool)sqlDataReader["IsConfirmed"]
【讨论】:
如果你的值可以为空,你可能想要bool isConfirmed = sqlDataReader["IsConfirmed"] != DBNull.Value && (bool)sqlDataReader["IsConfirmed"]
【参考方案2】:
如果要使用列名可以使用
bool isConfirmed = sqlDataReader.GetBoolean(sqlDataReader.GetOrdinal("IsConfirmed"));
【讨论】:
【参考方案3】:如果您的列 IsConfirmed
中没有任何空值,您的代码应该可以工作。
通常这些位列具有 NOT NULL 属性和/或默认值 0,但它可能碰巧具有 null 值,在这种情况下,您的代码将因上述错误而失败。
您可以通过这种方式修复它(但是,您将需要列位置来进行此检查)
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;
【讨论】:
这也是处理错误情况的最彻底和最完整的答案。 +1【参考方案4】:试试这个:Convert.ToBoolean(reader["Columnname"])
或使用 Ordinal 例如:Convert.ToBoolean((3))
【讨论】:
【参考方案5】:对于可空的布尔值(如果你可能有空布尔值),你可以试试
bool? isConfirmed = sqlDataReader["IsConfirmed"] as bool?;
【讨论】:
以上是关于如何使用 SqlDataReader 获取位值并将其转换为布尔值?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 SqlDataReader 获取 int32 和字符串。收到错误 System.IndexOutOfRangeException: 'StudentID'