2008-09-22 21 views
11

Comment puis-je m'assurer qu'un certain pilote OLEDB est installé lorsque je démarre mon application? J'utilise ADO de Delphi et voudrais afficher un message d'erreur descriptif si le pilote est manquant. L'erreur renvoyée par ADO n'est pas toujours conviviale.Comment vérifier si un pilote OLEDB est installé sur le système?

Il y a probablement une bonne petite fonction qui retourne tous les pilotes installés mais je ne l'ai pas trouvé.

Répondre

3

Chaque fournisseur a un GUID associé à sa classe. Pour trouver le guid, ouvrez regedit et recherchez le nom du fournisseur dans le registre. Par exemple, recherchez "Fournisseur OLE DB Microsoft Jet 4.0". Lorsque vous le trouvez, copiez la clé (la valeur GUID) et utilisez-la dans une recherche de registre dans votre application.

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

Le moyen le plus simple ne serait-il pas d'essayer d'établir une connexion au démarrage et d'intercepter l'erreur? Je veux dire que vous pourriez recevoir quelques erreurs différentes selon, par exemple, que l'utilisateur est en ligne, mais ce sont des cas que vous devriez pouvoir tester.

0

Je crois que les objets OLEDB en question sont enterrés quelque part dans le Registre, puisque OLEDB/ADO est une solution COM. Ma conjecture serait de voir si vous pouvez trouver le GUID que votre pilote est installé comme dans le registre.

2

Vous pouvez obtenir un nom de fournisseur ADO et vérifier dans le registre au chemin HKEY_CLASSES_ROOT \ [PROVIDER_NAME].

0
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; 
    } 
} 
} 
6

Ceci est une vieille question mais j'ai eu le même problème maintenant et peut-être cela peut aider les autres.

Dans Delphi 7, il existe une procédure dans ADODB qui retourne une TStringList avec les noms de fournisseur.

Exemple d'utilisation:

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

Belle de vous poster la réponse - même si elle est littéralement ans plus tard. –