web-dev-qa-db-ja.com

システムにインストールされているすべてのAccessACE.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();
}

1つの警告とともにドライバーのリスト(Accessドライバーに関心があります)を返します。

.net 4.5に対して、次のものが含まれています。

SOURCES_NAME = Microsoft.ACE.OLEDB.15.

ただし、プロジェクトが.net 4.0に対してビルドされた場合、出力は次のようになります。

SOURCES_NAME = Microsoft.ACE.OLEDB.12.

テストしているマシンには、32ビットのOffice 2013(Microsoft.ACE.OLEDB.15.0が含まれています)がインストールされており、64ビットバージョンのAccessデータベースドライバー(Microsoft.ACE.OLEDB.12.0が含まれています)がインストールされています。実行中のプロジェクトはAnyCPUに設定されており、Windows8.1を使用しています。

列挙が常に同じ結果を返さないのはなぜですか?

システムにインストールされているすべてのプロバイダーのリストを取得するにはどうすればよいですか?私がしたい理由は、通常は最新のドライバーに対して実行したいのですが、特定の接続では、以前のバージョンのドライバーを使用する必要があります。 (これは、古い.mdbファイルのアップグレードが必要になる場合があるためです)したがって、古いバージョンがインストールされていない場合は、ユーザーに通知したいと思います。

その他の奇妙さ:

.net 4.5.1に対してコンソールアプリを作成し、それを.net 4.0に変更して実行し、それを.net 4.0に戻すと、引き続き.net 4.0の結果(Microsoft.ACE.OLEDB.12.0ドライバー)が返されます。

17
Xiaosu

ここに表示されるのは、おそらくAnyCPU32ビット優先と呼ばれる AnyCP 設定の新しいサブタイプの影響です。 .NET4.5で導入されました。このサブタイプは、新しいプロジェクトの新しいデフォルトです。それは次のことを意味します:

  • プロセスが32ビットWindowsシステムで実行されている場合、プロセスは32ビットプロセスとして実行されます。 ILはx86マシンコードにコンパイルされます。
  • プロセスが64ビットのWindowsシステムで実行されている場合、32ビットのプロセスとして実行されます。 ILはx86マシンコードにコンパイルされます。
  • プロセスがARM Windowsシステムで実行される場合、32ビットプロセスとして実行されます。ILはARMマシンコードにコンパイルされます。

この新しいデフォルトの背後にある理由は、このブログ投稿で非常によく説明されています。

。NET4.5およびVisualStudio 11の時点でAnyCPUが実際に意味すること

では、なぜあなたはあなたのケースの違いを見るのですか?したがって、.NET 4.0をターゲットにする場合、アプリケーションは64ビットプロセス内で実行されます(AnyCPUプラットフォームターゲットのため)。したがって、64ビットバージョンのドライバーが表示されます。

ただし、.NET 4.5を対象とする新しいプロジェクトを作成する場合、アプリケーションは32ビットプロセス内で(デフォルトのプロジェクト設定で)実行され、32ビットバージョンのドライバーが表示されます。

新しい.NET4.5プロジェクトを作成した場合にのみ、違いが表示されることに注意してください。 .NETターゲットのバージョンを4.0から4.5に変更しただけでは、プラットフォームのターゲットはAnyCPからAnyCPU32ビット優先に変更されません。

5
Dirk Vollmar