SqlDataReader阅读器关闭时尝试调用 HasRows 无效

SqlDataReader阅读器关闭时尝试调用 HasRows 无效

在SqlHelper中封装好的SqlDataReader在调用时出现了

“阅读器关闭时尝试调用 HasRows 无效”

调试了许多次,提示的都是SqlHelper中错误

但我以为是代码出错误,但是后来才发现是因为封装的方法有问题

  1.  
    public static SqlDataReader ExecuteReader(string sql, params SqlParameter[] param)
  2.  
    {
  3.  
    //声明连接
  4.  
    using (SqlConnection Coon = new SqlConnection(SqlCoon))
  5.  
    {
  6.  
     
  7.  
    //声明命令
  8.  
    using (SqlCommand cmd = new SqlCommand(sql, Coon))
  9.  
    {
  10.  
    //打开数据库
  11.  
    if (Coon.State == ConnectionState.Closed)
  12.  
    {
  13.  
    Coon.Open();
  14.  
    }
  15.  
    //判断可变参数
  16.  
    if (param != null && param.Length > 0)
  17.  
    {
  18.  
    cmd.Parameters.AddRange(param);
  19.  
    }
  20.  
    //执行命令
  21.  
    return cmd.ExecuteReader(CommandBehavior.CloseConnection);
  22.  
    }
  23.  
    }
  24.  
    }

仔细看是因为在连接字段前加了释放空间的using

因为using作用域之后,连接自动释放,而Reader与DataSet不同,DataSet对象是一个暂存区(Cache)保留了数据库中查到的数据,而DataReader并没有将数据保存在本地内存中,这些数据是存在数据库服务器中的,连接关闭后用DataReader读取数据库就一定是读不到的。

修改后的封装方法

  1.  
    public static SqlDataReader ExecuteReader(string sql, params SqlParameter[] param)
  2.  
    {
  3.  
    //声明连接
  4.  
    SqlConnection Coon = new SqlConnection(SqlCoon);
  5.  
     
  6.  
    //声明命令
  7.  
    using(SqlCommand cmd = new SqlCommand(sql, Coon))
  8.  
    {
  9.  
    //打开数据库
  10.  
    if (Coon.State == ConnectionState.Closed)
  11.  
    {
  12.  
    Coon.Open();
  13.  
    }
  14.  
    //判断可变参数
  15.  
    if (param != null && param.Length > 0)
  16.  
    {
  17.  
    cmd.Parameters.AddRange(param);
  18.  
    }
  19.  
    //执行命令
  20.  
    return cmd.ExecuteReader(CommandBehavior.CloseConnection);
  21.  
    }
  22.  
    }
原文地址:https://www.cnblogs.com/wfy680/p/12044565.html