首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >复制应用程序退出后仍在运行的MSACCESS.EXE进程

复制应用程序退出后仍在运行的MSACCESS.EXE进程
EN

Stack Overflow用户
提问于 2014-02-10 21:25:07
回答 1查看 2.8K关注 0票数 2

Access有时无法干净地退出,使MSACCESS.EXE进程在没有可见用户界面的情况下运行(应用程序不再显示在Task的应用程序选项卡中)。

重现此错误所需的最低限度代码是什么?

UPDATE:我发布了一个可靠地再现问题的答案。我将非常感兴趣的其他情况,也可能重复这个问题。I会提出任何成功再现问题的未来答案。我想把这个问题变成一个经过验证的问题库,这样那些将来遇到这个问题的人就会有一个比通常的“关闭所有打开的对象等”的模糊建议更好的解释。

EN

回答 1

Stack Overflow用户

发布于 2014-02-12 15:41:06

我到处搜索这个现象的一个可复制的例子,最后偶然发现了澳大利亚布里斯班的克里斯发布的答案:一些更微妙的..。,我在这里重新发布了他的答案,只是做了很小的修改:

创建一个新表单,并使用以下代码添加一个名为cmdShutdown的命令按钮:

代码语言:javascript
运行
复制
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中的错误。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21688255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档