【问题标题】:Why does Microsoft.Jet.OLEDB.4.0 complain about Undefined Functions on my computer but not others?为什么 Microsoft.Jet.OLEDB.4.0 在我的计算机上抱怨 Undefined Functions 而在其他计算机上却没有?
【发布时间】:2020-07-28 02:44:19
【问题描述】:

作为前言,请注意,此帖子不是重复关于Microsoft.Jet.OLEDB.4.0 的以下任何常见问题的问题:

  • 这不是“Microsoft.Jet.OLEDB.4.0 没有 64 位版本”问题。
    • 我在两台机器上都运行 32 位 .NET 可执行文件。
    • 两台机器都安装了 32 位版本的 Office 2019(通过 Office 365)。
  • 这也不是“在 JET 中使用 Access/VBA 函数”问题。
    • Nz() 之类的函数仅在 Access VBA 中执行的 SQL 中可用,这些函数在通过 JET 或 ACE 执行的 SQL 中不可用。
    • 但是CLng一个 JET 内部函数,当通过 JET 使用时(即在 Access VBA 之外)应该可以工作。

问题陈述:

  • 我有一个使用 JET 内部函数(例如 CLng())的 SQL 查询。以下是重现问题的最小查询:

    SELECT
        CLNG( 123 ) AS Foo
    
  • 当我在我的计算机上运行此查询时(通过 Office 365 安装了 32 位 Office 2019):

    • 当我使用 Microsoft.Jet.OLEDB.4.0 OLE-DB 提供程序时,它会失败并显示以下异常消息:

      OleDbException 表达式中未定义函数“CLNG”。
      HResult: -2147217900
      NativeError: -530123806
      SQLState: 3085

    • 当我使用Microsoft.ACE.OLEDB.16.0 OLE-DB 提供程序时,它会成功。

  • 当我在另一台计算机上运行此查询时(也通过 Office 365 安装了 32 位 Office 2019):

    • 当我使用 Microsoft.Jet.OLEDB.4.0 OLE-DB 提供程序时,它会成功。
    • 当我使用Microsoft.ACE.OLEDB.16.0 OLE-DB 提供程序时,它会成功。
  • 两台计算机使用相同的数据库文件,它是 JET 4.0 (Access 2000) *.mdb 数据库文件。

在枚举 32 位 OLE-DB 提供程序时,两台计算机报告的 JET 和 ACE 驱动程序信息相同(请参见下面的屏幕截图,我的计算机在顶部,另一台计算机在底部):

  • 我没有使用Microsoft.ACE.OLEDB.12.0 进行测试,因为 ACE 15 (Office 2013) 和 ACE 16 (Office 2016, Office 2019) 都覆盖了 ACE 12 提供程序注册,因此任何请求 ACE 12 的应用程序都将获得 ACE 15 或 16。

假设:

我将假设有一些标志或系统范围的开关来配置Microsoft.Jet.OLEDB.4.0 如何处理内部函数(我知道 JET 4.0 驱动程序可以在 SQL-89 和 SQL-92 模式下运行,我想知道它是否与that) 不会影响Microsoft.ACE.OLEDB.16.0 驱动程序。

我会就此事件联系 Office 支持并报告他们的答案 - 如果有的话,但如果有人有任何想法,我将不胜感激。

【问题讨论】:

    标签: ms-access oledb jet


    【解决方案1】:

    有趣。 您是否检查过 JET/ACE 的沙盒设置?

    沙盒设置将阻止在 JET/ACE sql 中使用“某些”函数,并阻止(不允许)使用它们。

    这里的信息: https://support.microsoft.com/en-ie/office/turn-sandbox-mode-on-or-off-to-disable-macros-8cc7bad8-38c2-4a7a-a604-43e9a7bbc4fb

    https://support.microsoft.com/en-ie/office/functions-and-properties-in-access-blocked-by-sandbox-mode-9a829783-f7a8-4a9f-8d43-8650b8cc9565?ui=en-us&rs=en-ie&ad=ie

    但是,clng() 不是被阻止的 sql 函数之一。所以我怀疑这会是一个问题。但是,我会对这些问题进行快速测试/检查。 (再次,我很抱歉提出一个远射 - 根据您提供的信息,这不应该是您的问题)。

    现在,最好的猜测?您想在失败的开发盒上安装 JET sp 更新。 我会从这里尝试 sp8: https://www.microsoft.com/en-us/download/details.aspx?id=7151

    你的文章似乎很透彻。而且由于查询确实有效,但不是那些具有某些功能的查询。我过去见过这个问题 - 我不记得解决方案了。我记得这是在 2003 年左右!我们发现 sql 中的“一些”函数可以工作,而有些则不能。我似乎记得修复是重新注册一个额外的.dll,它为 jet 提供了一些原生的附加功能。换句话说,有一个 .dll 包含/添加/允许某些 JET sql 函数。如果那部分坏了,那么某些喷射功能就不起作用了。

    问题: 其他 JET 本机功能会失败吗?还是全部? 如果都失败了,我会查看沙盒设置。如果有的话,那么 sp8 安装是最好的猜测。

    假设这是 100% 喷射,那么关于 VBA 的参考中断等问题在这里不适用。我记得这不是 VBA 功能失败,也不是由于 VBA 引用损坏。 (一旦他们往南走,那么附近的所有 sql() 函数都会在使用 Access 应用程序时中断,包括 JET sql..(再次:您使用 JET,而不是真正的访问)。

    我想是另一个远射?如果这是一个不同的 mdb,或者是你在测试期间被打死的副本?我会考虑以访问权限启动它并进行压缩+修复。

    全部或只是“一些”jet sql 函数将阐明这一点。但是,一旦您找到此答案,我就没有解决方案!但是,如果 ALL functions() 无论如何都失败了?好吧,那台机器上的 JET 与 ACE 不同。您需要重新安装 JET。大约从 2007 年开始我就没有这样做了。(JET 是 windows 的一部分)。

    我不认为您可以/将找到 JET 供下载。但是您可以在 Google 上搜索 JET sp 包 - 这是我最好的建议和建议 - 尝试安装 JET sp8 包。

    【讨论】:

      【解决方案2】:

      事实证明,我之前在我的机器上强制安装了 64 位 ACE 驱动程序,而 32 位 ACE 驱动程序已经安装。在卸载 64 位 ACE 驱动程序(并重新安装 32 位 ACE 驱动程序以确保良好措施)后,它再次开始按预期工作。


      怀疑 32 位和 64 位 ACE 驱动程序总是将 JET 的内置程序(不在 ODBC 兼容子集中)委托给需要与 ACE 驱动程序兼容 32 位或 64 位,但是当 32 位/64 位 ISA 不正确时,它会尝试以失败的方式加载它(正确地做到这一点很简单,我可能应该使用像ProcMon 这样的工具来看看到底发生了什么......)。

      【讨论】:

        猜你喜欢
        • 2012-08-02
        • 1970-01-01
        • 1970-01-01
        • 2012-11-04
        • 1970-01-01
        • 2022-11-30
        • 1970-01-01
        • 2010-12-31
        • 2010-11-12
        相关资源
        最近更新 更多