Pergunta

Como posso ter certeza de que um driver certo OLEDB é instalado quando eu começar a minha aplicação? Eu uso ADO de Delphi e gostaria de exibir uma mensagem de erro descritiva se o motorista está faltando. O erro que é retornado de ADO não é sempre que user-friendly.

Há provavelmente uma função pouco agradável que retorna todos os drivers instalados, mas eu não tê-lo encontrado.

Foi útil?

Solução

Cada provedor tem um GUID associado com sua classe. Para encontrar o regedit guid, aberto e procurar o registro para o nome do provedor. Por exemplo, procurar por "Microsoft Jet 4.0 OLE DB". Quando você encontrá-lo, copie a chave (o valor GUID) e usar isso em uma pesquisa de registro na sua aplicação.

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;

Outras dicas

Esta é uma questão de idade, mas eu tive o mesmo problema agora e talvez isso possa ajudar os outros.

Em Delphi 7 não é um procedimento em ADODB que retornar um TStringList com os nomes de provedores.

Exemplo de uso:

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;';

Você pode obter um nome do fornecedor ADO e verificá-lo no registro em HKEY_CLASSES_ROOT caminho \ [Provider_Name].

Não seria a maneira mais fácil apenas estar tentando fazer uma conexão no arranque e pegar o erro?

Quer dizer que você pode obter alguns erros diferentes de volta, dependendo, por exemplo, o usuário está online, mas são casos que você deve ser capaz de teste para.

Eu acredito que os objetos OLEDB em questão estão enterrados em algum lugar no registro, desde OLEDB / ADO é uma solução COM. Meu palpite seria para ver se você pode encontrar o GUID que o driver é instalado como no registro.

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;
  }
 }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top