1

我有一个通过 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,或者他们的 oracle home 的不同名称。如何判断在任意机器上使用哪个驱动程序?

我正在使用 Delphi,但这并不重要,因为无论如何这只是一个 API 调用。

4

2 回答 2

2

我最终使用了注册表中的列表,如下所示:

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;
于 2009-05-18T15:37:49.433 回答
1

您可以尝试深入研究SQLDrivers调用,以了解如何在您所在的系统上获取已安装的驱动程序。

于 2009-05-14T15:14:52.727 回答