封装一个获取SqlDataReader的方法,在调用时报错:“阅读器关闭时尝试调用 Read 无效”

标签: sql
9人阅读 评论(0) 收藏 举报
分类:

哇,这个问题真的好烦啊,在出现这个问题后查了好久的资料,最终在ID为“zhang_wj123”的大佬博客中发现了思路,在此感谢大佬

首先贴代码

{
        SqlConnection conn = new SqlConnection();
        string connStr = @"Data Source = TAOR\TAOR;Initial Catalog = 02.车辆; Integrated Security = True";
        //string connStr = "Data Source=.;Initial Catalog=02.车辆;Integrated Security=True";

        //方法一:只读查询所需数据
        public SqlDataReader GetReader(string sql_a, SqlParameter[] para)
        {
            conn = new SqlConnection(connStr);
            conn.Open();
            SqlCommand com_a = new SqlCommand(sql_a, conn);

            foreach (SqlParameter parameter in para)
            {
                com_a.Parameters.Add(parameter);
            }

            /*另一种思路
            for(int i=1;i<=para.Length;i++)
            {com_a.Parameters.AddRange(para);}
            */

            /*第三种思路
            com_a.Parameters.AddRange(para);//添加参数组
            */

            SqlDataReader RD_a = com_a.ExecuteReader();
            RD_a.Close();
            conn.Close();
            return RD_a;//此处出现问题
        }
}

RT,觉得上面啰嗦的话,核心代码即

conn = new SqlConnection(connStr);
            conn.Open();
            SqlCommand com_a = new SqlCommand(sql_a, conn);

            foreach (SqlParameter parameter in para)
            {
                com_a.Parameters.Add(parameter);
            }

            SqlDataReader RD_a = com_a.ExecuteReader();
            RD_a.Close();
            conn.Close();
            return RD_a;//此处出现问题

这是用GetReader 来获取一个SqlDataReader。但是在调用运行后会显示“阅读器关闭时尝试调用 Read 无效”

这是因为Reader与DataSet不同,DataSet已经将数据保存在本地内存中,而Reader并没有将数据保存在本地内存中。

出了封装的范围后,con.close()生效后,返回的sqldataReader毫无用处,其只能在连接范围内使用

此时不能关闭连接,也不能保持连接打开状态。很多系统为了解决这样两难的境地,只能放弃使用Reader模式的数据源,或者把连接对象交给方法调用者,以便进行关闭。


解决这个问题的方法很简单

CommandBehavior.CloseConnection

通过这句代码,即可以完成我们想要的功能。

这句代码的作用是能够保证当SqlDataReader对象被关闭时,其依赖的连接也会被自动关闭。

即只有在调用的sqldataReader关闭后,连接才会关闭

因此代码修改如下,即可以解决问题

SqlDataReader RD_a = com_a.ExecuteReader(CommandBehavior.CloseConnection);
            return RD_a;
            
            /*修改为上述代码
            RD_a.Close();
            conn.Close();
            return RD_a;//此处出现问题
            */
RT。


附:附带主函数部分代码如下:

private void button1_Click(object sender, EventArgs e)
        {
            double miles;
            string ChePai;
            string result=null;
            
            miles = Convert.ToDouble(textBox2.Text);
            ChePai = textBox1.Text;

            string str1 = null;
            str1 = "select LeiXing from Vehicle where ChePai=@chepai";

            //这里的地方用于循环添加新的sqlparameter的值
            SqlParameter[] str_sqlPara =
            {
                new SqlParameter("@chepai",SqlDbType.NChar,10),
            };
            str_sqlPara[0].Value = ChePai;
            
            SQLDataHelper reResult = new SQLDataHelper();//实例化一个对象为自建的sqldatahelper类
            SqlDataReader dr = reResult.GetReader(str1, str_sqlPara);
            
            while (dr.Read())
            {
                result = dr[0].ToString();
            }
            
            Vehicle v = null;
            //设定汽车 公交 卡车 依次为1 2 3 
            if (result == "1") v = new Car();
            if (result == "2") v = new Bus();
            if (result == "3") v = new Truck();
            label4.Text = ChePai + "号 收费" + v.JinE(miles) + "元";

            dr.Close();
        }


查看评论

错误提示:阅读器关闭时READ的尝试无效

从数据访问层中返回的SqlDataReader为何不可用?错误提示:阅读器关闭时READ的尝试无效分析:在finally中关闭了数据库连接对象,无论任何原因退出try块的时候,都会执行finally里...
  • mydriverc
  • mydriverc
  • 2007-07-24 13:33:00
  • 1615

SqlDataReader的关闭问题,报错:“阅读器关闭时尝试调用 HasRows 无效”

最近在练习一个ADO.NET三层架构验证用户名登录密码时出现报错:“阅读器关闭时尝试调用 HasRows 无效” 百度了好多文章才得到解决: 先来看SqlHelper获取SqlDataReader p...
  • weixin_39125665
  • weixin_39125665
  • 2017-11-06 09:27:59
  • 134

阅读器关闭时尝试调用Read无效

就是SqlDataReader sdrEmp=cmdEmp.ExecuteReader();这行出错,阅读器关闭时尝试调用Read无效,堆栈我添加了一个类,然后在WebForm1里拽了个DropDow...
  • h57020877
  • h57020877
  • 2010-10-27 20:44:00
  • 1147

使用ExecuteReader时报错“阅读器关闭时尝试调用Read无效”的解决办法

问题描述是在写ASP.NET webform的时候遇到的问题。 在三层架构的DAL层有两个类,一个是FolderDal,一个是DBHelper。 想在FolderDal的GetGridViewDa...
  • Dandelion_drq
  • Dandelion_drq
  • 2016-01-23 17:41:35
  • 2779

SqlDataReader的问题

Author : 菜菜Team   : FreeXploiTDate   : 2005-07-06Site   : http://blog.csdn.net/freexploit有个存储过程ALTER...
  • freexploit
  • freexploit
  • 2005-06-17 16:13:00
  • 1801

阅读器关闭时read的尝试无效-解决方法

问题现象:1用SQL打开其中一张表,打不开了,报的错是: 阅读器关闭时read的尝试无效 ,然后,后来好像还报这个错,可是报完那个错,表数据后来是显示出来了。2用SQL 的select 语句查询说是"...
  • sealyna
  • sealyna
  • 2009-12-21 16:01:00
  • 2582

阅读器关闭时尝试调用 FieldCount 无效异常

阅读器关闭时尝试调用+FieldCount+无效 RepeaterContactList.DataSource = GetList(); RepeaterContactList.DataBin...
  • ArvinStudy
  • ArvinStudy
  • 2012-03-16 15:29:17
  • 1514

阅读器关闭时 Read 的尝试无效。

  • 2009年10月14日 13:28
  • 2KB
  • 下载

阅读器关闭时尝试调用 FieldCount无效[解决方案]

错误:阅读器关闭时尝试调用 FieldCount无效。 情景:在用SqlDataReader sdr = cmd.ExecuteReader();返回查询结果时报错 原因:还没等返回SqlDataRe...
  • z1119815468
  • z1119815468
  • 2013-05-09 11:49:08
  • 2074

SqlDataReader 关闭问题:阅读器关闭时尝试调用 Read 无效

最近学习了一下ADO.NET,我想封装一个获取SqlDataReader的方法供别处调用, 但是遇到了一些问题,最后找到了解决方法。 封装的时候如果用using{}将连接及执行等过程括起来,这样可...
  • fyq_2011
  • fyq_2011
  • 2011-12-28 12:57:47
  • 778
    个人资料
    等级:
    访问量: 58
    积分: 52
    排名: 168万+
    文章分类
    文章存档