为何OleDbConnection在64位抛InvalidOperationException,32位抛OleDbException
32位 vs 64位环境下OleDbConnection异常差异的原因分析
这个差异的核心原因在于Microsoft.Jet.OLEDB.4.0驱动的位数限制,以及它对不同Access数据库格式的支持能力,结合你未安装Access Runtime的场景,具体拆解如下:
1. 64位环境抛出InvalidOperationException的原因
Microsoft.Jet.OLEDB.4.0是一个仅支持32位的驱动,微软从未发布过它的64位版本。当你的程序在64位运行时环境下执行时:
- 系统会尝试查找64位版本的
Microsoft.Jet.OLEDB.4.0提供者,但该版本根本不存在 - 此时连“加载驱动”这一步都无法完成,直接抛出
InvalidOperationException,对应错误信息:The 'Microsoft.Jet.OLEDB.4.0' provider is not registered on the local machine.
2. 32位环境抛出OleDbException的原因
在32位运行时环境下:
- 系统能找到32位的Jet 4.0驱动,驱动加载环节成功
- 但Jet 4.0驱动仅支持Access 2003及更早的.mdb格式,完全不识别Access 2007+推出的.accdb格式
- 当驱动尝试解析你的
my.accdb文件时,无法识别其格式结构,因此抛出OleDbException,对应错误信息:Unrecognized database format 'C:\Users\Public\Documents\my.accdb'.
额外补充:正确连接.accdb文件的方式
如果你需要正常连接.accdb格式的数据库,不管是32位还是64位环境,都需要安装对应位数的Microsoft Access Runtime(ACE驱动),并将连接字符串中的提供者改为Microsoft.ACE.OLEDB.12.0(或更高版本如16.0),示例代码:
string connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Public\Documents\my.accdb"; System.Data.Common.DbConnection connection = new System.Data.OleDb.OleDbConnection(connectionString); try { connection.Open(); } catch (Exception e) { /* 处理异常 */ }
内容的提问来源于stack exchange,提问作者broadband
相关产品推荐
相关产品推荐

