Как программно определить, есть ли на клиентском компьютере Microsoft.Jet.OLEDB.4.0 в качестве действительного поставщика?

Мне нужно экспортировать данные в базу данных Access. Мой код работает, но он работает с предположением, что клиентский компьютер имеет Microsoft.Jet.OLEDB.4.0 в качестве действительного поставщика.

Я хочу проверить, правда это или нет, в коде. Моя проблема в том, что у меня нет местоположения существующей базы данных доступа, и я не хочу создавать новый .mdb, который я бы использовал для проверки соединения, а затем удалить его.

Есть ли способ узнать, какие провайдеры установлены?


person Rob P.    schedule 09.04.2009    source источник
comment
+1, если кто-то проголосовал против, хотя бы укажите причину, чтобы пользователь мог отредактировать свой вопрос!   -  person Itay Moav -Malimovka    schedule 09.04.2009
comment
Хотя я бы не стал голосовать против этого, название нужно исправить. В следующий раз постарайся немного усерднее, ладно? :)   -  person mmcdole    schedule 09.04.2009


Ответы (4)


Вы можете просто проверить наличие

HKEY_CLASSES_ROOT\CLSID\{dee35070-506b-11cf-b1aa-00aa00b8de95}

который является CLSID Microsoft.Jet.OLEDB.4.0.

person Tomalak    schedule 09.04.2009

вы могли бы попытаться определить версию MDAC на машине и на основе этого экстраполировать, поддерживается ли ваш провайдер?

http://www.planetsourcecode.com/vb/scripts/ShowCode.asp?txtCodeId=47262&lngWId=1

вот фрагмент, на который вы можете взглянуть.

person NoCarrier    schedule 09.04.2009
comment
Я использовал этот метод раньше с тихим успехом. Но на самом деле вы можете просто проверить ключ реестра, как предложил @Tomalak - person chakrit; 09.04.2009

У каждого основного провайдера есть идентификатор класса, указанный в редакторе реестра. Пример: HKEY_CLASSES_ROOT\CLSID{dee35070-506b-11cf-b1aa-00aa00b8de95}

который является CLSID Microsoft.Jet.OLEDB.4.0.

Чтобы проверить программно, используйте приведенный ниже код С#, он проверен на платформе 2.0.

using System.Data.OleDb;
OleDbEnumerator enumerator = new OleDbEnumerator();
        DataTable table = enumerator.GetElements();
        bool bNameFound = false;
        bool bCLSIDFound = false;

        foreach (DataRow row in table.Rows)
        {
            foreach (DataColumn col in table.Columns)
            {
                if ((col.ColumnName.Contains("SOURCES_CLSID")) && (row[col].ToString().Contains("{dee35070-506b-11cf-b1aa-00aa00b8de95}")))
                    Console.WriteLine("CLSID of Microsoft.Jet.OLEDB.4.0. Found");

                if ((col.ColumnName.Contains("SOURCES_NAME")) && (row[col].ToString().Contains("Microsoft.ACE.OLEDB.12.0")))
                {
                    bNameFound = true;
                    if ((col.ColumnName.Contains("SOURCES_CLSID")) && (row[col].ToString().Contains("{3BE786A0-0366-4F5C-9434-25CF162E475E}")))
                        bCLSIDFound = true;
                }
            }
        }

        if (!bNameFound && !bCLSIDFound)
            Console.WriteLine("Microsoft.ACE.OLEDB.12.0 Not found");
        else
            Console.WriteLine("Microsoft.ACE.OLEDB.12.0 found");

Помните: «Исправьте это правильно и не позволяйте тестовым ошибкам кусаться».

person saintchant    schedule 25.06.2015

Я считаю, что если у вас установлена ​​.NET Framework (необходимая для запуска кода VB.NET), то на машине есть указанный вами провайдер. MSDN

person Jason Punyon    schedule 09.04.2009