【问题标题】:Whats the difference between rs.close vs rs = nothing in a RecordSetrs.close vs rs = nothing in a RecordSet 有什么区别
【发布时间】:2011-02-02 07:14:58
【问题描述】:

我经常对何时适合使用感到困惑:

rs.Close 

反对

Set rs = Nothing

我可以理解需要关闭与源的连接,但是当变量超出范围时我应该同时使用两者吗?

我可以将变量设置为 Nothing 以跳过关闭连接的步骤吗?这会被认为是一种不好的做法吗?

【问题讨论】:

  • 如果您使用With OpenRecordset ... End With 模式,则该对象是临时的。无需手动关闭它或将其设置为空。这样可以非常明确地定义范围。

标签: ms-access vba recordset


【解决方案1】:

通过使用“关闭”方法,您正在关闭与数据库的连接,但仍在内存中,您可以使用“打开”方法再次打开。

另一方面,将记录集设置为“无”会完全从内存中释放对象。

【讨论】:

  • 那么,做一个会绕过做另一个的需要吗?
  • 并非如此,尽管您可以绕过将记录集设置为空并且不会遇到任何错误。只是最好的做法是在关闭记录集后将记录集设置为空,尤其是当您对该记录集没有用处或者您将不会再次访问相同的记录集时。
  • 您的答案是指数据库连接,但问题使用了记录集。数据库变量与其他变量不同,您可以安全地使用它们取决于它们的初始化方式(CurrentDB 与 DBEngine(0)(0))。使用记录集变量,关闭记录集根本不会关闭数据库连接。
【解决方案2】:

Close 方法拆除内存结构。

将变量设置为Nothing 会清除指向该内存结构的指针。

理论上,清除指针应该释放指针所指的内存,因为 VBA 使用引用计数来确定何时可以释放内存。不幸的是,各种事情都可能出错,引用计数最终可能会失控,即使应该释放内存也不会释放。

因此,为了确保您不会受到内存泄漏或隐式和未释放引用引起的怪异错误的影响,您既可以使用Close,也可以设置为Nothing

【讨论】:

    【解决方案3】:

    根据官方文档,您可以将 Recordset 设置为 Nothing,而无需调用 Close:

    Close 方法的替代方法是将对象变量的值设置为 Nothing(设置 dbsTemp = Nothing)。

    更多信息:Recordset.Close Method (DAO)

    【讨论】:

      【解决方案4】:

      好吧,根据我自己的经验,如果recorset对象(以下简称“RS”)是在本地(在函数/过程中,以下简称“B”)声明的,并且不会被传递到B所在的位置被称为(以下简称“A”),安全,建议在B内部关闭并设置RS为空;但在以下情况:

      1. RS 作为来自 A 的 B(byval 或 byref)的参数参数之一提供
      2. RS 在 B 中声明,是 B 的返回值之一,供 A 使用

      B 中的 RS 应该只设置为空而不关闭它,否则返回给 A(或作为 A 的参数之一发送给 B)的记录集对象也将被关闭并且不设置任何内容,使其无法访问A,就算你提前把RS还给了A,然后在B关了!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-27
        • 1970-01-01
        • 1970-01-01
        • 2017-04-29
        • 1970-01-01
        • 1970-01-01
        • 2011-05-23
        相关资源
        最近更新 更多