1

如何以编程方式获取给定 ODBC 驱动程序的 ODBC 驱动程序 DLL 文件的名称。例如,给定“SQL Server Native Client 10.0”,我想查找该驱动程序的 DLL 文件的名称:sqlncli10.dll。我可以在注册表中 HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI 下的“驱动程序”条目中的 REGEDIT 中看到这一点。如果我尝试在我的代码中从注册表中读取值,它会返回一个空字符串。我还尝试使用 ODBC API 函数 SQLDrivers。下面的代码成功返回了 Attribs 变量中除“Driver”之外的所有属性值。一切都在那里——APILevel、ConnectFunctions、CPTimeout 等——但“驱动程序”不在列表中。

repeat
  Status := SQLDrivers (HENV, SQL_FETCH_NEXT, PAnsiChar(DriverName), 255,
            NameLen, PAnsiChar(Attribs), 1024, AttrLen);
  if Status = 0 then begin
    List.Add(DriverName);
    List.Add(Attribs);
  end;
until Status <> 0;
4

1 回答 1

1

你可以SQLGetInfo()使用 InfoType=SQL_DRIVER_NAME

我希望这看起来像:

Status := SQLGetInfo(ConnEnv, SQL_DRIVER_NAME, PAnsiChar(DriverName), 255, NameLen);

但此功能适用于已连接的数据库。

我试过SQLDrives()了,你是对的:在我的环境中,这个函数也不返回 DLL 名称。所以我试图从注册表中读取它,它是这样工作的:

  DLLName := RegGetStringDirect(HKEY_LOCAL_MACHINE, 'SOFTWARE\ODBC\ODBCINST.INI\'  + DriverName, 'Driver');

对于司机:IBM INFORMIX ODBC DRIVER我得到:C:\informix\bin\iclit09b.dll

对于司机:SQL Server我得到:C:\WINDOWS\system32\SQLSRV32.dll

RegGetStringDirect()是我基于 Windows API 从注册表中读取内容的函数。

编辑:

Ron Schuster 读取“SQL Server”ODBC 驱动程序 dll 名称的两个函数从评论中移出:

procedure TForm1.Button1Click(Sender: TObject); 
//using Windows API calls 
var 
  KeyName, ValueName, Value: string; 
  Key: HKEY; 
  ValueSize: Integer; 
begin
  ValueName := 'Driver';
  KeyName := 'SOFTWARE\ODBC\ODBCINST.INI\SQL Native Client';
  if RegOpenKeyEx(HKEY_LOCAL_MACHINE, PChar(KeyName), 0, KEY_READ, Key) = 0 then
    if RegQueryValueEx(Key, PChar(ValueName), nil, nil, nil, @ValueSize) = 0 then begin
      SetLength(Value, ValueSize);
      RegQueryValueEx(Key, PChar(ValueName), nil, nil, PByte(Value), @ValueSize);
      ShowMessage(Value);
    end;
end; 

procedure TForm1.Button2Click(Sender: TObject);
//using TRegistry class 
var
  KeyName, ValueName, Value: string;
  Reg: TRegistry;
begin
  ValueName := 'Driver';
  KeyName := 'SOFTWARE\ODBC\ODBCINST.INI\SQL Native Client';
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_LOCAL_MACHINE;
    if Reg.OpenKeyReadOnly(KeyName) then begin
      Value := Reg.ReadString(ValueName);
      ShowMessage(Value);
    end;
  finally
    Reg.Free;
  end;
end;
于 2012-12-20T12:35:22.427 回答