“rs.close”和/或“设置 rs = 无”
Posted
技术标签:
【中文标题】“rs.close”和/或“设置 rs = 无”【英文标题】:"rs.close" and/or "Set rs = Nothing" 【发布时间】:2017-12-29 01:34:19 【问题描述】:最佳实践问题:
问:在我的 Subs 结束时,我是否应该同时关闭打开的 Recordset 和“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()
。其次,当一个关闭对象而另一个从内存中释放它时,两者都做。
是的,感谢您的澄清。我的转录错误。
Set EVERYTHING = Nothing
在每个End Sub
和End Function
都会自动完成,巫毒编程也是如此。这是关于 VBScript(复制 VBA)的信息。
@ACatInLove,您是否建议明确要求“rs.close”或“set rs = nothing”?
不,只是在结束子/函数之前将对象设置为空是巫毒编程并且什么都不做。它的起源实际上是一个非常古老的错误版本的 ADO。如果您按照我提供的链接中的链接进行操作,您会找到该信息。剪切和粘贴编程使巫术实践得以延续。
【参考方案1】:
答案是两者都不需要。它们是 Access Basic 的遗留物,Access 1.x 和 2.0 的 VBA 的前身。
在 VBA 中,垃圾收集器会为您清理它们。
但是很多人——通常包括我——仍然使用它们来表示你不(打算)在函数的后面使用该对象——实际上是 Close 方法。
但请注意,第三方对象(例如 ActiveX 组件和 Excel)通常必须关闭并终止。这也说明了使用命令 - 使其成为编码时的习惯。
【讨论】:
【参考方案2】:人们倾向于将您正在做的事情称为“最佳实践”,但您可以绕过尊重所有最佳实践的 close 方法。来自官方文档:
An alternative to the Close method is to set the value of an object variable to Nothing (Set dbsTemp = Nothing).
来源:https://msdn.microsoft.com/en-us/library/office/ff836011.aspx
【讨论】:
我还在研究。普遍的共识似乎表明“rs.close”或“Set rs = Nothing”可能都不需要,因为垃圾收集和变量释放可能会在它们超出子末尾的范围时进行处理(参见上面发布的链接)。我会尽快标记正确答案。 马克,如果我在细节上打扰你,请见谅。我想指出的是(即,如果我的想法是正确的):我们是否应该假设您已经问过“我需要提供多少勺咖啡粉才能用 200 毫升水冲泡我的饮料?”。为此,我回答了你:“两个完整的汤匙”。然后,在这个过程的中间,你发现你喜欢甜咖啡。恕我直言,您“仍在研究”您需要多少糖才能制作出好饮料,但最初的问题是:“多少勺咖啡”。 当然你完全没有义务,但是,为了尊重你从事情一开始就放的东西的顺序,可能是编辑原始问题的情况或接受我的回答并打开另一个以清除多少糖。另外我想记住:这个平台,***,以及它的所有功能,都是完全免费的。谢谢你和最好的问候。【参考方案3】:我选择的解决方案 rs.关闭。 如果 Not rs 是 Nothing,则设置 rs=Nothing。
请记住,关闭的 Recordset 可能会重新打开(我在某些情况下使用它)。 关闭您打开的所有内容也是一个好习惯...垃圾收集器可能会完成这项工作...可能不会......
【讨论】:
以上是关于“rs.close”和/或“设置 rs = 无”的主要内容,如果未能解决你的问题,请参考以下文章
如何查询数据库连接不释放,和java程序一直进行链接,这种问题怎么处理
java连接mysql出现异常No operations allowed after connection closed,怎么破?