• 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.  
      }
  • 相关阅读:
    view上面 长view时候要设置其frame的,
    controller.allowsEditing = NO;神医,
    怎样计算,遗留,
    编码,一点阅读(转:阮一峰的网络日志),
    原来 ascll是对英文系统的编码,
    CoreGraphics 画图,(转燕羽天空)
    Core Graphics,
    计算数据类型占有 字节的长度,
    浅谈Promise(一)
    原生js实现表格内容增删改
  • 原文地址:https://www.cnblogs.com/wfy680/p/12044565.html
Copyright © 2020-2023  润新知