c# - 获取系统上安装的所有 Access ACE.OLEDB 驱动程序的列表

标签 c# ms-office oledb

使用下面的代码我可以枚举在我的系统上注册的 OLEDB 提供者

static void DisplayData() {
   var reader = OleDbEnumerator.GetRootEnumerator();

   var list = new List<String>();
   while (reader.Read()) {
      for (var i = 0; i < reader.FieldCount; i++) {
         if (reader.GetName(i) == "SOURCES_NAME") {
            list.Add(reader.GetValue(i).ToString());
         }
      }
      Console.WriteLine("{0} = {1}", reader.GetName(0), reader.GetValue(0));
   }
   reader.Close();
}

它返回驱动程序列表(我们对 Access 驱动程序感兴趣),但有一个警告..

针对 .net 4.5 它包含:

SOURCES_NAME = Microsoft.ACE.OLEDB.15.0

但是当项目是针对 .net 4.0 构建时,输出是:

SOURCES_NAME = Microsoft.ACE.OLEDB.12.0

我们正在测试的机器安装了 32 位 Office 2013(具有 Microsoft.ACE.OLEDB.15.0)并且我们已经安装了 64 位版本的 Access 数据库驱动程序(具有 Microsoft.ACE.OLEDB.12.0 ).我们正在运行的项目设置为 AnyCPU,我们使用的是 Windows 8.1。

为什么枚举不总是返回相同的结果?

如何获取我系统上安装的所有提供程序的列表?我想要这样做的原因是通常我想针对最新的驱动程序运行,但对于某些连接我需要使用较早版本的驱动程序。 (这是因为我有时需要升级旧的 .mdb 文件)所以如果没有安装旧版本我想通知我的用户。

杂项怪事:

如果我们针对 .net 4.5.1 创建控制台应用程序,然后将其更改为 .net 4.0 并运行它,然后将其更改回 .net 4.0,它会继续返回 .net 4.0 结果(Microsoft.ACE.OLEDB。 12.0 驱动程序)

最佳答案

您在这里看到的可能是 AnyCPU 的新子类型的效果名为 AnyCPU 32-bit preferred 的设置已在 .NET 4.5 中引入。此子类型是新项目的新默认值。意思如下:

  • 如果进程在 32 位 Windows 系统上运行,它将作为 32 位进程运行。 IL 被编译为 x86 机器码。
  • 如果进程在 64 位 Windows 系统上运行,它将作为 32 位进程运行。 IL 被编译为 x86 机器码。
  • 如果进程在 ARM Windows 系统上运行,它将作为 32 位进程运行。 IL 被编译为 ARM 机器码。

这个新默认值背后的原因在这篇博文中有很好的解释:

What AnyCPU Really Means As Of .NET 4.5 and Visual Studio 11

那么,为什么您会发现您的情况有所不同?因此,如果您以 .NET 4.0 为目标,您的应用程序将在 64 位进程中执行(因为 AnyCPU 平台目标)。因此,您将看到 64 位版本的驱动程序。

如果您创建一个面向 .NET 4.5 的新项目,您的应用程序将在 32 位进程中运行(使用默认项目设置),并且您将看到 32 位版本的驱动程序。

请注意,只有在创建新的 .NET 4.5 项目时才会看到差异;如果您只是将 .NET 目标版本从 4.0 更改为 4.5,则平台目标不会从 AnyCPU 更改为 AnyCPU 32-bit preferred

关于c# - 获取系统上安装的所有 Access ACE.OLEDB 驱动程序的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21594400/

相关文章:

.net - OleDB 与 SQLClient 相比有何优缺点?

c# - 所有验证器控件的回发事件处理程序和 Validate 方法的顺序

c# - 从字符串中提取特定文本

ios - 如何在 iOS 上的 Office 中打开本地文件

c# - C# 读取word文档

c# - Oledb 更新命令

c# - SentrySDK VB.NET初始化示例

c# - Asp.net C# Webform 表单生成器/生成器

c# - c#读取word文件

c++ - IIS 调用 OLEDB API 失败