Ms access 在错误处理中访问关闭记录集

Ms access 在错误处理中访问关闭记录集,ms-access,error-handling,vba,Ms Access,Error Handling,Vba,我想知道如何处理错误。如果在代码执行期间发生错误,并且我打开了一个记录集,我应该关闭它吗?尝试recordset.close操作可能会引发错误,因为我在错误处理代码部分中,所以这将是一个未处理的错误 如果我将代码发送回另一个标签继续,那么它可以成为无限循环。现在,添加一个布尔值来检查这是否是第一次出现错误会起作用,但我真的需要所有这些麻烦吗如果代码终止而我不关闭连接,连接会保持打开状态吗?以后会不会引起麻烦? Dim rs As DAO.Recordset Set rs = CurrentDB

我想知道如何处理错误。如果在代码执行期间发生错误,并且我打开了一个记录集,我应该关闭它吗?尝试recordset.close操作可能会引发错误,因为我在错误处理代码部分中,所以这将是一个未处理的错误

如果我将代码发送回另一个标签继续,那么它可以成为无限循环。现在,添加一个布尔值来检查这是否是第一次出现错误会起作用,但我真的需要所有这些麻烦吗如果代码终止而我不关闭连接,连接会保持打开状态吗?以后会不会引起麻烦?

Dim rs As DAO.Recordset

Set rs = CurrentDB.OpenRecordset("SELECT * FROM tblSetting")
On Error GoTo handler

    'do things

rs.Close
Set rs = Nothing

Exit Sub

handler:
 rs.Close
 'Set rs = Nothing '-this one is not necessary, as terminating the sub should clear up all references to it, hence Garbage Collector can pick it up
End Sub
这是可行的,但是。。。真的吗

...
Termination:
  rs.Close
  Set rs = Nothing
Exit Sub

handler:
 if ErrorHappened=True then
  msgbox "fatal error"
  exit sub
 else
  ErrorHappened=True
  resume termination
 End If

谢谢大家!

是的,关闭当前打开的记录集和连接是一种很好的做法。原因很多,请参见:。这篇文章很老了,但主要内容保留了下来

我将通过以下方式改进您的代码:

Exit_Subroutine:
    On Error Resume Next 'ignore errors to be able to execute each line
    If Not rst is Nothing Then rst.Close: Set rst = Nothing
    'do the same for the connection object!
    Exit Sub

ErrorHandler:
    MsgBox Err.Description, vbCritical, "Error" & Err.Number
    Resume Exit_Subroutine

您必须确保
rst
对象不是空的,然后才能尝试关闭它。

VBA具有自动垃圾收集功能。除非VBA编译器内部出现问题,否则所有对象都会在超出范围时释放。在您的示例中:

Dim rs As DAO.Recordset

'do things
Exit Sub

'do things
End Sub
。。。rs在末端接头处释放,并自动关闭。(FWIW,您可以通过检查编译后的代码看到这一点)

经典ASP没有这样的作用域,对象从未超出作用域,记录集也从未自动释放。因此,所有Microsoft VBA示例都显示显式关闭和释放。它必须这样做的ASP经典

执行显式关闭和释放还有两个其他原因:

1) C/C++程序员没有自动内存管理。一想到要把东西打开,他们就充满了恐惧和厌恶。这是一种编码风格


2) 有些人声称,在某些无法识别的错误情况下,没有剩余引用的本地对象不会自动正确关闭。我从来没见过。我从来没有见过这样的记录。我从来没有读过一个具体的例子。但是,有人这么说:也许这是真的。

好吧,这是一个艰难的过程,那么。。。谢谢不过我还是不会直接把它放到错误处理程序中。。。或者,在关闭记录集时,除了未设置记录外,其他任何内容都不会导致错误?谢谢。对不起,我有点忙。我在代码中添加了额外的行,并改进了错误处理程序。这是我经常使用的一段代码,用于一般目的。当然,您可以将其更改为捕获并处理特定的错误号。