系统的运行环境是:.net framework 2.0 ,sql server 2000(sp4),windows 2000;
当在线的人数不多时,基本上没错,人稍微多点就会有一些奇怪的错误,请大家帮忙解决,谢谢~!@错误一:
用户IP:192.168.7.242
计算机名:192.168.7.242
发生时间:2008-1-10 10:38:04
发生异常页: http://192.168.0.2:8088/TaskAdd.aspx
异常信息: 已有打开的与此命令相关联的 DataReader,必须首先将它关闭。错误源:System.Data
堆栈信息:   在 System.Data.SqlClient.SqlInternalConnectionTds.ValidateConnectionForExecute(SqlCommand command)
   在 System.Data.SqlClient.SqlConnection.ValidateConnectionForExecute(String method, SqlCommand command)
   在 System.Data.SqlClient.SqlCommand.ValidateCommand(String method, Boolean async)
   在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
   在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
   在 System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
   在 System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
   在 System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
   在 System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
   在 System.Data.Common.DbDataAdapter.Fill(DataTable[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior)
   在 System.Data.Common.DbDataAdapter.Fill(DataTable dataTable)
   在 DataAccess.Archives.SelectArchivesDynamic(String WhereCondition, String OrderByExpression) 位置 f:\oasys\App_Code\DataAccess\Archives.cs:行号 60
   在 Bussiness.ArchivesBLL.SelectArchivesDynamic(String WhereCondition, String OrderByExpression) 位置 f:\oasys\App_Code\Bussiness\ArchivesBLL.cs:行号 43
   在 TaskDispatch.DropDispatchOrg_SelectedIndexChanged(Object sender, EventArgs e) 位置 f:\oasys\TaskAdd.aspx.cs:行号 80
   在 System.Web.UI.WebControls.ListControl.OnSelectedIndexChanged(EventArgs e)
   在 System.Web.UI.WebControls.DropDownList.RaisePostDataChangedEvent()
   在 System.Web.UI.WebControls.DropDownList.System.Web.UI.IPostBackDataHandler.RaisePostDataChangedEvent()
   在 System.Web.UI.Page.RaiseChangedEvents()
   在 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
------------------------------------------------------------
Archives.cs的那个函数 /// <summary>
        /// 根据条件查询档案
        /// </summary>
        /// <param name="WhereCondition"></param>
        /// <param name="OrderByExpression"></param>
        /// <returns></returns>
        public DataTable SelectArchivesDynamic(string WhereCondition, string OrderByExpression)
        {
            DataTable dt = new DataTable();
            SqlCommand comm = new SqlCommand("SelectArchivesDynamic", conn.Conn);
            comm.CommandType = CommandType.StoredProcedure;
            comm.Parameters.Add("@WhereCondition", SqlDbType.NVarChar, 500);
            comm.Parameters["@WhereCondition"].Value = WhereCondition;
            comm.Parameters["@WhereCondition"].Direction = System.Data.ParameterDirection.Input;
            comm.Parameters.Add("@OrderByExpression", SqlDbType.NVarChar, 250);
            comm.Parameters["@OrderByExpression"].Value = OrderByExpression;
            comm.Parameters["@OrderByExpression"].Direction = System.Data.ParameterDirection.Input;
            SqlDataAdapter adapter = new SqlDataAdapter(comm);
            adapter.Fill(dt); //就是这行报错了,
            //adapter.Dispose();
            if (conn.Conn.State == ConnectionState.Open)
                conn.Conn.Close();
            return dt;
        }问题是我在整个系统中都没有用
DataReader这个类,而且有时候刷新下又好了,到底是怎么回事啊?

解决方案 »

  1.   

    就是说你的conn.Conn被某个DataReader对象占用了.如果想继续使用这个连接,你必须关闭并再次打开它
      

  2.   

    SqlDataReader是单向的只读的数据流,在你使用下一个SqlDataReader前必须关闭上一个SqlDataReader
    dr1.close
      

  3.   

    回一楼
    但是整个系统中我没有用到DataReader对象啊,而且有时刷新下就好了
    我该到那里去关闭DataReader对象呢
      

  4.   

    查你的程序中使用SqlDataReader对象的地方,看看使用后,加上关闭代码,假设 
    SqlDataReader reader = null;
    reader = ....
    if(reader != null)// 还有个壮态忘了怎么写的了, reader.State != SqlDataReader.Closed
    {
      reader.Close();
    }
      

  5.   

    数据库的连接已经关了,大家可以看最后一行啊 
    if   (conn.Conn.State   ==   ConnectionState.Open) 
                                    conn.Conn.Close(); 整个系统中我没有用到DataReader对象啊,而且有时刷新下就好了 
    我该到那里去关闭DataReader对象呢 希望大家看看代码
      

  6.   

    这个一定要成对出现:
    Connection1.Open()
    Connection1.Close()
    还有:
    SqlDataReader.Close()
      

  7.   

    SqlDataReader 中必须是关闭以后才在做其它sql操作.因此 SqlDataReader不能镶嵌其它sql操作,仔细检查一下
      

  8.   

    回复大家:

    整个系统中我没有用到DataReader对象啊,而且有时刷新下就好了   
    我该到那里去关闭DataReader对象呢   

      

  9.   

     DataTable   dt   =   new   DataTable(); 
     SqlCommand   comm   =   new   SqlCommand("SelectArchivesDynamic",   conn.Conn); 
     comm.CommandType   =   CommandType.StoredProcedure; 
     comm.Parameters.Add("@WhereCondition",   SqlDbType.NVarChar,   500);
     comm.Parameters["@WhereCondition"].Value   =   WhereCondition; 
     comm.Parameters["@WhereCondition"].Direction   =   System.Data.ParameterDirection.Input; 
     comm.Parameters.Add("@OrderByExpression",   SqlDbType.NVarChar,   250); 
     comm.Parameters["@OrderByExpression"].Value   =   OrderByExpression; 
     comm.Parameters["@OrderByExpression"].Direction   =   System.Data.ParameterDirection.Input;  
     SqlDataAdapter   adapter   =   new   SqlDataAdapter(comm); 
     
    adapter.Fill(dt); //修改一下,试试呢 SqlDataReader.Close() ;
       
    if   (conn.Conn.State   !=   ConnectionState.Close) 
             conn.Conn.Close(); 
      

  10.   

    回复17:SqlDataReader.Close()   ; 
    这个我的系统中没有啊,怎么关闭呢
      

  11.   

    回复17:
    if       (conn.Conn.State       !=       ConnectionState.Close)   
                      conn.Conn.Close(); 
    如果conn.Conn.State的状态处于其他的状态,但是还关闭是不是会有其他的错误啊
      

  12.   

    那就if(conn.Conn.State==ConnectionState.Open)关闭呗
      

  13.   

    返回sqldatareder的时候用cmd.ExecuteReader(CommandBehavior.CloseConnection);
    用完dr.close(),可以关闭conn实在找不着,换用sqlhelper这种类来操作试试
      

  14.   

    回复大家:谢谢大家的热情帮忙啊~!@
    我的所有的数据库连接完后,如果状态是打开的都关闭了
     if   (conn.Conn.State   ==   ConnectionState.Open) 
                     conn.Conn.Close();
    还有整个系统中没有用到DataReader对象,我该怎么关闭呢。
    一般情况下,人不多时都是好的,有时刷新又是好的。
      

  15.   

    以前我在网上看漫画的时候http://comic.92wy.com/go/
    是用.net2.0开发的
    晚上高峰的时候看着看着就出你这个问题!刷一下又好了!
    后来这个网站说已经解决了这个问题!
    你可以问问他们站长是怎么解决的
      

  16.   

    有开就有关http://topic.csdn.net/u/20080111/16/5a227b5a-0257-43ca-9908-51211e44b238.html?seed=28940548
      

  17.   

    DataTable内部也是由DataReader完成填写的,所以可能报错还是因为没有急时关连接吧.还是看看其它代码吧
      

  18.   


    public   DataTable   SelectArchivesDynamic(string   WhereCondition,   string   OrderByExpression) 
                    { 
                            DataTable   dt   =   new   DataTable(); 
                            if   (conn.Conn.State   !=   ConnectionState.Closed) 
                                    conn.Conn.Close(); 
                            conn.Conn.Open(); 
                            SqlCommand   comm   =   new   SqlCommand("SelectArchivesDynamic",   conn.Conn); 
                            comm.CommandType   =   CommandType.StoredProcedure; 
                            comm.Parameters.Add("@WhereCondition",   SqlDbType.NVarChar,   500); 
                            comm.Parameters["@WhereCondition"].Value   =   WhereCondition; 
                            comm.Parameters["@WhereCondition"].Direction   =   System.Data.ParameterDirection.Input; 
                            comm.Parameters.Add("@OrderByExpression",   SqlDbType.NVarChar,   250); 
                            comm.Parameters["@OrderByExpression"].Value   =   OrderByExpression; 
                            comm.Parameters["@OrderByExpression"].Direction   =   System.Data.ParameterDirection.Input; 
                            SqlDataAdapter   adapter   =   new   SqlDataAdapter(comm); 
                            adapter.Fill(dt);   //就是这行报错了, 
                            //adapter.Dispose(); 
                            if   (conn.Conn.State   !=   ConnectionState.Closed) 
                                    conn.Conn.Close(); 
                            return   dt; 
                    } 
    改成上面试试~
      

  19.   

    comm.CommandType   =   CommandType.StoredProcedure; 
                            comm.Parameters.Add("@WhereCondition",   SqlDbType.NVarChar,   500); 
                            comm.Parameters["@WhereCondition"].Value   =   WhereCondition; 
                            comm.Parameters["@WhereCondition"].Direction   =   System.Data.ParameterDirection.Input; 
                            comm.Parameters.Add("@OrderByExpression",   SqlDbType.NVarChar,   250); 
                            comm.Parameters["@OrderByExpression"].Value   =   OrderByExpression; 
                            comm.Parameters["@OrderByExpression"].Direction   =   System.Data.ParameterDirection.Input; 
                            SqlDataAdapter   adapter   =   new   SqlDataAdapter(comm); 
    应该是在里面出了问题!你出现了2次ADD 可能这个操作就涉及到了DataReader了
      

  20.   

    to: ringwangjx 不知道你的问题 有没有解决掉?
    你可以试下 30楼的解决方案。
      

  21.   

    System.Data.Common.DbDataAdapter.Fill内部使用了datareader。
    你的代码中,conn不知道是sqlconn还是oledbconn?如果是后者,并且你的oledb驱动如果不新,那么在最后if(conn.Conn.State这句上,会有问题。
    还有一个问题,你的代码没有使用异常处理机制,可能会有某种异常导致程序中断,而还没有执行到你的conn.Close上。
    SqlCommand   comm   =   new   SqlCommand("SelectArchivesDynamic",   conn.Conn); 
    这句不建议这么做,不要用全局的conn.Conn,用一个临时变量,重新初始化这个conection,然后在finally里面Close。最大的可能性,你仔细检查你所有的代码,看哪里忘记调用conn.Close了;其次,在所有数据库操作的地方,加上try/catch/finally处理。有不清楚的,可以msn我:[email protected]
      

  22.   

    用全局的conn,很容易导致你在别的地方打开或者关闭了这个conn。
      

  23.   

    问题早解决了
    如35楼所说,是因为设置了全局静态的conn的问题
    把static去掉就好了,不过这个是我自己试出来的
    但是还是要感谢大家
      

  24.   

    我和楼主同样的问题,问题已经解决,就是因为使用了全局静态变量的原因
    我用的sqlhelper,方法改成这个就好了.public static DataTable GetDataSet(string safeSql)
            {
                string connectionString = ConfigurationManager.ConnectionStrings["TaxDB"].ConnectionString;
                SqlConnection conn = new SqlConnection(connectionString);
                try
                {
                    DataSet ds = new DataSet();
                    SqlCommand cmd = new SqlCommand(safeSql, conn);
                    SqlDataAdapter da = new SqlDataAdapter(cmd);
                    da.Fill(ds);
                    return ds.Tables[0];
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    conn.Close();
                }
            }
      

  25.   

    目前项目也出现楼主所述,出现此问题如35楼所说的用了全局conn
      

  26.   

    我也遇见了这问题 我把conn.close() datareader.close()都用了 也还是报同样的错误