2009-05-14 3 views
1

J'ai une application qui se connecte via une source de données à une base de données Oracle. Si la tentative initiale de connexion échoue, alors je m'assure que leur DSN existe. S'il n'existe pas, je le crée en utilisant la commande SQLConfigDataSource.Lors de la création par programme d'un DSN pour une base de données Oracle, comment puis-je indiquer de manière fiable le nom du pilote?

Cette commande nécessite le nom du pilote comme l'un de ses arguments. Sur ma machine, je le pilote de 11g, de sorte que les travaux suivants:

const 
    cDriver = 'Oracle in OraDb11g_home1' + #0; 
var 
    strAttr: string; 
begin 
    strAttr := 'DSN=' + DSNName + #0 + 
      'SERVER=' + TNSName + #0; 
    SQLConfigDataSource(0,ODBC_ADD_SYS_DSN,PChar(cDriver),PChar(strAttr)); 
end; 

Mais la machine client peut avoir une autre version d'Oracle, ou un autre nom pour leur maison d'oracle. Comment puis-je savoir quel pilote utiliser sur une machine arbitraire?

J'utilise Delphi, mais il ne devrait pas beaucoup d'importance, car cela est juste un appel d'API de toute façon.

Répondre

2

Je fini par utiliser la liste dans le registre, comme indiqué ici:

function TDSNManager.GetOracleDriverName: string; 
var 
    reg : TRegistry; 
    drivers: TStringList; 
    i: integer; 
begin 
    drivers := TStringList.Create; 
    reg := nil; 
    try 
    reg := TRegistry.Create; 
    reg.RootKey := HKEY_LOCAL_MACHINE; 
    if reg.OpenKey('SOFTWARE\ODBC\ODBCINST.INI',False) then begin 
     reg.GetKeyNames(drivers); 
    end; 
    finally 
    FreeAndNil(reg); 
    end; //try-finally 

    for i := 0 to drivers.Count - 1 do begin 
    if 0 < Pos('ORACLE IN',Uppercase(drivers[i])) then begin 
     Result := drivers[i]; 
     Break; 
    end; 
    end; 
end; 
1

Vous pouvez essayer de plonger dans l'appel SQLDrivers voir à obtenir les pilotes installés sur le système que vous êtes.

Questions connexes