2008-09-22 26 views
11

¿Cómo puedo asegurarme de que un determinado controlador OLEDB esté instalado cuando inicio mi aplicación? Uso ADO de Delphi y me gustaría mostrar un mensaje de error descriptivo si falta el controlador. El error que se devuelve de ADO no siempre es tan fácil de usar.¿Cómo verificar si un controlador OLEDB está instalado en el sistema?

Probablemente haya una pequeña función que devuelve todos los controladores instalados pero no la he encontrado.

Respuesta

3

Cada proveedor tiene un GUID asociado a su clase. Para encontrar el guid, abra regedit y busque en el registro el nombre del proveedor. Por ejemplo, busque "Proveedor OLE DB de Microsoft Jet 4.0". Cuando lo encuentre, copie la clave (el valor GUID) y utilícela en una búsqueda de registro en su aplicación.

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

¿No sería la manera más fácil de tratar de hacer una conexión en la puesta en marcha y detectar el error?

Quiero decir que puede recibir algunos errores diferentes dependiendo de, por ejemplo, que el usuario esté en línea, pero son casos que debería poder probar.

0

Creo que los objetos OLEDB en cuestión están enterrados en algún lugar del registro, ya que OLEDB/ADO es una solución COM. Mi suposición sería ver si puede encontrar el GUID que su controlador está instalado como en el registro.

2

Usted puede obtener un nombre de proveedor de ADO y comprobar que en el registro en HKEY_CLASSES_ROOT ruta \ [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

Esta es una vieja pregunta pero tuve el mismo problema ahora y tal vez esto puede ayudar a otros.

En Delphi 7 hay un procedimiento en ADODB que devuelve una TStringList con los nombres de los proveedores.

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

amable de tu parte para enviar la respuesta - a pesar de ser literalmente años más tarde. –

Cuestiones relacionadas