• 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.  
      }
  • 相关阅读:
    导热硅胶片的特性
    电子器件热设计估算技巧 1
    什么是热阻
    功率器件的热设计
    ESP8266EX 电路设计
    STM8S005 ADC采集 5位共阴数码管显示
    PCB设计-Allegro软件入门系列第九讲-Class分类和Subclass应用
    STM32 滴答时钟 SysTick 的使用 STM32F103C8T6
    SPI 串行Flash闪存W25Q128FV 的使用(STM32F407)_基础篇
    如何居中一个元素
  • 原文地址:https://www.cnblogs.com/wfy680/p/12044565.html
Copyright © 2020-2023  润新知