Как проверить, установлен ли в системе драйвер OLEDB? - PullRequest
13 голосов
/ 22 сентября 2008

Как я могу убедиться, что определенный драйвер OLEDB установлен при запуске моего приложения? Я использую ADO из Delphi и хотел бы показать описательное сообщение об ошибке, если драйвер отсутствует. Ошибка, возвращаемая из ADO, не всегда удобна для пользователя.

Возможно, есть симпатичная маленькая функция, которая возвращает все установленные драйверы, но я ее не нашел.

Ответы [ 6 ]

9 голосов
/ 28 сентября 2012

Это старый вопрос, но у меня возникла та же проблема, и, возможно, это может помочь другим.

В Delphi 7 в ADODB есть процедура, которая возвращает TStringList с именами провайдеров.

Пример использования:

names := TStringList.Create;
ADODB.GetProviderNames(names);

if names.IndexOf('SQLNCLI10')<>-1 then
  st := 'Provider=SQLNCLI10;'
else if names.IndexOf('SQLNCLI')<>-1 then
  st := 'Provider=SQLNCLI;'
else if names.IndexOf('SQLOLEDB')<>-1 then
  st := 'Provider=SQLOLEDB;';
3 голосов
/ 30 сентября 2008

У каждого провайдера есть GUID, связанный с его классом. Чтобы найти guid, откройте regedit и найдите в реестре имя провайдера. Например, выполните поиск «Поставщик OLE DB для Microsoft Jet 4.0». Когда вы найдете его, скопируйте ключ (значение GUID) и используйте его при поиске в реестре в вашем приложении.

function OleDBExists : boolean;
var
  reg : TRegistry;
begin
  Result := false;

  // See if Advantage OLE DB Provider is on this PC
  reg := TRegistry.Create;
  try
    reg.RootKey := HKEY_LOCAL_MACHINE;
    Result := reg.OpenKeyReadOnly( '\SOFTWARE\Classes\CLSID\{C1637B2F-CA37-11D2-AE5C-00609791DC73}' );
  finally
    reg.Free;
  end;
end;
2 голосов
/ 03 октября 2008

Вы можете получить имя поставщика ADO и проверить его в реестре по пути HKEY_CLASSES_ROOT \ [Provider_Name].

1 голос
/ 22 сентября 2008

Не проще ли было бы просто попытаться установить соединение при запуске и отловить ошибку?

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

0 голосов
/ 29 июля 2010
namespace Common {
  public class CLSIDHelper {

  [DllImport("ole32.dll")]
  static extern int CLSIDFromProgID([MarshalAs(UnmanagedType.LPWStr)] string lpszProgID, out Guid pclsid);


  public static Guid RetrieveGUID(string Provider) {
    Guid CLSID = Guid.Empty;
    int Ok = CLSIDFromProgID(Provider, out CLSID);
    if (Ok == 0)
       return CLSID;
    return null;
  }
 }
}
0 голосов
/ 22 сентября 2008

Я полагаю, что рассматриваемые объекты OLEDB похоронены где-то в реестре, поскольку OLEDB / ADO является COM-решением. Я полагаю, что вы можете найти GUID, в котором установлен ваш драйвер, как в реестре.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...