SqlDataReader阅读器关闭时尝试调用 HasRows 无效
SqlDataReader阅读器关闭时尝试调用 HasRows 无效
在SqlHelper中封装好的SqlDataReader在调用时出现了
“阅读器关闭时尝试调用 HasRows 无效”
调试了许多次,提示的都是SqlHelper中错误
但我以为是代码出错误,但是后来才发现是因为封装的方法有问题
-
public static SqlDataReader ExecuteReader(string sql, params SqlParameter[] param)
-
{
-
//声明连接
-
using (SqlConnection Coon = new SqlConnection(SqlCoon))
-
{
-
-
//声明命令
-
using (SqlCommand cmd = new SqlCommand(sql, Coon))
-
{
-
//打开数据库
-
if (Coon.State == ConnectionState.Closed)
-
{
-
Coon.Open();
-
}
-
//判断可变参数
-
if (param != null && param.Length > 0)
-
{
-
cmd.Parameters.AddRange(param);
-
}
-
//执行命令
-
return cmd.ExecuteReader(CommandBehavior.CloseConnection);
-
}
-
}
-
}
仔细看是因为在连接字段前加了释放空间的using
因为using作用域之后,连接自动释放,而Reader与DataSet不同,DataSet对象是一个暂存区(Cache)保留了数据库中查到的数据,而DataReader并没有将数据保存在本地内存中,这些数据是存在数据库服务器中的,连接关闭后用DataReader读取数据库就一定是读不到的。
修改后的封装方法
-
public static SqlDataReader ExecuteReader(string sql, params SqlParameter[] param)
-
{
-
//声明连接
-
SqlConnection Coon = new SqlConnection(SqlCoon);
-
-
//声明命令
-
using(SqlCommand cmd = new SqlCommand(sql, Coon))
-
{
-
//打开数据库
-
if (Coon.State == ConnectionState.Closed)
-
{
-
Coon.Open();
-
}
-
//判断可变参数
-
if (param != null && param.Length > 0)
-
{
-
cmd.Parameters.AddRange(param);
-
}
-
//执行命令
-
return cmd.ExecuteReader(CommandBehavior.CloseConnection);
-
}
-
}