首页 > 解决方案 > 为什么 OleDbConnection 在 64 位进程上抛出 InvalidOperationException 而在 32 位进程上抛出 OleDbException

问题描述

我不太确定为什么 32 位和 64 位运行环境的异常差异。我正在使用 Visual Studio 2019 测试下一个代码,并将平台从 x86 更改为 x64,反之亦然 -

string connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Public\Documents\my.accdb";
System.Data.Common.DbConnection connection = new System.Data.OleDb.OleDbConnection(connectionString);

try
{
  connection.Open();
}
catch (InvalidOperationException e)
{
  // occurs when running on 64-bit runtime
}
catch (OleDbException e)
{
  // occurs when running on 32-bit runtime
}

请注意,我没有安装Microsoft Access 2013/2016 Runtime。为了成功连接到 accdb 文件,您必须安装此文件,但我正在测试用户是否未安装此文件。

我很好奇为什么在 64 位或 x64 平台上也不会发生 OleDbException?

编辑

无效操作异常消息:

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

OleDbException 消息:

无法识别的数据库格式“C:\Users\Public\Documents\my.accdb”。

标签: c#64-bitoledb32-bit

解决方案


我很好奇为什么在 64 位或 x64 平台上也不会发生 OleDbException?

它不会出现在 64 位上,因为 64 位没有'Microsoft.Jet.OLEDB.4.0'提供程序。

对于 32 位,问题似乎是驱动程序无法读取accdb文件。对于 64 位,问题是驱动程序甚至不存在

根据https://docs.microsoft.com/en-us/office/troubleshoot/access/jet-odbc-driver-available-32-bit-version

介绍

Microsoft Jet 的 Microsoft OLE DB 提供程序和 Microsoft Access ODBC 驱动程序(Jet ODBC 驱动程序)为 Microsoft Office Access 数据库提供了一个接口。Microsoft OLE DB Provider for Jet 和 Jet ODBC 驱动程序仅在 32 位版本中可用。

更多信息

我们不提供 64 位版本的 Microsoft OLE DB Provider for Jet。此外,我们不提供 Jet ODBC 驱动程序的 64 位版本。如果您使用 Microsoft OLE DB Provider for Jet 或 Jet ODBC 驱动程序连接到 64 位环境中的数据源,您会遇到不同的问题。

例如,您有一个使用 Microsoft OLE DB Provider for Jet 的 32 位应用程序。如果迁移应用程序以在 64 位模式下运行,则应用程序无法使用 Microsoft OLE DB Provider for Jet 连接到数据源。出现此问题的原因是应用程序需要 64 位版本的 Microsoft OLE DB Provider for Jet。

但是,我们仍然有 32 位版本的 Microsoft OLE DB Provider for Jet 和 32 位版本的 Jet ODBC 驱动程序。在 64 位 Windows 环境中,您可以在 32 位模式下运行应用程序。因此,应用程序可以使用 32 位版本的 Microsoft OLE DB Provider for Jet 或 32 位版本的 Jet ODBC 驱动程序。

最简单的解决方案可能是强制 x86(32 位)。或者让您的代码捕获这两种类型的异常并相应地处理它们。


推荐阅读