首页 > 解决方案 > Microsoft.Jet.OLEDB.4.0 与 Microsoft.ACE.OLEDB.12.0,我应该使用哪个?

问题描述

我正在为 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();
...

一切都好。


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

标签: c#ms-access

解决方案


前言:

  • 这个答案只涉及 OLE-DB 而不是 ODBC。
  • 请确保您了解 JET Red(在此答案中简称为“JET”)与作为 Office 一部分安装的 MS Access 程序之间的关系(和差异)。

第1部分:

  1. 首先,验证您的版本的确切 JET*.mdb版本:
    • 通过*.mdb在十六进制编辑器中打开文件并验证文件的前 32 个字节是否包含 ASCII 字符串“ Standard Jet DB”来执行此操作。
      • 如果它包含“ Standard ACE DB”,那么您有一个 ACE 数据库 ( ),而不是刚刚重命名*.accdb的 JET Red ( ) 文件。*.mdb
    • 查看 offset 处的字节0x14
      • 如果是,0x00那么您有一个 JET 3.0 数据库(Access 95、Access 97)。
      • 如果是,0x01那么您有一个 JET 4.0 数据库(Access 2000、2002、2003)。
      • 如果它是任何其他值,那么就有问题了。
  2. 如果它是 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。
  3. 如果它是 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 Database Engine 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 位
  • 您应该将单元测试进程配置为使用与 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)。

推荐阅读