Используя следующий код, я могу перечислить поставщиков 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)