"rs.close" and/or "Set rs = Nothing"

3

最佳实践问题:

问:在我的子程序结束时,我应该同时关闭打开的记录集并设置“Set rs = Nothing”,还是仅使用“Set rs = Nothing”就足够了?(我目前使用的是混合模式)

Private Sub btnSave_Click()

    Dim db As Database
    Dim rs As DAO.Recordset

    Set db = CurrentDb
    Set rs = db.OpenRecordset("Desc_Mfg_Norm", dbOpenTable)

    'do stuff

Exit:

    rs.Close
    Set rs = Nothing
    Set db = Nothing

exit sub

首先,这是rs.close()。其次,将两者合二为一,一个关闭对象,另一个释放内存。 - Parfait
是的,谢谢您的澄清。这是我的抄写错误。 - Mark Pelletier
在每个“End Sub”和“End Function”处自动执行“Set EVERYTHING = Nothing”,这就是巫术编程。以下是关于VBScript(复制VBA)的信息。 - ACatInLove
@ACatInLove,您是在暗示既不需要“rs.close”,也不需要“set rs = nothing”吗? - Mark Pelletier
1
不,仅在结束子程序/函数之前将对象设置为无效只是巫术编程,没有任何作用。它的起源实际上是来自一个非常古老的有缺陷的 ADO 版本。如果您按照我给您提供的链接中的链接,您会发现这些信息。剪切和粘贴编程会使巫术实践得以延续。 - ACatInLove
显示剩余2条评论
3个回答

3
答案是两者都不需要。它们是Access 1.x2.0的VBA前身Access Basic的剩余物。
在VBA中,垃圾收集器会为您清理它们。
但是,许多人 - 包括我在内 - 仍然使用它们来表示您不打算在函数后面使用该对象 - 实际上是Close方法。
请注意,第三方对象 - 如ActiveX组件和Excel - 通常必须关闭和终止。这也说明了使用命令的好处 - 在编码时养成习惯。

1
人们倾向于将您所做的称为“最佳实践”,但您可以绕过关闭方法来遵守所有最佳实践。来自官方文档:

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

来源:https://msdn.microsoft.com/zh-cn/library/office/ff836011.aspx

我仍在研究。普遍共识似乎表明,“rs.close”或“Set rs = Nothing”可能都不需要,因为垃圾回收和变量释放可能会在它们在子程序结束时超出范围时处理(请参见上面发布的链接)。我很快就会标记正确答案。 - Mark Pelletier
马克,如果我打扰了你的细节,请原谅。我想指出的是(即,如果我的想法是正确的):我们应该假设你问了“我需要多少勺咖啡粉才能用200毫升水制作我的饮料?” 对此,我回答你:“两个满汤匙”。然后,在过程中你发现你喜欢甜咖啡。尊重您,您仍在“研究”需要多少糖才能制作好饮料,但最初的问题是:“多少勺咖啡”。 - statosdotcom
当然,您完全没有义务,但是为了尊重您从一开始处理事情的顺序,也许需要编辑原始问题或接受我的答案并打开另一个问题来澄清糖的数量。我还想额外提醒一下:这个平台stackoverflow及其所有功能都是完全免费的。谢谢并致以最好的问候。 - statosdotcom

0

我采用以下解决方案:
rs.Close。
如果rs不是Nothing,则设置rs = Nothing。

请记住,关闭的Recordset可能会重新打开(我在某些情况下使用它)。 此外,关闭您打开的所有内容是一个好习惯...垃圾收集器可能会完成工作...也可能不会...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接