c# - 为什么 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”。
解决方案
我很好奇为什么在 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 位)。或者让您的代码捕获这两种类型的异常并相应地处理它们。
推荐阅读
- c# - 运动取决于帧速率。我怎样才能让它独立于帧速率
- reactjs - 警告:签名和功能的功能可能无法正常运行,因为其权利使用占位符团队 ID
- javascript - jquery关于表单计算最大值而不提交
- python - 使用 selenium 和 python 进行 YouTube 自动化,从搜索的视频中选择的问题
- python - 如何使用 Spyder 和 Python 2.7 安装 conda 环境?
- java - 在春季批处理中调用 Joblauncher.run 时获取空指针
- amazon-web-services - CW 警报维度中的参考实例 ID - Terraform
- javascript - 如何使用 React useContext 使子组件可以访问数据
- k-means - 使用 word2vec 进行文档聚类
- c# - 如何调用 Environment.GetEnvironmentVariable 而不会丢失 %PathVariableName% 例如 %SystemRoot%