c# - 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();
...
一切都好。
相同的代码,不同的结果,为什么?
解决方案
前言:
- 这个答案只涉及 OLE-DB 而不是 ODBC。
- 请确保您了解 JET Red(在此答案中简称为“JET”)与作为 Office 一部分安装的 MS Access 程序之间的关系(和差异)。
第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)。 - 如果它是任何其他值,那么就有问题了。
- 如果是,
- 通过
- 如果它是 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.0
或Microsoft.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。
- 在撰写本文时(2010 年 6 月),以下版本的
重要提示:该
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 的计算机上运行,它们就会被破坏。- 这就是为什么你应该总是让你的用户直接编辑你的连接字符串,以避免这个问题。
- 这是因为许多软件硬编码
- 旁注:Office 2013 及更高版本包括
第 3 部分(针对您的具体问题):
- 检查您的 Visual Studio 单元测试过程是 32 位还是 64 位
- 您应该将单元测试进程配置为使用与 AutoCAD 主机进程相同的 ISA 运行:
- 因此,如果 AutoCAD 是 32 位的,那么您的单元测试应该是 32 位而不是 AnyCPU。
- 因此,如果 AutoCAD 是 64 位的,那么您的单元测试应该是 64 位而不是 AnyCPU。
- 如果您以 32 位方式运行,则可以使用
Microsoft.JET.OLEDB.4.0
或Microsoft.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
)。
- 尽管您应该考虑安装最新的 2016 版本而不是 2010(因此使用
推荐阅读
- android - 运算符 '*' 不能应用于 'android.widget.RadioButton', 'int'
- amazon-web-services - AWS 实例随机超时
- c# - 使用条件唯一约束保存实体时出现循环依赖错误
- ios - 带有 GLSL 的 CIKernel 白色像素
- android - 卡视图的最后一行未在所有设备中显示
- laravel - Laravel - 调用全部时查询模型
- javascript - 响应式图像缩略图
- ios - 在 iOS 应用程序中从 webkit 获取 html 源代码
- botframework - 如何使您的机器人对频道中的特定用户可见
- ios - 不能在 inout 函数中使用 SKShapeNode