0

我有一個使用SQL Server 2008的ASP.Net 2.0 Web窗體應用程序。該應用程序有一個UI層和數據訪問層。我使用Enterprise Libray 5.0來保存數據。關閉SqlDataReader

最近我的網站運行速度非常慢,尤其是在頁面上可能有15-20個獨立的讀取數據庫。我非常擔心我的SqlDataReader數據庫連接沒有正確關閉。以下是代碼如何工作的示例。請注意,如果您發現連接泄露方面的任何問題,請告訴我們。

數據訪問類

Public Class DataAccess 

    Private db As Database = DatabaseFactory.CreateDatabase() 

    Public Function ExecuteDataReader(ByVal params() As SqlParameter, ByVal SProc As String) As SqlDataReader 

     Dim i As Integer 
     Dim dr As SqlDataReader = Nothing 
     Dim cmd As DbCommand 

     cmd = db.GetStoredProcCommand(SProc) 
     cmd.CommandTimeout = 120 

     For i = 0 To params.Length - 1 
      db.AddInParameter(cmd, params(i).ParameterName.ToString, params(i).DbType, params(i).Value) 
     Next 

     dr = TryCast(DirectCast(db.ExecuteReader(cmd), RefCountingDataReader).InnerReader, SqlDataReader) 

     Return dr 

    End Function 

UI代碼頁

Dim drSource As SqlDataReader = Nothing 
     Try 
      Dim params(0) As SqlParameter 
      params(0) = New SqlParameter("@applicant_id", Session("ApplicantID")) 
      drSource = DataAccess.ExecuteDataReader(params, "sp_get_date_last_login") 
      If drSource.HasRows Then 
       drSource.Read() 
       'Do code 
      End If 
     Finally 
      If Not (drSource Is Nothing) Then 
       drSource.Close() 
      End If 
     End Try 

背後,我試圖把下面的代碼到我ExecuteDataReader方法,但這然後關閉前SqlDataReader中它有機會做一個閱讀

if (cmd.Connection.State == ConnectionState.Open) 
      cmd.Connection.Close(); 

有人可以看看上面的代碼,讓我知道如何正確關閉我的數據庫連接,或者我已經在做它?

感謝您的幫助人員。

回答

2

您是否嘗試過讓底層調用ExecuteReader來接受CommandBehavior.CloseConnection參數?至少這將確保在DataReader也關閉時連接關閉。這將依賴於從ExecuteDataReader()傳回的DataReader的使用者顯式關閉它或通過Using塊進行處置。

或者,嘗試添加下面的代碼drSource.Close()行之後的背後:

drSource.Connection.Close() 
+0

說着,我剛剛進去看了幫助與EnterpriseLibrary幫助的ExecuteReader()方法沒有辦法做我建議的。該方法的每個重載都有以下警告:'完成後,調用者有責任關閉連接和讀取器。'你需要直接進入ADO.NET來完成我的建議。 –

+0

感謝您的幫助 – tgriffiths

相關問題