Microsoft.Jet.OLEDB.4.0 与 Microsoft.ACE.OLEDB.12.0,我应该使用哪个?

Posted

技术标签:

【中文标题】Microsoft.Jet.OLEDB.4.0 与 Microsoft.ACE.OLEDB.12.0,我应该使用哪个?【英文标题】:Microsoft.Jet.OLEDB.4.0 vs Microsoft.ACE.OLEDB.12.0, Which should I use? 【发布时间】:2019-06-04 10:34:13 【问题描述】:

我正在为 AutoCAD 开发插件,需要从 Microsoft Access 读取数据。但我总是遇到异常:

“microsoft.xxx.oledb.x.0”提供程序未在本地计算机上注册

Windows 10 1803 + Office 365 + Microsoft Access 数据库引擎 2010 + Autodesk AutoCAD 2015

单元测试代码:

var path = "path_to_mdb_file");
var connectionString = $"Provider=Microsoft.Jet.OLEDB.4.0;Data source=path";
using (var connection = new OleDbConnection(connectionString))

    connection.Open();
...

测试通过

var path = "path_to_mdb_file");
var connectionString = $"Provider=Microsoft.ACE.OLEDB.12.0;Data source=path";
using (var connection = new OleDbConnection(connectionString))

    connection.Open();
...

例外: the 'microsoft.ace.oledb.12.0' provider is not registered on the local machine

CAD插件代码:

var path = "path_to_mdb_file");
var connectionString = $"Provider=Microsoft.Jet.OLEDB.4.0;Data source=path";
using (var connection = new OleDbConnection(connectionString))

    connection.Open();
...

例外: the 'Microsoft.Jet.OLEDB.4.0' provider is not registered on the local machine

var path = "path_to_mdb_file");
var connectionString = $"Provider=Microsoft.ACE.OLEDB.12.0;Data source=path";
using (var connection = new OleDbConnection(connectionString))

    connection.Open();
...

一切正常。


相同的代码,不同的结果,为什么?

【问题讨论】:

确保位数匹配 - 如果 AutoCAD 是 64 位,则需要 64 位访问引擎,32 位同上。 此外,Microsoft.Jet.OLEDB.4.0 提供程序在 x64 中不可用。但是Microsoft.ACE.OLEDB.12.0 提供程序确实完全支持 JET 4.0 数据库。更复杂的是,如果您安装 Office 2013(即 ACE 15),它将“重定向”要求 ACE 12 提供程序使用 ACE 15 的请求 - 这是一个障碍,因为 ACE 15 不支持 JET 3.0 数据库(但仍支持 JET 4.0)。不幸的是,情况一团糟:***.com/a/23824128/159145 【参考方案1】:

前言:

此答案仅与 OLE-DB 相关,与 ODBC 无关。 请确保您了解 JET Red(在此答案中简称为“JET”)与作为 Office 一部分安装的 MS Access 程序之间的关系(和差异)。

第 1 部分:

    首先,验证您的*.mdb 版本的确切的 JET 版本: 通过在十六进制编辑器中打开 *.mdb 文件并验证文件的前 32 个字节是否包含 ASCII 字符串“Standard Jet DB”来执行此操作。 如果它包含“Standard ACE DB”,那么您有一个 ACE 数据库 (*.accdb),而不是刚刚重命名的 JET Red (*.mdb) 文件。 查看偏移量0x14处的字节: 如果是0x00,那么您有一个 JET 3.0 数据库(Access 95、Access 97)。 如果是 0x01,那么您有一个 JET 4.0 数据库(Access 2000、2002、2003)。 如果它是任何其他值,则说明有问题。 如果它是 JET 3.0 数据库,那么您需要将其更新到 JET 4.0,因为不再支持 JET 3.0 并且试图使其工作是一个痛苦的世界。 在我看来,将 JET 3.0 数据库转换为 JET 4.0 数据库最好使用 Access 2003。您可以使用 Access 2007 或 Access 2010,但 Access 会尝试与您抗衡并将其转换为 ACE 数据库。 请注意,Access 2013 及更高版本根本不支持 JET 3.0。 如果是 JET 4.0 数据库,请继续阅读第 2 部分:

第 2 部分(针对 JET 4.0 数据库):

要通过 OLE-DB 使用 JET 4.0 数据库(不是 JET 3.0 数据库!)(此答案与 ODBC 无关!)您可以使用 Microsoft.JET.OLEDB.4.0Microsoft.ACE.OLEDB.12.0(或更高版本)。

在撰写本文时(2010 年 6 月),Microsoft.ACE.OLEDB.* 提供程序的以下版本支持 JET 4.0 数据库: Microsoft.ACE.OLEDB.12.0(访问 2007) 此版本还支持 JET 3.0,但前提是它是“真实”版本 12 而不是“假”版本 12。如果您安装了 Office 2013 或更高版本,或者 Access 数据库,您将拥有“假”版本已安装引擎 2013 或更高版本。 Microsoft.ACE.OLEDB.14.0(访问 2010) 此版本还支持 JET 3.0。 Microsoft.ACE.OLEDB.15.0(访问 2013) 此版本不再支持 JET 3.0。 Microsoft.ACE.OLEDB.16.0(访问 2016,访问 2019) 此版本也不支持 JET 3.0。

重要提示:Microsoft.Jet.OLEDB.4.0 提供程序仅适用于 32 位 (x86) 程序

Microsoft.ACE.OLEDB.* 提供程序的所有版本都提供 32 位和 64 位版本,并且可以并排安装。 旁注:Office 2013 及更高版本包括 Microsoft.ACE.OLEDB.15.0 提供程序 - 但请注意,它还将版本 15 注册为 Microsoft.ACE.OLEDB.12.0 的别名。 这是因为许多软件在嵌入式连接字符串中硬编码Microsoft.ACE.OLEDB.12.0,这意味着如果软件在具有 v14、v15 或 v16 而没有已安装 v12。 这就是为什么您应该始终让您的用户直接编辑您的连接字符串以避免此问题。

第 3 部分(针对您的具体问题):

检查您的 Visual Studio 单元测试进程是 32 位还是 64 位 在此处查看说明:https://docs.microsoft.com/en-us/visualstudio/test/run-a-unit-test-as-a-64-bit-process?view=vs-2019 您应该将单元测试进程配置为使用与 AutoCAD 主机进程相同的 ISA 运行: 因此,如果 AutoCAD 是 32 位的,那么您的单元测试应该是 32 位而不是 AnyCPU。 因此,如果 AutoCAD 是 64 位的,那么您的单元测试应该是 64 位而不是 AnyCPU。 如果您以 32 位运行,则可以使用 Microsoft.JET.OLEDB.4.0Microsoft.ACE.OLEDB.12.0。 * 32 位 Microsoft.JET.OLEDB.4.0 提供程序将默认安装在大多数 Windows 安装中,无需安装 Office 或 Access。 * 我不相信Microsoft.ACE.OLEDB.12.0 在 Windows 中是默认安装的。 如果您以 64 位运行,则只能使用 Microsoft.ACE.OLEDB.12.0 或更高版本,前提是您从 Access 数据库引擎安装程序安装了 64 位提供程序。 尽管您应该考虑安装最新的 2016 版本而不是 2010(因此使用 Microsoft.ACE.OLEDB.16.0)。

【讨论】:

以上是关于Microsoft.Jet.OLEDB.4.0 与 Microsoft.ACE.OLEDB.12.0,我应该使用哪个?的主要内容,如果未能解决你的问题,请参考以下文章

Microsoft.Jet.OLEDB.4.0 “找不到提供程序。它可能没有正确安装。”错误

将连接字符串从 Microsoft.Jet.OLEDB.4.0 转换为 Microsoft.ACE.OLEDB.12.0 提供程序

使用 microsoft.jet.oledb.4.0 从 paradox db 过滤日期字段

Microsoft.Jet.OLEDB.4.0' 提供程序未在本地计算机上注册

Microsoft.Jet.OLEDB.4.0和Microsoft.ACE.OLEDB.12.0的区别

未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序