次のコードを使用して、システムに登録されている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ドライバー)が返されます。
ここに表示されるのは、おそらくAnyCPU32ビット優先と呼ばれる AnyCP 設定の新しいサブタイプの影響です。 .NET4.5で導入されました。このサブタイプは、新しいプロジェクトの新しいデフォルトです。それは次のことを意味します:
この新しいデフォルトの背後にある理由は、このブログ投稿で非常によく説明されています。
では、なぜあなたはあなたのケースの違いを見るのですか?したがって、.NET 4.0をターゲットにする場合、アプリケーションは64ビットプロセス内で実行されます(AnyCPUプラットフォームターゲットのため)。したがって、64ビットバージョンのドライバーが表示されます。
ただし、.NET 4.5を対象とする新しいプロジェクトを作成する場合、アプリケーションは32ビットプロセス内で(デフォルトのプロジェクト設定で)実行され、32ビットバージョンのドライバーが表示されます。
新しい.NET4.5プロジェクトを作成した場合にのみ、違いが表示されることに注意してください。 .NETターゲットのバージョンを4.0から4.5に変更しただけでは、プラットフォームのターゲットはAnyCPからAnyCPU32ビット優先に変更されません。