2010-06-29 100 views
3

我使用Access 2003通過ADO訪問存儲在SQL Server數據庫中的數據。我經常使用存儲過程獲取數據。我通過ADO在一個單獨的函數中執行存儲過程,該函數返回一個記錄集。當從一個函數返回記錄集時,哪裏是關閉記錄集的最佳位置,並釋放它在內存中的位置?它在返回記錄集的函數中完成,還是在調用執行ADO代碼的函數的子/函數中完成?下面是一個例子...傳遞給調用方法時,在Access中關閉ADO記錄集的正確方法是什麼?

這裏是調用方法

Public Sub CallingMethod() 
    Dim rs As ADODB.Recordset 
    Set rs = GetDataFromDatabase() 
    Set myListBox.Recordset = rs 
    rs.Close 
    Set rs = Nothing 
End Sub 

下面是實際執行存儲過程,並將其返回給調用方法

Public Function GetDataFromDatabase() 
    Dim cnn As ADODB.Connection 
    Dim rs As ADODB.Recordset 

    Set cnn = New ADODB.Connection 
    cnn.ConnectionString = myConnectionString 
    cnn.Open 

    Set rs = New ADODB.Recordset 
    Set rs.ActiveConnection = cnn 
    rs.Source = "EXEC uspMyStoredProcedure" 

    rs.LockType = adLockOptimistic 
    rs.CursorType = adOpenStatic 
    rs.CursorLocation = adUseClient 
    rs.Open 

    Set GetDataFromDatabase = rs 

    Set rs = Nothing 
    Set cnn = Nothing 

End Function 
方法

我想知道的是我應該關閉記錄集並將其設置爲等於無。我是否在兩個地方都做而不需要?只是尋找最佳實踐。謝謝。

+0

就我所見,你有兩個不同的記錄集,所以都需要關閉yesno? – Fionnuala 2010-06-29 15:01:36

+3

沒有聲明返回類型的函數表示模糊思考某人沿線的某個人。如果你想要一個變體(這是默認的返回類型),那麼明確地聲明它是一個變體。但是你不在這裏,你希望它成爲一個ADO.Recordset。請參閱下面的@ HansUp解決方案,這在我看來是正確的方法。 – 2010-06-29 22:08:22

+0

謝謝大衛!你說得很好。我創建了函數來說明我的觀點,忘記了包含ADODB.Recordset的返回類型。接得好。 – webworm 2010-06-30 19:25:55

回答

5

我不確定什麼是正確,要麼。我嘗試了一種調用代碼創建連接對象並將其傳遞給函數的方法。調用者負責處理連接和記錄集對象。它很快就會變髒,因爲我不想投入更多資金,只是爲了發現我的方法只是簡單的頭腦。

Public Sub test_GetDataFromSP() 
    Dim cnn As ADODB.Connection 
    Dim rs As ADODB.Recordset 

    Set cnn = New ADODB.Connection 
    cnn.ConnectionString = "DRIVER=SQL Server;SERVER=VM2003\SQLEXPRESS;" & _ 
     "Trusted_Connection=Yes;DATABASE=Inventory" 
    cnn.Open 
    Set rs = GetDataFromSP("GetCenterCodes", cnn, "14, 14, 501") 
    rs.MoveLast 
    Debug.Print rs.RecordCount 
    rs.Close 
    Set rs = Nothing 
    cnn.Close 
    Set cnn = Nothing 
End Sub 

Public Function GetDataFromSP(ByVal pProc As String, _ 
    ByRef pConnection As ADODB.Connection, _ 
    Optional ByVal pArguments As String) As ADODB.Recordset 

    Dim rs As ADODB.Recordset 
    Dim strStatement As String 

    strStatement = "EXEC " & pProc 
    If Len(pArguments) > 0 Then 
     strStatement = strStatement & " " & pArguments 
    End If 
    strStatement = strStatement & ";" 
    Set rs = New ADODB.Recordset 
    Set rs.ActiveConnection = pConnection 
    rs.Source = strStatement 
    rs.LockType = adLockOptimistic 
    rs.CursorType = adOpenStatic 
    rs.CursorLocation = adUseClient 
    rs.Open 
    Set GetDataFromSP = rs 
End Function 
相關問題