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)
dot*_*tom 11
如果要使用可以使用的列名称
bool isConfirmed = sqlDataReader.GetBoolean(sqlDataReader.GetOrdinal("IsConfirmed"));
Run Code Online (Sandbox Code Playgroud)
如果您的 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)
| 归档时间: |
|
| 查看次数: |
31397 次 |
| 最近记录: |