Access有时无法干净地退出,使MSACCESS.EXE进程在没有可见用户界面的情况下运行(应用程序不再显示在Task的应用程序选项卡中)。
重现此错误所需的最低限度代码是什么?
UPDATE:我发布了一个可靠地再现问题的答案。我将非常感兴趣的其他情况,也可能重复这个问题。I会提出任何成功再现问题的未来答案。我想把这个问题变成一个经过验证的问题库,这样那些将来遇到这个问题的人就会有一个比通常的“关闭所有打开的对象等”的模糊建议更好的解释。
发布于 2014-02-12 15:41:06
我到处搜索这个现象的一个可复制的例子,最后偶然发现了澳大利亚布里斯班的克里斯发布的答案:一些更微妙的..。,我在这里重新发布了他的答案,只是做了很小的修改:
创建一个新表单,并使用以下代码添加一个名为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。
Application.Quit在调用Form_Close事件之前调用了垃圾收集器。
任何Application.Quit命令都将调用垃圾收集器,如果该命令位于另一个窗体上,则无关紧要。
一旦Application.Quit命令调用了垃圾收集器,所有变量都被重置了。然后,Application.Quit命令启动一个关闭序列。如果任何表单是打开的,则尝试关闭它。如果窗体具有Form_Close或Form_Unload事件,则这些事件将触发。当被Application.Quit命令调用时,这些事件将使用已经关闭的PersistentRecordset运行。
因此,如果要查找尚未关闭的记录集,请节省一些时间。查找尝试关闭记录集的记录集并删除该尝试。我们花了很多钱买了垃圾收集器,所以我们应该使用它;它能用。试图自己收集垃圾会导致失败。
但是,任何这样的循环错误,不仅仅是记录集错误,都会导致访问太忙而无法关闭。
克里斯。
我确认这会复制在Windows 7 64位中运行的Access 2002中的错误。
https://stackoverflow.com/questions/21688255
复制相似问题