平时自己用着没事,当访问的人数多的时候会出现
在每个SqlDataReader中都用using扩起来了,helper中也用ExecuteReader(CommandBehavior.CloseConnection)了,出现:1.已有打开的与此命令相关联的 DataReader,必须首先将它关闭
2.ExecuteReader 要求已打开且可用的连接。连接的当前状态为正在连接。
等错误,如何解决?

解决方案 »

  1.   

    using后,出了{}就销毁了。那么你其他地方用到这个对象就会出现问题。
    你应该在SqlDataReader调用完了后,确认是都调用完了。在close(),然后Dispose().就行了。
      

  2.   

    using就是标示出了这个方法体,该对象标示为要销毁。如果被销毁了,那你其他地方调用到的肯定就有问题。
      

  3.   

    using不是相当于close了么?using(datareader=helper.exreader(sql)){
      while(..){
      ..
      }
    }
    这个样子不对么?如果错着呢,正确的如怎么写?能给写个小例子么
      

  4.   

    using扩起来 本人强烈要求不要要应该这样
    try{
    ..
    }
    catch()
    {...}
    fin..{...}原因方便写日记,和处理
      

  5.   

    一般来说 都是close(),然后Dispose().就行了
      

  6.   

      public override void Undo()
            {
                SetButtonMode(MaintenanceMode.Read);
                this.butSearch.Enabled = true;
                disableControl();
                base.Undo();
            }
           
            /// <summary>
            /// 保存过程
            /// </summary>
            /// <returns></returns>
            private bool _DoSaved()
            {
                
                DataTable dt=(DataTable)binSearch.DataSource;            bool blnSave = true;              _db.Connect();
                  _db.BeginTransaction();
                  try
                  {                  for (int i = 0; i < dt.DefaultView.Count; i++)//主撞颜色表
                      {                      switch (dt.DefaultView[i].Row.RowState)
                          {
                              case DataRowState.Modified:                              IDbCommand insCmd = _db.GetCommand("usp_UpdOrderPlanning");
                                  insCmd.CommandType = CommandType.StoredProcedure;
                                  insCmd.Parameters.Add(_db.GetParameter("@intOrderID", dt.DefaultView[i].Row["OrderID"]));
                                  insCmd.Parameters.Add(_db.GetParameter("@TeamID", dt.DefaultView[i].Row["TeamID"]));
                                  insCmd.Parameters.Add(_db.GetParameter("@dPlanWIPStart", dt.DefaultView[i].Row["dPlanWIPStart"]));
                                  insCmd.Parameters.Add(_db.GetParameter("@dCutting", dt.DefaultView[i].Row["dCutting"]));
                                  insCmd.Parameters.Add(_db.GetParameter("@dPlanWIPFinish", dt.DefaultView[i].Row["dPlanWIPFinish"]));
                                  insCmd.Parameters.Add(_db.GetParameter("@dWIPStart", dt.DefaultView[i].Row["dWIPStart"]));
                                  insCmd.Parameters.Add(_db.GetParameter("@cSewingStatus", dt.DefaultView[i].Row["cSewingStatus"]));
                                  insCmd.Parameters.Add(_db.GetParameter("@cTeamRe", dt.DefaultView[i].Row["cTeamRe"]));
                                  insCmd.Parameters.Add(_db.GetParameter("@dPacking", dt.DefaultView[i].Row["dPacking"]));
                                  insCmd.Parameters.Add(_db.GetParameter("@EditedBy",GlobalService.LoginSession.UserID));
                                  insCmd.Parameters.Add(_db.GetParameter("@dBOM", dt.DefaultView[i].Row["dBOM"]));                              insCmd.Parameters.Add(_db.GetParameter("@dPaperSample", dt.DefaultView[i].Row["dPaperSample"]));
                                  insCmd.Parameters.Add(_db.GetParameter("@dPlanPur", dt.DefaultView[i].Row["dPlanPur"]));                              insCmd.Parameters.Add(_db.GetParameter("@dMaterialRece", dt.DefaultView[i].Row["dMaterialRece"]));                              insCmd.Parameters.Add(_db.GetParameter("@dMainMatReqPur", dt.DefaultView[i].Row["dMainMatReqPur"]));
                                  insCmd.Parameters.Add(_db.GetParameter("@dMainMatIssue", dt.DefaultView[i].Row["dMainMatIssue"]));
                                  insCmd.Parameters.Add(_db.GetParameter("@cMainMatStatus", dt.DefaultView[i].Row["cMainMatStatus"]));
                                  insCmd.Parameters.Add(_db.GetParameter("@cSupMatStatus", dt.DefaultView[i].Row["cSupMatStatus"]));
                                  insCmd.Parameters.Add(_db.GetParameter("@cRes", dt.DefaultView[i].Row["cRes"]));                              insCmd.Parameters.Add(_db.GetParameter("@WipCompleted", dt.DefaultView[i].Row["WipCompleted"]));                              insCmd.ExecuteNonQuery();                              break;                      }
                      }                  _db.CommitTransaction();              }
                  catch (Exception ex)
                  {
                      _db.RollbackTransaction();
                      blnSave = false;
                      MessageBox.Show(ex.Message);
                  }
                  finally
                  {
                      _db.Disconnect();
                  }
                  return blnSave;
            }
      

  7.   

    是相当于close。不过你在其他地方有调用到你写的这个方法吗?还有你方法的返回值是不是SqlDataReader
      

  8.   

    楼上是插入啊,我说的是executeReader啊,插入我这个没问题
    还有就是不是说using相当于close掉了么,难道有什么问题?
      

  9.   

    判断是下当前connection是否处于连接状态,如果是的话,就不用open,否则open
      

  10.   

    先关闭以前用的CONN,再打开就行了
      

  11.   

    helper中加入判读了
    if (connection == null)
                    {
                        connection = new SqlConnection(connectionString);
                        connection.Open();
                    }
                    else if (connection.State == System.Data.ConnectionState.Closed)
                    {
                        connection.Open();
                    }
                    else if (connection.State == System.Data.ConnectionState.Broken)
                    {
                        connection.Close();
                        connection.Open();
                    }
                    return connection;
      

  12.   

    你把你那个using的整个函数发上来看一下吧
      

  13.   


    using(SqlDataReader dataReader = DBHelper.ExecuteReader(sql, p))
    {
         if (dataReader.Read())
         {
                        u.Id = Convert.ToInt32(dataReader["Id"]);
         }
    }//helper
    public static SqlDataReader ExecuteReader(string safeSql)
            {
                    SqlCommand cmd = new SqlCommand(safeSql, Connection);
                    SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                    return reader;
            }
      

  14.   

    我的做法很简单,连接每次使用完毕以后,就关闭。如果实在要纠结USING语句,那么可以换成使用,然后关闭。我控制台程序的做法是这样的,多线程环境下:
    锁定数据库连接对象。然后连接,执行,完了以后关闭。。释放对象。
      

  15.   

    using(SqlDataReader dataReader = DBHelper.ExecuteReader(sql, p))
    {
         if (dataReader.Read())
         {
                        u.Id = Convert.ToInt32(dataReader["Id"]);
         }
    }
    这个函数贴完整
      

  16.   

    把using都换成close还是有错“锁定数据库连接对象。然后连接,执行,完了以后关闭。。释放对象”
    怎么锁定?
      

  17.   

    public static List<SMSList> GetSMS(string sql)
    {
                try
                {
                    List<SMSList> smsList = new List<SMSList>();                using(SqlDataReader dataReader = DBHelper.ExecuteReader(sql))
                    {
                      while (dataReader.Read())
                      {
                        SMSList sms = new SMSList();
                        sms.User = Convert.ToInt32(dataReader["User"]);
                        sms.Id = Convert.ToInt32(dataReader["Id"]);
                        sms.Mobiles = dataReader["Mobiles"].ToString();
                        sms.Message = dataReader["Message"].ToString();
                        sms.State = Convert.ToInt32(dataReader["State"]);
                        sms.SendTime = Convert.ToDateTime(dataReader["SendTime"]);                    smsList.Add(sms);
                      }
                    }
                    return smsList;
                }
                catch (Exception ex)
                {
                    er.WriteSensitive(ex);
                    return null;
                }
            }就这个样子咯
      

  18.   

    好啦,谢谢大家了,的确connection应该在加个判断,如果是打开的先关掉再打开
    这样对么?这样就不报错了,只是这个helper是老师给的,我觉得不应该在这种地方会有错误吧,哎~