【问题标题】:Intermittent error with Running Access Queries through Excel VBA通过 Excel VBA 运行访问查询时出现间歇性错误
【发布时间】:2015-07-30 12:31:02
【问题描述】:

我有一个 .xlsm 文件,它在一个新电子表格中编译来自 5 个 Access 数据库表的条目,然后打开 Access,并运行几个查询来更新主表(我知道,数据库的架构很糟糕...... ) 下面的代码(有时)会出现问题,

Dim accessApp
Set accessApp = CreateObject("Access.Application")
accessApp.UserControl = True
accessApp.OpenCurrentDatabase ("G:\Dir1\Dir2\Processing Database.accdb")
DoCmd.SetWarnings False
DoCmd.OpenQuery "DeleteFTP", acViewNormal, acEdit

在OpenQuery 行上,我收到“运行时错误 2486,您目前无法执行此操作”,是否需要加载某种代码库或其他什么来防止此间歇性问题?

【问题讨论】:

  • 是否有其他用户访问此数据库?桌子可能会因为这样的事情而被锁定吗?
  • 也许……有没有办法确定某人是否在处理数据库中?
  • 在与 accdb 文件相同的文件夹中有一个 .laccdb 文件,您可以使用文本编辑器读取该文件。只有当有人访问数据库时,该文件才应该存在。

标签: excel ms-access vba


【解决方案1】:

我认为您的 Processing Database.accdb 数据库包含一个名为 DeleteFTP 的已保存查询,并且您希望执行该查询。

如果是这样,则使用应用程序对象accessApp 限定DoCmd ...

accessApp.DoCmd.OpenQuery "DeleteFTP", acViewNormal, acEdit

请注意,如果您的 Excel 项目不包含 Access 引用,它将无法识别这些 Access 常量 acViewNormal 和 acEdit。在这种情况下,您可以使用常量的值而不是它们的名称:

accessApp.DoCmd.OpenQuery "DeleteFTP", 0, 1

但是我不确定这些建议是否足够,因为您说问题是间歇性的,在我看来,您当前的代码总是会失败。所以还有一些我不明白的事情。

关闭SetWarnings 会抑制信息。我不知道它是否在这种情况下隐藏了线索,但建议你还是避免它。如果您使用带有dbFailOnError 选项的DAO.Database.Execute 方法来执行删除查询,则不需要它...

'DoCmd.SetWarnings False
'DoCmd.OpenQuery "DeleteFTP", acViewNormal, acEdit
accessApp.CurrentDb.Execute "DeleteFTP", 128 ' dbFailOnError = 128

【讨论】:

  • 谢谢,我将避免使用“SetWarnings”并希望包含 accessApp。前缀。
  • 是的,我建议在保存的查询上使用 Execute 方法,如果它是一个操作查询而不是数据请求:accessApp.CurrentDb.QueryDefs("DeleteFTP").Execute - 你有选项像 dbFailOnError 标志一样,如果出现错误,则回滚您的删除,以及 RecordsAffected 属性,该属性允许您捕获已删除的记录数。
【解决方案2】:

尝试提前绑定访问应用程序。

Dim accessApp As Access.Application
Set accessApp = New Access.Application
accessApp.UserControl = True
accessApp.OpenCurrentDatabase("G:\Dir1\Dir2\Processing Database.accdb")
accessApp.DoCmd.SetWarnings False
accessApp.DoCmd.OpenQuery "DeleteFTP", acViewNormal, acEdit

您可能还想尝试以独占模式打开数据库。

accessApp.OpenCurrentDatabase("G:\Dir1\Dir2\Processing Database.accdb", true)

【讨论】:

    猜你喜欢
    • 2023-03-05
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多