【问题标题】:Intermittent error when attempting to control another database尝试控制另一个数据库时出现间歇性错误
【发布时间】:2010-09-09 09:12:15
【问题描述】:

我有以下代码:

Dim obj As New Access.Application
obj.OpenCurrentDatabase (CurrentProject.Path & "\Working.mdb")
obj.Run "Routine"
obj.CloseCurrentDatabase
Set obj = Nothing

我正在试验的问题是一个弹出窗口,告诉我 Access 无法将焦点设置在其他数据库上。从代码中可以看出,我想在另一个 mdb 中运行一个 Subroutine。任何其他方式来实现这一点将不胜感激。

我正在使用 MS Access 2003。

这是一个间歇性错误。由于这是每月仅运行一次的生产代码,因此极难重现,我目前无法为您提供确切的文本和编号。这是发生这种情况的第二个月。

我怀疑当有人在使用这个或其他数据库时可能会发生这种情况。

数据流是每月在一个数据库中更新一次所有“项目”,然后在另一个数据库中提供此信息。

也许是因为“例程”代码中的第一行: If vbNo = MsgBox("你想更新吗?", vbYesNo, "更新") Then 退出函数 结束如果

我将制作另一个没有 MsgBox 的子例程。

我已经能够重现这种行为。当焦点必须转移到调用的数据库时会发生这种情况,但用户将焦点 ([ALT]+[TAB]) 设置在第一个数据库上。 “解决方案”是教育用户。


这是一个间歇性错误。由于这是每月仅运行一次的生产代码,因此极难重现,我目前无法为您提供确切的文本和编号。这是发生这种情况的第二个月。

我怀疑当有人在使用这个或其他数据库时可能会发生这种情况。

数据流是每月在一个数据库中更新一次所有“项目”,然后在另一个数据库中提供此信息。

也许是因为“例程”代码中的第一行: If vbNo = MsgBox("你想更新吗?", vbYesNo, "更新") Then 退出函数 结束如果

我将制作另一个没有 MsgBox 的子例程。


我已经在我们的开发数据库中尝试过这个,它可以工作。这并不意味着什么,因为其他代码在开发中也可以正常工作。

【问题讨论】:

  • 我从未见过 Access 给出那个特定的错误消息。我已经看到“您没有打开数据库的权限”和“Access 无法设置焦点”一个对象,但没有看到您声明的错误消息。您能否发布错误号和确切的错误消息?我怀疑,正如 Remi 所做的那样,错误出在您在另一个数据库中的例程代码中,因此您可能也需要发布该错误。

标签: vba ms-access


【解决方案1】:

我猜这个错误信息与你的一个数据库的状态有关。您在此处使用 Jet 连接和 Access 对象,并且由于多种原因(多用户环境、无法删除 LDB 锁定文件等),您可能无法正确关闭活动数据库并打开另一个数据库。因此,根据我的说法,解决方案是忘记 Jet 引擎并使用另一个连接来更新“其他”数据库中的数据。

当您说“数据流是在一个数据库中每月更新一次所有‘项目’,然后在另一个数据库中提供此信息”时,我假设您的“例程”的作用是更新一些数据,通过 SQL 指令或等效的记录集更新。

您为什么不尝试通过打开与其他数据库的连接并 (1) 发送相应的 SQL 指令或 (2) 打开记录集并进行请求的更新来进行相应的更新?

例如,一个想法是:

Dim cn as ADODB.connexion, 
    qr as string, 
    rs as ADODB.recordset

'qr can be "Update Table_Blablabla Set ... Where ...
'rs can be "SELECT * From Table_Blablabla INNER JOIN Table_Blobloblo  

set cn = New ADODB.connexion
cn.open

You can here send any SQL instruction (with command object and execute method) 
or open and update any recordset linked to your other database, then

cn.close

这也可以通过 ODBC 连接(和 DAO.recordsets)来完成,因此您可以选择自己喜欢的对象。

【讨论】:

    【解决方案2】:

    如果您想通过其他方式运行该函数,请尝试以下方法:

    Dim obj As New Access.Application
    obj.OpenCurrentDatabase (CurrentProject.Path & "\Working.mdb")
    
    obj.DoCmd.RunMacro "MyMacro"
    obj.CloseCurrentDatabase
    Set obj = Nothing
    

    其中“MyMacro”有一个“RunCode”动作,您希望在 Working.mdb 中执行函数名称

    【讨论】:

      【解决方案3】:

      我已经能够重现“开发”中的错误。

      “此操作无法完成,因为其他应用程序正忙。选择“切换到”以激活...。”

      我真的看不到消息的其余部分,因为它闪烁得非常快。我猜这个错误是由于两个数据库之间的“切换”造成的。我希望通过教育用户,这将停止。

      菲利普,你的答案当然是正确的。如果我没有事先制定“常规”,我会选择这条路。

      “我已经能够重现这种行为。当焦点必须转移到被调用的数据库时会发生这种情况,但用户将焦点 ([ALT]+[TAB]) 设置在第一个数据库上。'解决方案’是为了教育用户。”由于无法阻止用户在 Windows 中切换应用程序,我想关闭主题。

      【讨论】:

        猜你喜欢
        • 2017-01-23
        • 2021-10-25
        • 2020-04-13
        • 1970-01-01
        • 1970-01-01
        • 2021-03-29
        • 2012-04-13
        • 1970-01-01
        • 2019-02-14
        相关资源
        最近更新 更多