什么是记录集中rs.close vs rs = nothing之间的区别

时间:2010-03-30 02:12:09

标签: ms-access vba recordset

我经常发现在何时适合使用时会感到困惑:

rs.Close 

反对

Set rs = Nothing

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

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

4 个答案:

答案 0 :(得分:16)

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

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

答案 1 :(得分:11)

Close方法摧毁了内存结构。

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

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

因此,为了确保您不会受到内存泄漏或由隐式和未发布引用引起的奇怪错误,您Close并设置为Nothing

答案 2 :(得分:5)

根据官方文档:

,您可以将Recordset设置为Nothing,而无需调用Close
  

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

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

答案 3 :(得分:0)

根据我的经验,如果重新定义的对象(以下称为“ RS”)是在本地(在函数/过程中,以下称为“ B”)声明的,则不会传递到B所在的位置是安全的,建议关闭RS并将其设置为B内的任何内容;但在以下情况下:

  1. RS是作为A的B参数参数(byval或byref)之一传递的。
  2. RS在B中声明,并将成为B使用的B的返回值之一。

B中的RS仅应在不关闭的情况下设置为空,否则返回给A(或作为A的一个参数发送到B的记录集)的对象也将被关闭并且不进行任何设置,从而使其无法访问A,即使您预先将RS返回A,然后在B中关闭!