我正在使用简单查询从数据库中检索用户信息。
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专栏的索引而且我不想知道它。我想使用列名。
答案 0 :(得分:20)
从数据读取器索引器属性返回的值是object类型,但可以强制转换为它已存储为的数据类型。
试试这个:
bool isConfirmed = (bool)sqlDataReader["IsConfirmed"]
答案 1 :(得分:10)
如果您想使用列名,可以使用
bool isConfirmed = sqlDataReader.GetBoolean(sqlDataReader.GetOrdinal("IsConfirmed"));
答案 2 :(得分:4)
如果您的专栏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;
答案 3 :(得分:0)
请尝试以下操作:Convert.ToBoolean(reader["Columnname"])
或使用Ordinal,例如:Convert.ToBoolean((3))
答案 4 :(得分:0)
对于可为空的布尔值(如果您可能有空的布尔值),您可以尝试
bool? isConfirmed = sqlDataReader["IsConfirmed"] as bool?;