delphi - ssv - que es un tag en plc
¿Cómo verificar si un controlador OLEDB está instalado en el sistema? (6)
¿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?
Me refiero a que puede obtener algunos errores diferentes dependiendo de, por ejemplo, que el usuario esté en línea, pero son casos que debería poder probar.
¿Cómo puedo asegurarme de que cierto 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.
Probablemente hay una pequeña función que devuelve todos los controladores instalados pero no la he encontrado.
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.
skamradt es correcto. 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;
Puede obtener un nombre de proveedor ADO y verificarlo en el registro en la ruta HKEY_CLASSES_ROOT / [Provider_Name].
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;
}
}
}
Esta es una vieja pregunta, pero ahora tengo el mismo problema y quizás esto pueda 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;'';