【问题标题】:Why OleDbConnection throws InvalidOperationException on 64-bit process and OleDbException on 32-bit process为什么 OleDbConnection 在 64 位进程上抛出 InvalidOperationException 而在 32 位进程上抛出 OleDbException
【发布时间】:2019-11-28 06:06:25
【问题描述】:

我不太确定为什么 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?

编辑

InvalidOperationException 消息:

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

OleDbExceptionMessage:

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

【问题讨论】:

  • 这两种不同异常抛出的时候,你检查过它们的内容吗?他们说什么?
  • @mjwills 我喜欢的是 OleDbException 具有 InvalidOperationException 没有的 Errors 属性。它非常方便。

标签: c# 64-bit oledb 32-bit


【解决方案1】:

我很好奇为什么在 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 driver)提供一个接口 Microsoft Office Access 数据库。 Microsoft OLE DB 提供程序用于 Jet 和 Jet ODBC 驱动程序仅在 32 位版本中可用。

更多信息

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

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

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

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

【讨论】:

    猜你喜欢
    • 2019-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    • 2013-01-03
    相关资源
    最近更新 更多