Access ODBC passthru 查询失败,错误 3146 给出不同的错误描述文本

Posted

技术标签:

【中文标题】Access ODBC passthru 查询失败,错误 3146 给出不同的错误描述文本【英文标题】:Acces ODBC passthru query fails with error 3146 giving different error description texts 【发布时间】:2020-06-28 18:42:46 【问题描述】:

我创建了一个通过查询选择 Postgres v.11 数据库表的行。 运行 currentDb.execute 会生成 ODBC 错误 3146 和 DBEngine.errors 中提到的“无效参数”。 在数据库资源管理器中打开相同的查询会生成 ODBC 错误 3146 和一个带有“permission denied ...”的消息框,这实际上反映了错误的来源。

我的问题是如何以编程方式获取后面的更多信息错误消息?

【问题讨论】:

既然这是一个 ODBC/Access 问题,最好知道 ODBC 驱动程序是什么以及 Access 版本。 使用 DAO 时,您几乎无法控制与查询一起发送的错误和文本。相反,通过 ADO 执行查询,它对错误和事件有更广泛的支持。 感谢@ErikA,您的评论是否暗示MS Access 在通过导航窗格打开通路查询时在内部使用ADO,而不是在VBA 脚本中打开时使用DAO? @PavelMurnikov 不。 Access 本身使用 ODBC,afaik。虽然您也可以这样做,但这是一项繁重的工作,而且本质上是在重新发明***。你可以在上面找到文档here,虽然将所有 C 结构和函数映射到 VBA 是可行的,但这并不容易。 【参考方案1】:

我认为以下内容将提供您正在寻找的内容:

   Public Function DbEngineErrors() As String

  Dim intErr As Integer
  Dim strRet As String
  Dim strErr As String

  If DBEngine.Errors.Count > 0 Then
     strRet = "DbEngineErrors:"
     For intErr = 0 To DBEngine.Errors.Count - 1
        strErr = DBEngine.Errors(intErr).Number & " / " & DBEngine.Errors(intErr).Description & " / " & DBEngine.Errors(intErr).Source
        strRet = strRet & vbCrLf & strErr
     Next
  End If
  DbEngineErrors = strRet
  End Function

【讨论】:

我在最初的问题中已经提到过这个方法 但是,您没有提到检查整个集合。此外,此方法通常确实包含潜在错误。 我当然会浏览整个 DBEngine.Errors 集合。值得一提的是,在我的情况下,这个集合无论如何只包含一个项目:)

以上是关于Access ODBC passthru 查询失败,错误 3146 给出不同的错误描述文本的主要内容,如果未能解决你的问题,请参考以下文章

MS Access中的ODBC连接失败

ODBC——调用失败

为啥此查询在 ODBC 表上运行但在本地表上运行时会失败?

在 MS access passthru 中创建 sql server 临时表

ODBC:从 Microsoft Access 导出到 Postgres 失败

MS Access 错误“ODBC--调用失败。转换规范 (#0) 的字符值无效”