您的位置:首页 > 数据库

SqlDataReader的关闭问题,报错:“阅读器关闭时尝试调用 HasRows 无效”

2017-11-06 09:27 609 查看
最近在练习一个ADO.NET三层架构验证用户名登录密码时出现报错:“阅读器关闭时尝试调用 HasRows 无效”

百度了好多文章才得到解决:

先来看SqlHelper获取SqlDataReader

public static SqlDataReader ExecuteDataReader(string sql, params SqlParameter[] Parameters)
{
SqlCommand cmd = new SqlCommand();
cmd.Connection = Connection;
cmd.CommandType = CommandType.Text;
cmd.CommandText = sql;
foreach (SqlParameter p in Parameters)
{
cmd.Parameters.Add(p);
}
try
{
Connection.Open();
SqlDataReader reader = cmd.ExecuteReader();
return reader;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}

}
在来看获取SqlDataReader代码:

public UserModel GetUserLoginInfoByLoginId(string LoginId)
{
UserModel model = null;
string sql = "select loginid,password from hrmresource where loginid=@Uid";
SqlDataReader reader = SqlHelper.ExecuteDataReader(sql, new SqlParameter("@Uid", LoginId));
{
if (reader.HasRows)//程序运行到这里报"阅读器关闭时尝试调用 HasRows 无效"错误
{
while (reader.Read())
{
model = new UserModel();
model.LoginId = reader.GetString(0);
model.PassWord = reader.GetString(1);
}

}
return model;
}

}

网上查了很多文章,原因都是说在获取到的SqlDataReader使用时连接已关闭,经调试确实如此。

原因找到后。继续找解决办法,问朋友说改用DataSet,DatzSet已将数据保存在了本地内存当中,经测试,确试职此,但是DataReader是否就不行呢?当然可行

定义下面的DataReader,此DataReader在关闭时,Connection自动关闭。

SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);

所以只需要在定义Reader时加上连接自动关闭的参数。

后续使用完成Readerj时,加上Reader.Close(); 即可
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C# SqlDataReader HasRows
相关文章推荐