Pregunta

¿Cómo puedo asegurarme de que cierto OLEDB está instalado el controlador de cuando inicio mi aplicación?Yo uso ADO de Delphi y quisiera mostrar un mensaje de error descriptivo si el controlador que falta.El error que se devuelve desde ADO no siempre es amigable con el usuario.

Probablemente hay una bonita función que devuelve todos los controladores instalados pero no he encontrado.

¿Fue útil?

Solución

Cada proveedor tiene un GUID asociado con su clase.Para encontrar el guid, abrir regedit y buscar en el registro el nombre del proveedor.Por ejemplo, la búsqueda para "Microsoft Jet 4.0 OLE DB Provider".Cuando lo encuentre, copia de la clave (el valor GUID) y el uso que en una búsqueda en el registro en la 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;

Otros consejos

Esta es una vieja pregunta, pero yo tenía el mismo problema, ahora, y tal vez esto puede ayudar a los demás.

En Delphi 7 hay un procedimiento en ADODB que devolver un TStringList con el proveedor de nombres.

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

Usted puede obtener un ADO nombre del proveedor y comprobar que en el registro en el camino HKEY_CLASSES_ROOT\[Nombre_proveedor].

No es la manera más fácil de ser simplemente tratando de hacer una conexión en el start-up y la captura de los errores?

Me refiero a que usted puede conseguir un par de errores diferentes atrás dependiendo de, por ejemplo, el usuario está en línea, pero son casos que usted debería ser capaz de probar.

Creo que el OLEDB de los objetos en cuestión son enterrados en algún lugar en el registro, ya OLEDB / ADO es un COM solución.Mi conjetura sería para ver si usted puede encontrar el GUID que el controlador está instalado como en el 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top