Domanda

Come posso assicurarmi che un certo driver OLEDB sia installato all'avvio della mia applicazione? Uso ADO da Delphi e vorrei visualizzare un messaggio di errore descrittivo se manca il driver. L'errore restituito da ADO non è sempre così intuitivo.

Probabilmente ci sono delle piccole funzioni che restituiscono tutti i driver installati ma non l'ho trovato.

È stato utile?

Soluzione

Ogni provider ha un GUID associato alla sua classe. Per trovare il guid, apri regedit e cerca nel registro il nome del provider. Ad esempio, cerca " Provider OLE DB per Microsoft Jet 4.0 " ;. Quando lo trovi, copia la chiave (il valore GUID) e usala in una ricerca del registro nella tua applicazione.

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;

Altri suggerimenti

Questa è una vecchia domanda ma ho avuto lo stesso problema ora e forse questo può aiutare gli altri.

In Delphi 7 esiste una procedura in ADODB che restituisce un TStringList con i nomi dei provider.

Esempio di utilizzo:

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

Puoi ottenere il nome di un provider ADO e controllarlo nel registro nel percorso HKEY_CLASSES_ROOT \ [Nome provider].

Il modo più semplice non sarebbe solo provare a stabilire una connessione all'avvio e rilevare l'errore?

Voglio dire che potresti ricevere alcuni errori diversi a seconda, ad esempio, l'utente sia online, ma sono casi che dovresti essere in grado di testare.

Credo che gli oggetti OLEDB in questione siano sepolti da qualche parte nel registro, poiché OLEDB / ADO è una soluzione COM. La mia ipotesi sarebbe di vedere se riesci a trovare il GUID che il tuo driver è installato come nel 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;
  }
 }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top