传递给调用方法时,在Access中关闭ADO记录集的正确方法是什么?

问题描述:

我使用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

我不确定什么是正确,要么。我尝试了一种调用代码创建连接对象并将其传递给函数的方法。调用者负责处理连接和记录集对象。它很快就会变脏,因为我不想投入更多资金,只是为了发现我的方法只是简单的头脑。

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