在多层架构中datareader传递的问题

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


最近碰到一个问题,就是在多层架构中datareader传递的问题。

 

结果发现总是报“阅读器关闭时 read的尝试无效。”,在网上查了两天,因为大多数代码都不涉及datareader传递的问题,我一度认为datareader不能够传递。我是调用了sqlhelper中的代码,所以开始一直没有怀疑过底层代码有什么问题。原来的代码如下:

 

public static DbDataReader ExecuteReader(string sql)
        {
            using (DbConnection conn = GetConncetion())
            {
                DbCommand cmd = GetCommand(conn);
                DbDataReader myReader;
                try
                {
                    conn.Open();
                    SetCommand(cmd, sql, CommandType.Text, COMMANDTIME, null);
                    myReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                    return myReader;
                }
                catch (DbException ex)
                {
                    throw new Exception(ex.Message);
                }

                finally
                {
                    cmd.Dispose();
                    conn.Close();
                }
            }
        }

 

终于今天查到一个帖子,见我的网摘。才发现原来是using的问题。而且finally会在自动关闭conn,而不管reader是否传递。后来我把代码改成如下,终于运行通过了!

 

public static DbDataReader ExecuteReader(string sql)
        {
            //using (DbConnection conn = GetConncetion())
            //{
            DbConnection conn = GetConncetion();
            DbCommand cmd = GetCommand(conn);
            DbDataReader myReader;
            try
            {
                conn.Open();
                SetCommand(cmd, sql, CommandType.Text, COMMANDTIME, null);
                myReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                return myReader;
            }
            catch (DbException ex)
            {
                throw new Exception(ex.Message);
            }

            //    finally
            //    {
            //        cmd.Dispose();
            //        conn.Close();
            //    }
            //}
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值