在自学杨中科老师的视频教学时,拓展编写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. ZOJ1232 Adventure of Super Mario(DP+SPFA)

    dp[u][t]表示从起点出发,到达i点且用了t次magic boot时的最短时间, 方程如下: dp[v][t]=min(dp[v][t],dp[u][t]+dis[u][v]); dp[v][t] ...

  2. Sublime Text 2配置

    gedit用了很久,终于换编辑器了T_T Sublime Text 自行百度谷歌. 一开始我在官网下载的压缩包,然后自己配置.搞了半天后果断删掉...还是用源的自动安装吧.T_T 恩.下面的命令 su ...

  3. c 终端控制

    #include <stdio.h> #include <termios.h> #include <stdio.h> #include <unistd.h&g ...

  4. 斯坦福大学 iOS 开发公开课总结

     斯坦福大学 iOS 开发公开课总结   前言 iPhone 开发相关的教程中最有名的,当数斯坦福大学发布的 "iPhone 开发公开课 " 了.此公开课在以前叫做<iPho ...

  5. Qt中图像的显示与基本操作

    Qt可显示基本的图像类型,利用QImage.QPxmap类可以实现图像的显示,并且利用类中的方法可以实现图像的基本操作(缩放.旋转). 1. Qt可显示的图像类型 参考Qt的帮助文档,可支持的类型,即 ...

  6. hdu Wooden Sticks

    这题是暴力加贪心,算是一道水题吧!只要把l和w从小到大排个序就行了... #include"iostream" #include"stdio.h" #inclu ...

  7. 【iHMI43 4.3寸液晶模块】demo例程(版本1.03)发布

    ============================== 技术论坛:http://www.eeschool.org 博客地址:http://xiaomagee.cnblogs.com 官方网店:h ...

  8. 关于java文件扩展名认识

    ☆ 写在前面 一名新手在历经千辛万苦写好Java程序,怀揣激动的心情去编译和执行java程序时,结果出现错误,什么找不到文件,什么不存在,找不到main方法等等.我在这里就文件后扩展名,也叫文件后缀名 ...

  9. windows服务器。linux服务器的集成包推荐

    我对linux不熟悉,这个有点不好意思,虽然我是做php开发的.我只是对apache+php+mysql的操作熟悉而已,但是linux的服务器配置什么的都太懂 所以我就安装了windows2008,安 ...

  10. [源码]随机获取虾米音乐song_id API文件

    [源码]随机获取虾米音乐song_id API文件 January 11, 2015 注意:此API请放置于国内主机使用,如香港.北京等等,否则会提示:虾米音乐在您所处的国家或地区暂时无法使用 < ...