在自学杨中科老师的视频教学时,拓展编写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. BZOJ1580 : [Usaco2009 Hol]Cattle Bruisers 杀手游戏

    以贝茜为参照物,则贝茜固定于原点,每个杀手是一个圆心在某条射线上的圆. 解出每个杀手可以射杀贝茜的时间区间,然后扫描线即可,时间复杂度$O(n\log n)$. #include<cstdio& ...

  2. BZOJ3251 : 树上三角形

    BZOJ AC1000题纪念~~~ 将x到y路径上的点权从小到大排序 如果不存在b[i]使得b[i]+b[i+1]>b[i+2]则无解 此时b数列增长速度快于斐波那契数列,当达到50项时就会超过 ...

  3. TopCoder SRM 588 DIV2 KeyDungeonDiv2

    简单的题目 class KeyDungeonDiv2 { public: int countDoors(vector <int> doorR, vector <int> doo ...

  4. java定时器的使用

    定时器类Timer在java.util包中.使用时,先实例化,然后使用实例的schedule(TimerTask task, long delay)方法,设定指定的任务task在指定的延迟delay后 ...

  5. C# int转byte[],byte[]转int

    第一种方法: byte数组转int u = (uint)(b[0] | b[1] << 8 |b[2] << 16 | b[3] << 24); int转byte数 ...

  6. [原]Android Studio查询SHA1的方法

    前提:C:\Users\Administrator\AndroidStudioProjects文件夹中存在xxx.jks秘钥文件,比如: 进入Android Studio的Terminal: Micr ...

  7. 使用新的AppleID更新Xcode

    为了免下载安装Xcode,安装时使用了别人提供的Xcode.dmg安装,而非使用自己账号在AppStore下载的. 这样的安装模式会出现一个问题,更新Xcode时AppStroe会提示让你输入下载该X ...

  8. Excel中如何在两个工作表中查找重复数据

    有时我们可能会在两种工作表中查找重复记录,当数据记录很多时,就必须通过简单的方法来实现.下面小编就与大家一起分享一下查看重复记录数据的方法,希望对大家有所帮助. 方法/步骤   为了讲解的需要,小编特 ...

  9. Nginx 笔记与总结(14)expires 缓存设置

    设置缓存,可以提高网站性能. 当网站的部分内容,比如新闻站的图片,一旦发布就不太可能发生更改,此时需要用户在访问一次页面之后,把该页面的图片缓存在用户的浏览器端一段时间,就可以用到 nginx 的 e ...

  10. 完美解决VS2003.Net fatal error LNK1201: 写入程序数据库“.pdb”时出错

    我的开发环境是Win7旗舰64位+VS2003.Net,经常卡pdb错误,文末给出一个完美的解决方案和一个懒人补丁包.问题描述如下:在重新编译的时候,经常报错: fatal error LNK1201 ...