现在我每次查询数据并且绑定时,都要新建一个SqlConnection对象,并执行ExecuteReader()方法;一直到数据绑定完了后我都没有写代码释放链接,现在出了下面这样的错误,请各位高手帮忙。
异常详细信息: System.InvalidOperationException: 超时时间已到。在从池中获取连接之前超时时间已过。出现这种情况可能是因为所有池连接都已被使用并已达到最大池大小。首先,我需不需要改变我的解决方法?
其次,用现在的方法来做的话,什么时候释放链接(即执行close()方法),怎么样来释放链接?
异常详细信息: System.InvalidOperationException: 超时时间已到。在从池中获取连接之前超时时间已过。出现这种情况可能是因为所有池连接都已被使用并已达到最大池大小。首先,我需不需要改变我的解决方法?
其次,用现在的方法来做的话,什么时候释放链接(即执行close()方法),怎么样来释放链接?
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();
}
数据库连接遵循晚打开,早关闭 原则
{
}
catch(Exception ex)
{
}
finally
{
con.close();//con是你创建的连接对象
con.Dispose();
}
异常详细信息: 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;
二种:可以作为一个输出(out)参数,同样在赋完值后,将其再销毁。
不知楼主能否明白偶的意思。
using(SqlDataReader dr = commonBz.getCatalogInfo(10))
{
Repeater1.DataSource = dr;
Repeater1.DataBind();
SqlDataReader dr1 = commonBz.getAllSuccCase();
Repeater2.DataSource = dr1;
}
这样就可以释放这个SqlDataReader
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