如何以编程方式获取给定ODBC驱动程序的ODBC驱动程序的DLL文件的名称。例如,给定“SQL Server Native Client 10.0”我想找到该驱动程序的DLL文件的名称:sqlncli10.dll。我可以在REGEDIT中的HKEY_LOCAL_MACHINE \ SOFTWARE \ ODBC \ ODBCINST.INI下的注册表中的“驱动程序”条目中看到这一点。如果我尝试从我的代码中的注册表中读取值,则返回一个空字符串。我也尝试使用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;
答案 0 :(得分: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;