传递给调用方法时,在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
方法
我想知道的是我应该关闭记录集并将其设置为等于无。我是否在两个地方都做而不需要?只是寻找最佳实践。谢谢。
答
我不确定什么是正确,要么。我尝试了一种调用代码创建连接对象并将其传递给函数的方法。调用者负责处理连接和记录集对象。它很快就会变脏,因为我不想投入更多资金,只是为了发现我的方法只是简单的头脑。
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
就我所见,你有两个不同的记录集,所以都需要关闭yesno? – Fionnuala 2010-06-29 15:01:36
没有声明返回类型的函数表示模糊思考某人沿线的某个人。如果你想要一个变体(这是默认的返回类型),那么明确地声明它是一个变体。但是你不在这里,你希望它成为一个ADO.Recordset。请参阅下面的@ HansUp解决方案,这在我看来是正确的方法。 – 2010-06-29 22:08:22
谢谢大卫!你说得很好。我创建了函数来说明我的观点,忘记了包含ADODB.Recordset的返回类型。接得好。 – webworm 2010-06-30 19:25:55