我用了一个frameset,其中有2个页面加载时要同时查询数据库,就是2个方法,然后出现异常:已有打开的与此命令相关联的 DataReader,必须首先将它关闭我分别在2个方法加上断点调试,发现有时候交叉执行,有时候却是正常的一个方法执行完再执行另一个方法。怎么回事?

解决方案 »

  1.   

    别用DataReader,用DataAdapter填充DataSet方式获取数据如果你真要DataReader,不要用同一个connection对象,用两个connection对象就可以同时DataReader
      

  2.   

    主要原因是 DataReader 在打开使用时,一个 SqlConnection 只允许打开一个 DataReader,在开启另一个 DataReader 时,必须将前面一个先 Close 掉。    using (myCmd = new SqlCommand(mySql, myConn))
    13        {
    14            try
    15            {
    16                myCmd.Parameters.AddRange(parameters);
    17                myAdapter = new SqlDataAdapter(myCmd);
    18                myTable.Clear();
    19                myAdapter.Fill(myTable);
    20            }
    21            catch
    22            {
    23                connClose();
    24            }
    25            finally
    26            {
    27                connClose();
    28            }
      

  3.   

    你不用DataReader,还不行?
    不会吧
      

  4.   

    这是2个页面报的异常:
    阅读器关闭时 Read 的尝试无效。 
    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.InvalidOperationException: 阅读器关闭时 Read 的尝试无效。源错误: 
    行 262:                cmd.Parameters.AddRange(param);
    行 263:                SqlDataAdapter adapter = new SqlDataAdapter(cmd);
    行 264:                adapter.Fill(ds);
    行 265:            }
    行 266:    
     
    ************************************************************************
    已有打开的与此命令相关联的 DataReader,必须首先将它关闭。 
    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.InvalidOperationException: 已有打开的与此命令相关联的 DataReader,必须首先将它关闭。源错误: 
    行 262:                cmd.Parameters.AddRange(param);
    行 263:                SqlDataAdapter adapter = new SqlDataAdapter(cmd);
    行 264:                adapter.Fill(ds);
    行 265:            }
    行 266:            catch (System.Data.SqlClient.SqlException ex)
     
      

  5.   

    你这错误的意思是connection对象已经关闭了(估计是另一个页面关闭的),但是你的DataReader还在尝试读,所以有异常