在多层架构中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();
            //    }
            //}
        }

你可能感兴趣的:(在多层架构中datareader传递的问题)