Vba 记录集在试图关闭它时为null或未设置-但我事先检查它是否为null

Vba 记录集在试图关闭它时为null或未设置-但我事先检查它是否为null,vba,ms-access,transactions,dao,Vba,Ms Access,Transactions,Dao,在access应用程序的VBA代码中,有一个函数可以将某些数据库字段转换为另一种格式。这发生在两个表中,在代码中,您可以通过两个循环告诉它们appart,用于BOM和布线。这段代码的性能很差,因为有时会有200000多条记录通过它。为了加快速度,我向它添加了事务——现在它的速度是原来的3倍。然而,当试图关闭路由记录集时,我得到一个错误,说“对象无效或不再设置”。因此,在尝试关闭它之前,我向它添加了两个检查,一个not NOTS和not null。当使用调试器单步执行时,它通过了这两个检查,然后尝

在access应用程序的VBA代码中,有一个函数可以将某些数据库字段转换为另一种格式。这发生在两个表中,在代码中,您可以通过两个循环告诉它们appart,用于BOM和布线。这段代码的性能很差,因为有时会有200000多条记录通过它。为了加快速度,我向它添加了事务——现在它的速度是原来的3倍。然而,当试图关闭路由记录集时,我得到一个错误,说“对象无效或不再设置”。因此,在尝试关闭它之前,我向它添加了两个检查,一个not NOTS和not null。当使用调试器单步执行时,它通过了这两个检查,然后尝试关闭记录集,然后转到ErrorHandler,它给出消息。这个错误之所以特别奇怪,是因为它在关闭第一个循环的BOM记录集时没有问题。 代码:

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

在关闭
工作区之前,您需要关闭
记录集

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

这起作用了。代码现在运行良好,谢谢!我想知道为什么。工作区是否与事务中实例化或更新的所有DAO记录有关?关闭工作区是否会关闭使用所述工作区更新的所有记录集?这有效。代码现在运行良好,谢谢!我想知道为什么。工作区是否与事务中实例化或更新的所有DAO记录有关?关闭工作区是否会关闭使用所述工作区更新的所有记录集?不应关闭当前工作区,就像从不关闭CurrentDb一样。此外,一个常见的规则是始终将对象按与打开对象的顺序相反的顺序设置为“无”。在Access中这很少是一个问题,但在Excel中它可能会引起严重的问题。所以我应该使用全局定义的工作区,定义方式与CurrentDB相同?是的,这样做。您还可以将
CurrentDb
替换为设置为
WorkSpace(0)
的DAO.Database对象。
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