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

时间:2014-02-06 05:02:30

标签: 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司机)

1 个答案:

答案 0 :(得分:5)

您在此处看到的可能是AnyCPU设置的新子类型的效果,该设置名为 AnyCPU 32位首选 ,已在.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位首选