При программном создании DSN для базы данных Oracle, как я могу надежно сказать имя драйвера? - PullRequest
1 голос
/ 14 мая 2009

У меня есть приложение, которое подключается через DSN к базе данных Oracle. Если первоначальная попытка подключения не удалась, я проверяю, существует ли их DSN. Если он не существует, я создаю его с помощью команды SQLConfigDataSource .

Эта команда требует имя драйвера в качестве одного из аргументов. На моей машине установлен драйвер 11g, поэтому работает следующее:

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;

Но клиентский компьютер может иметь другую версию Oracle или другое имя для своего дома оракула. Как я могу сказать, какой драйвер использовать на произвольной машине?

Я использую Delphi, но это не должно иметь большого значения, так как в любом случае это всего лишь вызов API.

Ответы [ 2 ]

2 голосов
/ 18 мая 2009

Я закончил тем, что использовал список в реестре, как показано здесь:

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 голос
/ 14 мая 2009

Вы можете попробовать углубиться в вызов SQLDrivers , чтобы узнать, какие драйверы установлены в вашей системе.

...