MS Access VBA:对象变量是否在不使用时是必需的,超出了它们的声明范围?

时间:2016-12-17 19:32:30

标签: vba variables object ms-access

我经常看到代码示例,这些代码示例经历了对象变量的声明,设置,调用和任何相关清理的繁琐且可能令人困惑的过程,否则,在没有变量的情况下工作正常 - 最重要的是,在该函数专用的变量。

在撰写完整参考资料时,这一点是否真的有必要呢?

我听说过,代码更容易阅读,运行速度更快。前者是高度主观的,后者,我还没有真正注意到。

实例;

Public Sub TransactionExample()

    Dim wrkSpaceVar As DAO.Workspace
    Dim dbVar As DAO.Database

    Set wrkSpaceVar = DBEngine(0)
    Set dbVar = CurrentDb

    On Error GoTo trans_Err
    wrkSpaceVar.BeginTrans

    dbVar.Execute "SomeActionQuery", dbFailOnError
    dbVar.Execute "SomeOtherActionQuery", dbFailOnError

    wrkSpaceVar.CommitTrans

    trans_Exit:
    wrkSpaceVar.Close
    Set dbVar = Nothing
    Set wrkSpaceVar = Nothing

Exit Sub

trans_Err:
    wrkSpaceVar.Rollback
    MsgBox "Transaction failed. Error: " & Err.Description
    Resume trans_Exit
End Sub

VS

Public Sub TransactionExample()

    On Error GoTo trans_Err
    DAO.DBEngine.BeginTrans

    CurrentDb.Execute "SomeActionQuery", dbFailOnError
    CurrentDb.Execute "SomeOtherActionQuery", dbFailOnError

    DAO.DBEngine.CommitTrans

Exit Sub

trans_Err:
    DAO.DBEngine.Rollback
    MsgBox "Transaction failed. Error: " & Err.Description
End Sub

我不是要求将变量设置为“Nothing”;我问他们是否有必要。并且,在所提供的示例的范围内,必要是值得的。

1 个答案:

答案 0 :(得分:2)

简而言之,不 - 没有必要将它们存储在局部变量中,因为两个代码示例中的引用都是相同的。您设置为局部变量的原因是为了避免必要的对象解除引用调用。在您的示例中,DAO.DBEngine被调用三次。每个实际上都是一个函数调用,它带有一些处理开销来检索你正在使用的对象引用。在您的顶部示例中,该函数调用仅在一次时进行,并且结果将缓存在局部变量引用中。

如果您不想声明局部变量,可以通过在With块中包含使用相同引用的代码来执行相同的操作:

Public Sub TransactionExample()
    With DBEngine(0)
        On Error GoTo trans_Err
        .BeginTrans
        With CurrentDb
            .Execute "SomeActionQuery", dbFailOnError
            .Execute "SomeOtherActionQuery", dbFailOnError
        End With
        .CommitTrans
trans_Exit:
        .Close
        Exit Sub

trans_Err:
        .Rollback
        MsgBox "Transaction failed. Error: " & Err.Description
        Resume trans_Exit
    End With
End Sub

除非你正在做大量的工作(即广泛地进行循环),否则无论你使用哪种方法,性能差异都可以忽略不计。

注意 - 无需将变量设置为Nothing。运行时会在离开范围时处理它。