在自学杨中科老师的视频教学时,拓展编写SqlHelper使用,在将ExecuteReader方法封装进而读取数据库中的数据时

会产生Additional information: 阅读器关闭时尝试调用 Read 无效问题,错误产生时,我的代码如下:

SqlHelper.cs代码如下:

public static SqlDataReader ExecuteReader(string sql)

        {

            using (SqlConnection conn = new SqlConnection(ConnString))

            {

                conn.Open();

                using (SqlCommand cmd = conn.CreateCommand())

                {

                    cmd.CommandText = sql;

                    return  cmd.ExecuteReader();

                }

            }

        }

运行主程序代码如下:

private void btn2_Click(object sender, RoutedEventArgs e)

        {

            using (SqlDataReader reader = SqlHelper.ExecuteReader("select * from T_Student"))

            {

                while (reader.Read())

                {

                    string H = reader["Hobbit"].ToString();

                    MessageBox.Show("爱好分别为:" + H);



                }

            }

       }

运行出错抛异常如下图:

也就是:      Additional information: 阅读器关闭时尝试调用 Read 无效

解决方法:

将SqlHelper.cs代码改为:

public static SqlDataReader ExecuteReader(string sql)

        {

            SqlConnection conn = new SqlConnection(ConnString);

            

                conn.Open();

                using (SqlCommand cmd = conn.CreateCommand())

                {

                    cmd.CommandText = sql;

                    return  cmd.ExecuteReader();

                }

            

        }

与原SqlHelper.cs的区别在于将创建数据库连接对象的using(){     }方法去掉!其他运行程序代码不变!

这样运行后将不会再出现异常,能正常从数据库中读取数据了!!!

解决方法解释:

看到这篇文章大家对using(){  }方法有一定的了解,它的作用就是在其“()”中声明创建对象并在“{  }”中使用后,自动将其占用的系统资源释放!相当于try-finally的作用,创建数据库连接,使用后,将数据库再关闭一样。

因此就有了,在SqlHelper.cs中,如果在数据库声明创建时使用using(){  },那么在主程序运行到“SqlDataReader reader = SqlHelper.ExecuteReader("select * from T_Student")”时,调用SqlHelper.cs中的ExecuteReader()已经结束,系统已经将数据库所占用的资源已经释放,由于要使用返回的SqlDataHelper所以不能关闭连接,那样阅读器SqlDataHelper已经被释放,那它相应的Read()方法还能被调用吗,这肯定不行,所以要将数据库声明连接时的sing(){
 }去掉!

同时应注意正常从数据库读取数据时,ExecuteReader读出的数据是在服务器端,要想读取显示就必须使数据库是连接着的;而DataSet则是用于小量的数据的存储,它是将数据从服务器都出来后,直接放到客户端,服务器连接断开后,它的数据还是存储在客户端的,因而还能被显示出来!!!

注意:在改正运行后,要将数据库关闭,因为没用using(){  }去释放数据库连接,这时手动关闭数据库在上述主程序结尾加上reader.Close();

忙了一下午解决这个问题,正准备写一篇,结果上网看到了相似的问题及解决方法,写的比我还好的多得多!!!!有点心痛哎,原来早有前辈写好了,没办法只有将原创改为转载了!!!呵呵呵...

不过没事,多写一遍就多想一遍记忆就更深一些了,别人也就更快一些的找到此问题的解决方法并掌握它,毕竟多了我这一篇!!那位前辈的相似问题解决方法地址:点击打开链接 如果看我的还理解不了的可以看看这位前辈写的,比我好得多了,哈哈哈...

)的相关问题地址  写的比我好的多了,大家看我这篇写理解的还不够透彻的话,建议看这位前辈的!!!!!!!!!!!!!!

编写SqlHelper使用,在将ExecuteReader方法封装进而读取数据库中的数据时会产生Additional information: 阅读器关闭时尝试调用 Read 无效问题,解决方法与解释的更多相关文章

  1. MVC4中AJAX Html页面打开调用后台方法实现动态载入数据库中的数据

    之前一直用window.onload方法来调用js方法来实现,今天纠结能不能换个方法实现. 非常明显是能够的. 在html前台页面引用js代码例如以下 @Scripts.Render("~/ ...

  2. 使用JDBC从数据库中查询数据的方法

    * ResultSet 结果集:封装了使用JDBC 进行查询的结果 * 1. 调用Statement 对象的 executeQuery(sql) 方法可以得到结果集 * 2. ResultSet 返回 ...

  3. 设置height:100%无效的解决方法

    设置height:100%无效的解决方法 刚接触网页排版的新手,常出现这种情况:设置table和div的高height="100%"无效,使用CSS来设置height:" ...

  4. 安装CentOS、Linux系统时,GPT分区不能引导的解决方法

    安装系统:CentOS 5.9_64bit时,分区后, 提示如下错误. 解决方法: 1.按ctrl+alt+F2 进入命令行 2.先查看分区 sh #fdisk -l    以下假设分区是/dev/s ...

  5. WPF:指定的命名连接在配置中找不到、非计划用于 EntityClient 提供程序或者无效的解决方法

    文/嶽永鹏 WPF 数据绑定中绑定到ENTITY,如果把数据文件做成一个类库,在UI文件中去应用它,可能遇到下面这种情况. 指定的命名连接在配置中找不到.非计划用于 EntityClient 提供程序 ...

  6. 移动端bug~~移动端:active伪类无效的解决方法【移动端 :active样式无效】

    移动端:active伪类无效的解决方法[移动端 :active样式无效]2016-09-26  15:46:50 问题: 移动端开发的时候实现按钮的点击样式变化,但是在iphone[safiri Mo ...

  7. 百度编辑器ueditor 异步加载时,初始化没办法赋值bug解决方法

    百度编辑器ueditor 异步加载时,初始化没办法赋值bug解决方法 金刚 前端 ueditor 初始化 因项目中使用了百度编辑器——ueditor.整体来说性能还不错. 发现问题 我在做一个编辑页面 ...

  8. Easyui中使用jquery或js动态添加元素时出现的样式失效的解决方法

    Easyui中使用jquery或js动态添加元素时出现的样式失效的解决方法 2014-03-27 11:44:46|  分类: Easy UI|举报|字号 订阅     可以使用$.parser.pa ...

  9. 阿里云服务器出现Warning: Cannot modify header information - headers already sent by (output started at 问题的解决方法

    阿里云服务器出现Warning: Cannot modify header information - headers already sent by (output started at 问题的解决 ...

随机推荐

  1. python IDLE 改变窗口背景颜色

    初学Python,想必大家拿来练习最多的IDE就是Python自带的IDLE了,但是默认的代码配色及语法高亮主题确实很不适应. 能不能把IDLE配置成像sublime_text那样的主题呢? 答案是当 ...

  2. 今年暑假不AC[HDU2037]

    今年暑假不AC Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

  3. 游戏 tabpanel

    using UnityEngine; using System.Collections; public class La : MonoBehaviour { private int select; p ...

  4. BZOJ3830 : [Poi2014]Freight

    首先为了保证发车时间都不同,T[i]=max(T[i],T[i-1]+1) 然后设f[i]表示前i列车回来的最早时刻 f[i]=min(max(T[i],f[j]+i-j-1)+s*2+i-j-1) ...

  5. 【BZOJ】1877: [SDOI2009]晨跑(最小费用最大流)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1877 费用流做多了,此题就是一眼题. 拆点表示只能经过一次,容量为1,费用为0. 然后再连边即可,跑 ...

  6. 【BZOJ】1934: [Shoi2007]Vote 善意的投票(网络流/-二分图匹配)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1934 一开始我想到了这是求最小割,但是我认为这题二分图可做,将1的放在左边,0的放在右边,然后朋友连 ...

  7. C#获取机器码(转)

    /// <summary>    /// 机器码    /// </summary>   public class MachineCode    {        ///   ...

  8. "504 Gateway Time-out"

    "504 Gateway Time-out”是什么意思? 意思为:网关超时!

  9. iOS应用程序本地化

    一.简介 * 使用本地化功能,可以轻松地将应用程序翻译成多种语言,甚至可以翻译成同一语言的多种方言 * 如果要添加本地化功能,需要为每种支持的语言创建一个子目录,称为”本地化文件夹”,通常使用.lpr ...

  10. [转] - 如何用QTcpSocket传送图片

    我们知道,tcp网络编程发送数据是利用套接字来实现,将要传输的东西转化为数据流再进行传输,为了确保数据传输的准确性和安全性,我们在发送数据流前发送一个quint32的常量来表示所要发送的数据的大小:当 ...