簡體   English   中英

為什么OleDbConnection在64位進程上引發InvalidOperationException而在32位進程上引發OleDbException

[英]Why OleDbConnection throws InvalidOperationException on 64-bit process and OleDbException on 32-bit process

我不太確定為什么32位和64位運行環境上的異常有所不同。 我正在使用Visual Studio 2019測試下一個代碼,並將Platform從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”。

我很好奇為什么在64位或x64平台上也不會出現OleDbException?

由於64位沒有'Microsoft.Jet.OLEDB.4.0'提供程序,因此它不會在64位上發生。

對於32位,問題似乎在於驅動程序無法讀取accdb文件。 對於64位,問題在於驅動程序甚至不存在

根據https://docs.microsoft.com/zh-cn/office/troubleshoot/access/jet-odbc-driver-available-32-bit-version

介紹

Microsoft Jet的Microsoft OLE DB提供程序和Microsoft Access ODBC驅動程序(Jet ODBC驅動程序)提供了到Microsoft Office Access數據庫的接口。 Jet的Microsoft OLE DB提供程序和Jet ODBC驅動程序僅在32位版本中可用。

更多信息

我們不提供用於Jet的Microsoft OLE DB提供程序的64位版本。 此外,我們不提供Jet ODBC驅動程序的64位版本。 如果您使用Microsoft OLE DB提供程序用於Jet或Jet ODBC驅動程序來連接到64位環境中的數據源,則會遇到其他問題。

例如,您有一個使用Microsoft OLE DB提供程序用於Jet的32位應用程序。 如果您將應用程序遷移為在64位模式下運行,則該應用程序將無法通過使用Microsoft OLE DB Provider for Jet連接到數據源。 發生此問題的原因是該應用程序需要Jet的Microsoft OLE DB提供程序的64位版本。

但是,我們仍然具有32位版本的Microsoft OLE DB提供程序用於Jet和32位版本的Jet ODBC驅動程序。 在64位Windows環境中,可以在32位模式下運行應用程序。 因此,該應用程序可以使用32位版本的Microsoft OLE DB提供程序用於Jet或32位版本的Jet ODBC驅動程序。

最簡單的解決方案可能會強制使用x86(32位)。 或者讓您的代碼同時捕獲兩種類型的異常並進行相應處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM