Правильный способ закрыть набор записей ADO в Access при переходе к вызывающему методу? - PullRequest
4 голосов
/ 29 июня 2010

Я использую Access 2003 для доступа к данным, хранящимся в базе данных SQL Server, через ADO. Чаще всего я получаю данные с помощью хранимых процедур. Я выполняю хранимые процедуры через ADO в отдельной функции, которая возвращает набор записей. При возврате набора записей из функции, где лучше всего закрыть набор записей и освободить его, удерживая в памяти? Это делается в функции, которая возвращает набор записей, или в подпрограмме / функции, которая вызывает функцию, выполняющую код 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

Что мне интересно, так это то, где я должен закрывать набор записей и устанавливать его равным нулю. Я делаю это в обоих местах без необходимости? Просто ищу лучшие практики. Спасибо.

1 Ответ

5 голосов
/ 29 июня 2010

Я не уверен, что правильно , либо. Я попробовал подход, при котором вызывающий код создает объект подключения и передает его функции. Вызывающая сторона отвечает за удаление объектов подключения и набора записей. Это быстро и грязно, потому что я не хотел вкладывать в это больше, только чтобы узнать, что мой подход просто туповат.

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
...