首页 新闻 会员 周边

Invalid attempt to Read when reader is closed

0
悬赏园豆:10 [已解决问题] 解决于 2011-04-11 09:28

系统最近总是不定时的出现:Invalid attempt to Read when reader is closed 和 The connection is closed 这两个错误。下面是报错的代码。

public DataSet SelectDataBySQL(string sql)
        {
            OracleConnection conn = RedOralceDbPool.GetConnection();
            OracleDataAdapter da = new OracleDataAdapter(sql, conn);
            DataSet ds = new DataSet();
            try
            {
                this.Open(conn);
                da.Fill(ds);
            }
            catch (OracleException ex)
            {
                logger.Error(ex.Message);
            }
            finally
            {
                this.Close(conn);
            }
            return ds;
        }

飞的更高2011的主页 飞的更高2011 | 初学一级 | 园豆:174
提问于:2011-04-06 15:16
< >
分享
最佳答案
0

我不知道DataAdapter在底层是否采用DataReader来实现的。

但是你这个错误通常会出现在使用DataReader读取数据的过程中,Connection实例被关闭而造成的。

收获园豆:10
Jerry Chou | 老鸟四级 |园豆:2642 | 2011-04-06 15:36
那我这段代码没有问题吗?我看到很多人说,先返回DataSet,再close.我这里面用了连接池。
飞的更高2011 | 园豆:174 (初学一级) | 2011-04-06 16:13
我昨天也看了一下反编译了一下DataAdapter的源码
在底层,DataAdapter的Fill方法也是使用DataReader来填充数据的。

光看你这段代码,没看出来什么问题。
返回ds和close connection没有严格的顺序,因为ds是一个数据容器,你取得数据后,这些数据和connection没有严格的关系。

不知道你的Fill方法,需要多久才可以返回,如果返回的数据集比较大,那么一种可以是Connection由于timeout而自动关闭。
而这时你的Fill方法还在执行。
Jerry Chou | 园豆:2642 (老鸟四级) | 2011-04-07 09:07
其他回答(1)
0

我啊.net的Winform程序中访问Access数据库时出错的,同样的这个错误。但测试debug下没有这个情况,在Publish发布后测试人员测试到了,怀疑是数据库访问的频繁问题。网上也有人说是用static变量没释放,我只用了int static idx=1;生成文件时递增,但貌似不应是这个原因,网上有人把static去除了也是一样的问题。不知是不是很多用户同时访问数据库导致的。待解决~~

梦幻星空 | 园豆:215 (菜鸟二级) | 2011-12-01 16:56
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册