现在我每次查询数据并且绑定时,都要新建一个SqlConnection对象,并执行ExecuteReader()方法;一直到数据绑定完了后我都没有写代码释放链接,现在出了下面这样的错误,请各位高手帮忙。
异常详细信息: System.InvalidOperationException: 超时时间已到。在从池中获取连接之前超时时间已过。出现这种情况可能是因为所有池连接都已被使用并已达到最大池大小。首先,我需不需要改变我的解决方法?
其次,用现在的方法来做的话,什么时候释放链接(即执行close()方法),怎么样来释放链接?

解决方案 »

  1.   

    用command.ExecuteReader(CommandBehavior.CloseConnection);你可以这么用(参考):
    string sql = "SELECT TrackerID, TrackerName FROM Tracker ORDER BY TrackerID";
    string strCon = System.Configuration.ConfigurationSettings.AppSettings["ConnString"];
    SqlConnection knCon = new SqlConnection(strCon);
    SqlCommand cmd = new SqlCommand(sql, knCon);
    cmd.CommandType = CommandType.Text;
    knCon.Open();
    using (SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
    {
    ddlTracker.DataSource = dr;
    ddlTracker.DataTextField = "TrackerName";
    ddlTracker.DataValueField = "TrackerID";
    ddlTracker.DataBind();
    }
      

  2.   

    执行完查询后马上调用close()方法;
    数据库连接遵循晚打开,早关闭 原则
      

  3.   

    try
    {
    }
    catch(Exception ex)
    {
    }
    finally
    {
        con.close();//con是你创建的连接对象
        con.Dispose();
    }
      

  4.   

    conghui(努力努力再努力)大哥的方法不错。是最稳妥的方法。
      

  5.   

    上面的朋友,那我关闭了链接后,在页面绑定时就没有数据可以读取了。
    异常详细信息: System.InvalidOperationException: 阅读器关闭时 FieldCount 的尝试无效。源错误: 
    行 39:  SqlDataReader dr = commonBz.getCatalogInfo(10);
    行 40:  Repeater1.DataSource = dr;
    行 41:  Repeater1.DataBind();
    行 42:  SqlDataReader dr1 = commonBz.getAllSuccCase();
    行 43:  Repeater2.DataSource = dr1;
     
      

  6.   

    楼主这种实现方法,一种:定义一个proteced的连接对象,在给控件赋完值后,再将连接对象关闭并销毁
    二种:可以作为一个输出(out)参数,同样在赋完值后,将其再销毁。
    不知楼主能否明白偶的意思。
      

  7.   

    use:return command.ExecuteReader(CommandBehavior.CloseConnection);in your business layer :)
      

  8.   

    利用using语句比如
    using(SqlDataReader dr = commonBz.getCatalogInfo(10))
    {
    Repeater1.DataSource = dr;
    Repeater1.DataBind();
    SqlDataReader dr1 = commonBz.getAllSuccCase();
    Repeater2.DataSource = dr1;
    }
    这样就可以释放这个SqlDataReader
      

  9.   

    Imports System.Data
    Imports System.Data.SqlClientPublic Class ConnDatabase
        Private Function GetConnString() As String
            Dim myConn As String = "Server=.;User ID=sa;Password=1111;Database=music"
            Return myConn
        End Function
        Private Function CarateCommand(ByVal Sql As String, ByVal Param() As SqlParameter, ByVal SqlCmdType As CommandType) As SqlCommand
            Dim myConn As New SqlConnection(GetConnString())
            Dim myCommand As New SqlCommand(Sql, myConn)
            myCommand.CommandType = SqlCmdType
            Dim ParamTemp As SqlParameter
            If Not Param Is Nothing Then
                For Each ParamTemp In Param
                    myCommand.Parameters.Add(ParamTemp)
                Next
            End If
            Try
                myConn.Open()
                Return myCommand
            Catch ex As Exception
                Return Nothing
            End Try
        End Function
        Public Overloads Function ExecuteSP(ByVal ProcName As String, ByVal Param() As SqlParameter, ByVal myDataset As DataSet) As Boolean
            Dim myCommand As SqlCommand = CarateCommand(ProcName, Param, CommandType.StoredProcedure)
            Dim myDataAdapter As SqlDataAdapter = New SqlDataAdapter(myCommand)
            Try
                myDataAdapter.Fill(myDataset)
                Return True
            Catch ex As Exception
                Return False
            End Try
        End Function
        Public Overloads Function ExecuteSP(ByVal ProcName As String, ByVal Param() As SqlParameter) As Boolean
            Dim myCommand As SqlCommand = CarateCommand(ProcName, Param, CommandType.StoredProcedure)
            Try
                myCommand.ExecuteNonQuery()
                Return True
            Catch ex As Exception
                Return False
            End Try
        End Function
        Public Overloads Function ExecuteSP(ByVal ProcName As String, ByVal Param() As SqlParameter, ByRef myDataReader As SqlDataReader) As Boolean
            Dim myCommand As SqlCommand = CarateCommand(ProcName, Param, CommandType.StoredProcedure)
            Try
                myDataReader = myCommand.ExecuteReader
                Return True
            Catch ex As Exception
                Return False
            End Try
        End Function
    End Class