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

摘要:
当封装ExecuteReader方法以读取数据库中的数据时,将发生额外信息:在读取器关闭时尝试调用read是无效的。当读卡器关闭时,尝试调用Read是无效的。解决方案:}}以前的SqlHelper.cs和以前的SqlHelper.cs之间的区别是删除了创建数据库连接对象的using(){}方法!如果在创建数据库声明时使用了using(){}。

在自学杨中科老师的视频教学时,拓展编写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);

                }
            }
       }

运行出错抛异常如下图:

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

也就是:      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 无效问题,解决方法与解释》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇串口编程-termios编程IDEA中导入多个包自动合并为星号下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

org.codehaus.xfire.fault.XFireFault: Could not read XML stream.. Nested exception is javax.xml.strea

xfire使用中出现故障: 1. [2014-04-16 14:51:07.564]-[ERROR] org.apache.struts2.dispatcher.Dispatcher Exception occurred during processing request: Could not read XML stream.. Nested excep...

【原创】Capture CIS利用Access数据库建立封装库说明

1、在服务器端建立新空间,方便封装库以及数据库的归档存放    服务器路径:\192.168.1.234ShareSTG_LIB,文件夹内容如下,其中Datesheet存放物料数据手册,Pcb_Lib存放Allegro封装,Schematic_Lib存放Capture封装,STG_Datebase存放数据库文件。   2、构建Access数据库 1)打开A...

H5_0009:关于HTML5中Canvas的宽、高设置问题

关于HTML5中Canvas的宽、高设置问题 Canvas元素默认宽 300px, 高 150px, 设置其宽高可以使用如下方法(不会被拉伸): 方法一:        <canvas  height="500"></canvas> 方法二:使用HTML5 Canvas API操作 OK        var canvas...

利用Datafactory实现测试数据快速生成

Datafactory简介 Datafactory(数据工厂)工具是Quest公司(http://www.quest.com)旗下的产品,顾名思义,数据工厂是生产数据的,主要应用领域是性能测试中的大数据量测试, 也就是性能测试数据准备阶段。 DataFactory 是一种快速的,易于产生测试数据的带有直觉用户介面的工具,它能建模复杂数据关系。DataFa...

Windows下MySQL5.7版本中修改编码为utf-8

我们新安装的MySQL数据库默认的字符是 latin1 ,所以每次新建数据库都要修改字符,非常麻烦。所以我们必须将它改成UTF8字符的。 修改方法如下: 一、修改MySQL的my.ini 首先在 ProgramDataMySQLMySQL Server 5.7中找到my.ini文件,然后打开。 注意:①、如果没有ProgramData那就被隐藏了,自行去百...

如何打造高性能大数据分析平台

1.大数据是什么? 大数据是最近IT界最常用的术语之一。然而对大数据的定义也不尽相同,所有已知的论点例如结构化的和非结构化、大规模的数据等等都不够完整。大数据系统通常被认为具有数据的五个主要特征,通常称为数据的5 Vs。分别是大规模,多样性,高效性、准确性和价值性。 据Gartner称,大规模可以被定义为“在本(地)机数据采集和处理技术能力不足以为用户带来...