VBA道.尝试关闭记录集时为空或未设置 - 但我事先检查它是否为空



在访问应用程序的VBA代码中,有一个函数可以将某些数据库字段转换为另一种格式。这发生在 2 个表上,在代码中,您可以通过 2 个循环告诉它们分配,用于 BOM 和路由。此代码的性能很差,因为有时有 200000+ 条记录通过它。为了加快速度,我向其添加了交易 - 现在快了 3 倍。但是,当尝试关闭路由记录集时,我收到一条错误消息,指出"对象无效或不再设置"。因此,我在尝试关闭它之前向它添加了 2 个检查,一个不是没有也不是空。使用调试器单步执行时,它会通过两次检查,然后尝试关闭记录集,然后转到提供消息的错误处理程序。使此错误格外奇怪的是,它关闭第一个循环的 BOM 记录集没有问题。 法典:

Public Sub SomeSub()
' set up variables
Dim BOM As DAO.Recordset
Dim ROUTING As DAO.Recordset
Dim Workspace As DAO.Workspace
Set Workspace = DBEngine.Workspaces(0)
' set up errorhandler
On Error GoTo ErrorHandler
' run some process on BOM
Set BOM = CurrentDb.OpenRecordset("some query;", dbOpenDynaset, dbSeeChanges, dbOptimistic)
Workspace.BeginTrans
If Not (BOM.BOF And BOM.EOF) Then
BOM.MoveFirst
Do While (Not BOM.EOF) And (Not BOM.BOF)
' Do some stuff with BOM here
BOM.MoveNext
Loop
End If
Workspace.CommitTrans
BOM.Close
Set BOM = Nothing

Set ROUTING = CurrentDb.OpenRecordset("some query;", dbOpenDynaset, dbSeeChanges, dbOptimistic)
Workspace.BeginTrans
If Not (ROUTING.BOF And ROUTING.EOF) Then
ROUTING.MoveFirst
Do While (Not ROUTING.EOF)
' Do some stuff with ROUTING here
ROUTING.MoveNext
Loop
End If
Workspace.CommitTrans
Workspace.Close
If Not ROUTING Is Nothing Then
If Not ROUTING Is Null Then
ROUTING.Close
End If
End If
GoTo SuccesHandler
ErrorHandler:
MsgBox "Ran into error. Info: " & Err.number & ": " & Err.DESCRIPTION & vbNewLine
Resume SuccesHandler
SuccesHandler:
End Sub

问题: - 为什么会发生此错误? - 空/无检查的正确方法是什么?(显然我这样做的方式不起作用?

您需要在关闭Workspace之前关闭Recordset

Workspace.CommitTrans
If Not ROUTING Is Nothing Then
ROUTING.Close
Set ROUTING= Nothing
End If
Workspace.Close
Set Workspace = Nothing

我会调整该块以匹配有效的块 - 并将工作区处理移出块:

Set ROUTING = CurrentDb.OpenRecordset("some query;", dbOpenDynaset, dbSeeChanges, dbOptimistic)
Workspace.BeginTrans
If Not (ROUTING.BOF And ROUTING.EOF) Then
ROUTING.MoveFirst
Do While (Not ROUTING.EOF)
' Do some stuff with ROUTING here
ROUTING.MoveNext
Loop
End If
Workspace.CommitTrans
ROUTING.Close
Set ROUTING = Nothing
Set Workspace = Nothing

最新更新