如何使用SqlDataReader获得位值并将其转换为bool值
本文关键字:转换 bool SqlDataReader 何使用 | 更新日期: 2023-09-27 18:07:44
我正在使用一个简单的查询从数据库中检索用户信息。
select * from dbo.[User] u where u.Email = @email
然后尝试获取名为IsConfirmed的列的值(在数据库中表示为位类型列)并将其转换为bool。
bool isConfirmed = int.Parse(sqlDataReader["IsConfirmed"].ToString()) == 1;
然后我得到一个FormatException错误,指出"Input string was not in a correct format."
我看到了一个类似的问题,答案提供了以下代码:
bool isConfirmed = sqlDataReader.GetBoolean(0);
但这对我的情况不起作用,因为我不知道IsConfirmed列的索引,我也不想知道它。我想使用列名
从数据读取器索引器属性返回的值为对象类型,但可以将其强制转换为存储它的数据类型。
试试这个:
bool isConfirmed = (bool)sqlDataReader["IsConfirmed"]
如果您想使用列名,可以使用
bool isConfirmed = sqlDataReader.GetBoolean(sqlDataReader.GetOrdinal("IsConfirmed"));
你的代码应该工作,如果你没有任何空值在你的列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;
试试这个:Convert.ToBoolean(reader["Columnname"])
或与序数例如:Convert.ToBoolean((3))
对于可空布尔值(如果您可能有空布尔值),您可以尝试
bool? isConfirmed = sqlDataReader["IsConfirmed"] as bool?;