访问VBA:错误2501 - 取消了OpenQuery操作

时间:2016-01-25 18:00:38

标签: database vba ms-access ms-access-2010

让我先说一下这个问题,说这个问题只是在上周开始的,就在我的电脑经过企业IT强制更新的同一天。对此的时间安排使我怀疑更新是以某种方式对此行为负责,但我不知道足以明确证明它,或者如果我的理论是正确的话,采取措施解决它。该理论也有点脆弱,因为我的辅助计算机必须具有相同的更新,但不会出现此问题。

正如标题所示,我在最近构建的Access数据库中遇到重复出错的问题。我处理大量数据集(大约约190万行,有几十个相关列)。为了管理这一点并避免使用不必要的临时表超载任何特定数据库,我将这些数据库构建为几个独立的数据库,这些数据库向“程序集”报告。使用链接表创建最终报告的数据库,然后可以将其分发给最终用户。最后的大师'数据库包含所有脚本,并允许我(理论上)通过几次按钮单击运行所有内容。

以下是一些示例代码:

Public Sub Import_Click()
On Error Resume Next
  DoCmd.SetWarnings False

  SysCmd acSysCmdSetStatus, "Importing Pipeline... Please be patient."
  ImportPipeline
  SysCmd acSysCmdSetStatus, "Importing Relationships... Please be patient."
  ImportRelationships
  SysCmd acSysCmdSetStatus, "Importing Coverage... Please be patient."
  ImportCoverage
  SysCmd acSysCmdSetStatus, "Importing Digital... Please be patient."
  ImportDigital
  SysCmd acSysCmdSetStatus, "Importing Orders... Please be patient."
  ImportOrders
  SysCmd acSysCmdSetStatus, "Importing Activations... Please be patient."
  ImportActivations

  DoCmd.SetWarnings True
  SysCmd acSysCmdClearStatus

  Beep
  MsgBox ("Import Complete!")

End Sub

在其中的每一个'导入'子程序,您将找到特定的代码 - 下面是一个最简单(最少的潜在故障点)的示例子程序。请注意,appAccess是我在每个子例程中使用的全局对象:

Sub ImportCoverage()
On Error GoTo ErrorImp

  DeleteCoverage

  Set appAccess = CreateObject("Access.Application")
  appAccess.OpenCurrentDatabase Application.CurrentProject.Path & "\Coverage.accdb"

  appAccess.DoCmd.TransferText acImportDelim, "LSTCoverage Import Specification", "Coverage", DataFilesFolderLocation & "LSTCoverage.csv", True, ""
  appAccess.DoCmd.OpenQuery "0000 - Coverage - Add Key", acViewNormal, acEdit
  appAccess.DoCmd.OpenQuery "0001 - Coverage - Clean", acViewNormal, acEdit
  appAccess.CurrentDb.Execute "CREATE UNIQUE INDEX CovIndex ON Coverage (OppIDKey) WITH PRIMARY"

  appAccess.DoCmd.Quit acQuitSaveNone
  Set appAccess = Nothing

ExitImp:
Exit Sub

ErrorImp:
  appAccess.DoCmd.Quit acQuitSaveNone
  Set appAccess = Nothing
  DoCmd.SetWarnings True
  SysCmd acSysCmdClearStatus
  MsgBox "Coverage Incomplete! Error encountered." & vbCrLf & "Error" & Str(Err.Number) & " generated by " & Err.Source & vbCrLf & Err.Description, vbInformation, "Error"

  Resume ExitImp

End Sub

我已多次执行此代码,并且此行总是会失败:

  appAccess.DoCmd.OpenQuery "0000 - Coverage - Add Key", acViewNormal, acEdit

数据库成功且正确连接,打开,删除旧表(在DeleteCoverage子例程中),断开连接,压缩,重新连接,打开,导入新表,然后一旦我失败尝试运行查询0000,这是一个简单的更新查询。 (无论我尝试什么特定查询,都会发生此故障 - 所有查询都将失败[仅在此计算机上,并且只有从一个数据库到另一个数据库的外部调用。直接从数据库中调用的查询似乎可以作为正常。])

此查询可以100%的时间手动运行 - 从根本上打破查询不是问题。此外,如果我将这些数据库和源文件传输到另一台计算机,这些OpenQuery命令将完美运行!

最简单的解决方案是简单地使用这台备份计算机来运行报告,而我这样做 - 但是,这种解决方案本身就存在问题,因为它不如我的主要机器,更容易出现“超出系统资源”的问题。处理数据时的错误设置很大。

任何人都可以在这里曝光吗?我已经通过StackExchange和其他寻找类似问题的网站进行了很多梳理,虽然我发现了一些,但大多数似乎已经解决了like this one,最初的海报最终放弃了解决问题错误。

我感谢您提供的任何指导!

ETA: 根据请求,这里是" 0000 - 覆盖范围 - 添加密钥"的SQL查询,当尝试作为RunSQL语句时也会失败。这是我们经常在多个数据库中使用的标准更新查询,用于为记录生成不区分大小写的唯一ID(因为Salesforce.com生成区分大小写的ID,但Excel在数据透视表中不敏感地处理数据)。 p>

strSQL = "UPDATE Coverage 
  SET Coverage.OppIDKey = Asc(Mid([Opportunity ID],1,1)) & ' - ' 
    & Asc(Mid([Opportunity ID],2,1)) & ' - ' 
    & Asc(Mid([Opportunity ID],3,1)) & ' - ' 
    & Asc(Mid([Opportunity ID],4,1)) & ' - ' 
    & Asc(Mid([Opportunity ID],5,1)) & ' - ' 
    & Asc(Mid([Opportunity ID],6,1)) & ' - ' 
    & Asc(Mid([Opportunity ID],7,1)) & ' - ' 
    & Asc(Mid([Opportunity ID],8,1)) & ' - ' 
    & Asc(Mid([Opportunity ID],9,1)) & ' - ' 
    & Asc(Mid([Opportunity ID],10,1)) & ' - ' 
    & Asc(Mid([Opportunity ID],11,1)) & ' - ' 
    & Asc(Mid([Opportunity ID],12,1)) & ' - ' 
    & Asc(Mid([Opportunity ID],13,1)) & ' - ' 
    & Asc(Mid([Opportunity ID],14,1)) & ' - ' 
    & Asc(Mid([Opportunity ID],15,1)) 
  WHERE (((Coverage.LTN) Is Not Null));"

2 个答案:

答案 0 :(得分:1)

如果0001有效,为什么不0000? (您确定只有0000被破坏吗?单步执行代码并手动移动光标以跳过0000。)

你有许多非破损案件,只有一件破损案件。因为你了解它的价值,你将占上风。 通过制作新模块进行测试来隔离问题。将代码减少到最小程度,从而引发错误。可能的补救措施:

  1. 反编译并重新编译数据库。
  2. 创建一个以空数据库开头的新版本,然后添加对象和代码;这避免了一种微妙的腐败,但你可能需要分阶段才能找到不好的部分。
  3. 检查可用库以查看库引用是否已关闭。
  4. 添加DoEvents以防止操作系统纠结。
  5. 使用基于记录集的方法替换查询。
  6. 新增功能:确保您可以打开并查看查询更新的表格中的记录。如果没有,请修复表链接(尝试使用链接表管理器删除并创建一个新链接)。
  7. 我很好奇Opportunity_ID的价值是什么样的。 15个Asc(Mid())输出可能没问题,但从性能的角度来看,这似乎是可疑的。

    假设您可以查看来自Coverage的记录,请创建简单查询(不在VBA中),直到出现问题为止:

    1. SELECT [Opportunity ID] FROM Coverage;
    2. SELECT [Opportunity ID], Mid([Opportunity ID],1,1) FROM Coverage;
    3. ......等......

答案 1 :(得分:0)

我刚刚获得了相同的体验 - 系统已更新,vba停止在vba中打开的数据库的openquery命令...

    Public Function fOpenAccess(strPathToFile As String) As Boolean

' Create new instance of Microsoft Access.
    Set appAccess = CreateObject("Access.Application")
' Open database in Microsoft Access window.
    With appAccess
        lCounter = lCounter + 1: Call fProgress(lCounter)
        .OpenCurrentDatabase strPathToFile
        '.Visible = True
    ' Open some queries.
        lCounter = lCounter + 1: Call fProgress(lCounter)
        .DoCmd.OpenQuery "qryWIPImport1"
        lCounter = lCounter + 1: Call fProgress(lCounter)
        .DoCmd.OpenQuery "qryWIPImport2"
        lCounter = lCounter + 1: Call fProgress(lCounter)
        .DoCmd.OpenQuery "qryWIPImportDelete"
    ' Close the database
        lCounter = lCounter + 1: Call fProgress(lCounter)
        .DoCmd.Quit acQuitSaveAll
    End With
End Function

经过一些故障排除后,我开始打开被叫数据库,直接从那里开始测试。我得到的第一件事是"启用内容"按钮。我决定单击按钮,关闭数据库并再次尝试我的代码,它照常工作。

故事的道德...如果您的代码连接到外部办公室文件,请在外部文件上启用内容或禁用此安全警告。