Access有时无法完全退出,并且在没有可见用户界面的情况下运行MSACCESS.EXE进程(应用程序不再显示在任务管理器的“应用程序”选项卡中)。
重现此错误所需的最少代码是什么?
更新:我发布了一个可靠地重现问题的答案。我会对可能重现问题的其他场景非常感兴趣。 我将提出任何未来成功重现问题的答案。我想将此问题作为导致问题的已验证方案的存储库,以便将来遇到此问题的人有更好的解释然后通常模糊的建议“关闭所有打开的对象等”
答案 0 :(得分:1)
我搜索了这个现象的可重复的例子,最后偶然发现了来自澳大利亚布里斯班的Chris发布的这个答案:Something a little more subtle...我在这里稍微修改了他的回答:
创建一个新表单并添加一个名为cmdShutdown
的命令按钮,其中包含以下代码:
Dim PersistentRS As DAO.Recordset
Private Sub Form_Open(Cancel As Integer)
Set PersistentRS = CurrentDb.OpenRecordset("SELECT * FROM msysobjects")
End Sub
Private Sub cmdShutdown_Click()
Application.Quit ' < This is the culprit.
End Sub
Private Sub Form_Close()
On Error GoTo ErrorHandler
ExitProcedure:
PersistentRS.Close ' < This is all it requires.
Exit Sub
ErrorHandler:
Resume ExitProcedure
End Sub
这个问题不是关于PersistentRecordset被打开,恰恰相反。 事实是垃圾收集器已经完成了它的工作,并且已经关闭了PersistentRecordset。
在调用Form_Close事件之前,Application.Quit调用了垃圾收集器。
任何Application.Quit命令都会调用垃圾收集器,如果该命令在另一个Form上,则无关紧要。
Application.Quit命令调用垃圾回收器后,所有变量都已重置。 然后,Application.Quit命令启动关闭序列。 如果任何表格已打开,则尝试关闭它。 如果表单具有Form_Close或Form_Unload事件,则会触发这些事件。 当Application.Quit命令调用这些事件时,PersistentRecordset已经关闭了。
因此,如果您要查找尚未关闭的记录集,请节省一些时间。查找尝试关闭它们并删除该尝试的记录集。 我们为垃圾收集器付了很多钱,所以我们应该使用它;有用。 尝试自己进行垃圾收集会导致失败。
但是任何这样的循环错误,不仅仅是记录集错误,都会导致Access太忙而无法关闭。
克里斯。
我确认这会重现在Windows 7 64位中运行的Access 2002中的错误。