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

时间:2019-06-04 10:34:13

标签: c# ms-access

我正在为AutoCAD开发一个插件,需要从Microsoft Access读取数据。但是我总是有一个例外:

  

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

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

UnitTest代码:

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();
...

一切正常。


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

1 个答案:

答案 0 :(得分:0)

前言:

  • 此答案仅与OLE-DB有关,与ODBC不相关。
  • 请确保您了解JET Red(在此答案中缩写为“ JET”)与作为Office的一部分安装的MS Access程序之间的关系(和区别)。

第1部分:

  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)。
      • 如果它是任何其他值,则说明有问题。
  2. 如果它是JET 3.0数据库,则您需要将其更新到JET 4.0,因为不再支持JET 3.0,而试图使其工作将是一个痛苦的世界。
    • 在我看来,使用Access 2003最好将JET 3.0数据库转换为JET 4.0数据库。您可以使用Access 2007或Access 2010,但是Access会竭尽全力将其转换为ACE数据库。 / li>
    • 请注意,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(Access 2007)
        • 此版本还支持JET 3.0,但仅当它是“真实”版本12而不是“假”版本12时。如果安装了Office 2013或更高版本,或者访问数据库,则将拥有“假”版本。已安装Engine 2013或更高版本。
      • Microsoft.ACE.OLEDB.14.0(Access 2010)
        • 此版本还支持JET 3.0。
      • Microsoft.ACE.OLEDB.15.0(Access 2013)
        • 此版本不再支持JET 3.0。
      • Microsoft.ACE.OLEDB.16.0(Access 2016,Access 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。 *默认情况下,大多数Windows安装中都会安装32位Microsoft.JET.OLEDB.4.0提供程序,而无需安装Office或Access。 *我不相信Windows中默认安装了Microsoft.ACE.OLEDB.12.0
  • 如果以64位运行,则只能使用Microsoft.ACE.OLEDB.12.0或更高版本,前提是已从Access Database Engine安装程序安装了64位提供程序。
    • 尽管您应该考虑安装最新的2016版本而不是2010(并使用Microsoft.ACE.OLEDB.16.0)。