【问题标题】:Access close Recordset in error handling在错误处理中访问关闭 Recordset
【发布时间】:2016-07-06 23:20:41
【问题描述】:

我想知道错误处理。如果在代码执行过程中发生错误,并且我打开了一个记录集,我应该关闭它吗?尝试 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

谢谢!

【问题讨论】:

    标签: ms-access error-handling vba


    【解决方案1】:

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

    Dim rs As DAO.Recordset
    
    'do things
    Exit Sub
    
    'do things
    End Sub
    

    ... rs 在 End Sub 处释放,并自动关闭。 (FWIW,你可以通过检查编译的代码看到这一点)。

    经典 ASP 没有这样的范围,对象永远不会超出范围,记录集也永远不会自动释放。因此,所有 Microsoft VBA 示例都显示显式关闭和释放。对于 ASP Classic,必须这样做。

    进行显式关闭和释放还有另外两个原因:

    1) C /C++ 程序员没有自动内存管理。他们对让物体敞开的想法充满了恐惧和厌恶。这是一种编码风格。

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

    【讨论】:

      【解决方案2】:

      是的,最好关闭当前打开的记录集和连接。有很多原因,请参阅:Pooling in the Microsoft Data Access Components。这篇文章很老了,但主要的东西还是保留了......

      我会这样改进你的代码:

      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 对象不是空的。

      【讨论】:

      • 嗯,这很难,那么...谢谢!
      • 我仍然不会将它直接放入错误处理程序中......或者在关闭记录集时除了未设置之外没有其他方法会导致错误?
      • 谢谢。对不起,我有点忙。我在代码中添加了额外的行并改进了错误处理程序。这是我经常使用的一段代码 - 用于一般目的。当然,你可以改变它来捕捉和处理特定的错误号。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-11
      • 1970-01-01
      • 2011-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多