Как программно определить, имеет ли клиентский компьютер Microsoft.Jet.OLEDB.4.0 в качестве допустимого поставщика? - PullRequest
1 голос
/ 09 апреля 2009

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

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

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

Ответы [ 5 ]

3 голосов
/ 09 апреля 2009

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

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

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

2 голосов
/ 09 апреля 2009

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

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

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

1 голос
/ 25 июня 2015

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

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

Для программной проверки используйте ниже код c #, его проверено на платформе 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");

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

0 голосов
/ 15 января 2019
       Dim reader As Object = OleDbEnumerator.GetRootEnumerator()
        Dim Oleprovide As String = ""

        While reader.Read
            For i = 0 To reader.FieldCount - 1
                If reader.GetName(i) = "SOURCES_NAME" Then
                    If reader.GetValue(i).ToString.Contains(".OLEDB.") = True Then
                        Oleprovide = reader.GetValue(i).ToString
                        Exit For
                    End If
                End If
            Next
        End While
        reader.Close()

        Dim MyConnection As OleDbConnection
        MyConnection = New OleDbConnection("Provider=" & Oleprovide & ";Data Source=" & existingFile.FullName & ";Extended Properties=""Excel 13.0 Xml;HDR=Yes""")
        MyConnection.Open()
0 голосов
/ 09 апреля 2009

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

...