超时时间已到。在从池中获取连接之前超时时间已过。出现这种情况可能是因为所有池连接都已被使用并已达到最大池大小。 
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 调试时出现以下语句,我估计是由于连接开的太多造成的,请问各位大虾如何在关闭连接的情况下读取记录?
异常详细信息: System.InvalidOperationException: 超时时间已到。在从池中获取连接之前超时时间已过。出现这种情况可能是因为所有池连接都已被使用并已达到最大池大小。源错误: 
行 10: MyCmd.Parameters("@RETURN_VALUE").Direction =   ParameterDirection.ReturnValue
行 11: MyConn.Open()<----'该行出错
行 13: Dim MyReader As SqlDataReader = MyCmd.ExecuteReader() 

解决方案 »

  1.   

    连接没有处理关闭
    程序中有没有这行 MyConn.Close();
    没有的话加进去
      

  2.   

    还有,SqlDataReader也是要关闭的
      

  3.   

    我知道问题的原因,可是我把连接封装在一个类中,如果在类中关闭Connection,程序将无法读取记录集了。请大家出出主意!!谢谢!
    原码如下: Public Function Get_OrganzationRoot() As System.Data.SqlClient.SqlDataReader     Dim MyConn As SqlConnection = New SqlConnection(ConfigurationSettings.AppSettings("SqlString"))
            Dim MyCmd As SqlCommand = New SqlCommand("p_Get_OrganzationRoot", MyConn)
            MyCmd.CommandType = CommandType.StoredProcedure        MyCmd.Parameters.Add(New SqlParameter("@RETURN_VALUE", SqlDbType.Int, 4))
            MyCmd.Parameters("@RETURN_VALUE").Direction = ParameterDirection.ReturnValue        MyConn.Open()
            Dim MyReader As SqlDataReader = MyCmd.ExecuteReader()        Get_OrganzationRoot = MyReader    End Function
      

  4.   

    没有释放资源,在写程序的时候应当把占用资源的东西释放开来。比如连接、DataSet等
      

  5.   

    问题的原因是与数据库的连接没有显示关闭,而等系统自动回收是要时间的.解决办法
    1.在代码里面,把未关闭的连接关闭
    2.扩大共享池,方法如下:
    解决方法可以是修改连接池的连接生存期,因为默认值是60秒,即连接从应用程序被释放后可以在池中保存的时间。
    改变连接池的大小.在连接字符串的后面加上以下代码:Enlist=true;Pooling=true;Max Pool Size=300;Min Pool Size=0;Connection Lifetime=300;user id=sa;packet size=1000
    packet size参数取512到32767中的任一整数值
      

  6.   

    以下均为C#代码,请自己改成VB代码
    在该类中 先声明MyConn变量
    SqlConnection MyConn=null;然后在方法中改为:   MyConn  = New SqlConnection(ConfigurationSettings.AppSettings("SqlString"))然后单在该类中写一个关闭MyConn 的方法
             /// <summary>
    /// 关闭数据库
    /// </summary>
    /// <param name="Conn"></param>
    public   void ConnClose(SqlCommand Cmd)
    {
    if(Conn!=null)
    {
    if(Conn.State.ToString()!="Closed")
    {
    Cmd.Dispose();
    Conn.Close();
    Conn=null;
    }
    }
    }
    在程序中调用该关闭方法就可以了
    还有一个应急的笨法子:把数据库链接字符串中加上: pooling = false;
    例:
    "uid=sa;pwd=123;database=test;server=localhost;pooling=false"
      

  7.   

    很典型的没有释放资源的原因,应该把每个CONNECTION显示的关闭
      

  8.   

    public class classA
      {
        SqlConnection myConn;
        public void classA()
        {
          myConn=new SqlConnection("……");
        }
        public void Open()
        {
          if(myConn.State.ToString()=="Closed")
            myConn.Open();
        }
        public void Close()
        {
          if(myConn.State.ToString()!="Closed")
            myConn.Close();
        }
        public SqlDataReader Get_OrganzationRoot()
        {
          if(myConn.State.ToString()!="Closed")
          {
            SqlDataReader dr;
            //……
            return dr;
          }
          else
          {
            return null;
          }
        }
      }
    使用
    classA c=new classA();
    c.Open();
    SqlDataReader r=c.Get_OrganzationRoot();
    //……
    c.Close();
      

  9.   

    问题解决了,在此特别感谢seaonce(雨花中的小皮鞋) 以及dolfen(海之豚)的帮助,
    此问题的VB解决方案如下:
        Public MyConn As SqlConnection = Nothing'定义Connection
        Public Function Get_OrganzationRoot() As System.Data.SqlClient.SqlDataReader 
            Conn_Close()
            MyConn = New SqlConnection(ConfigurationSettings.AppSettings("SqlString"))
            ............................'
        End Function
        '关闭connection
        Function Conn_Close()
            If Not IsNothing(MyConn) Then
                MyConn.Dispose()
                MyConn.Close()
                MyConn = Nothing
            End If
        End Function