1

特定の ODBC ドライバーの ODBC ドライバーの DLL ファイルの名前をプログラムで取得する方法を教えてください。たとえば、"SQL Server Native Client 10.0" の場合、そのドライバーの DLL ファイル sqlncli10.dll の名前を見つけたいとします。これは、HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI の下にあるレジストリの "Driver" エントリの REGEDIT で確認できます。コードでレジストリから値を読み取ろうとすると、空の文字列が返されます。また、ODBC API 関数 SQLDrivers を使用してみました。以下のコードは、"Driver" を除く Attribs 変数の属性のすべての値を正常に返します。APILevel、ConnectFunctions、CPTimeout など、すべてありますが、「Driver」はリストにありません。

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 名を読み取る 2 つの関数は、コメントから移動されました。

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 に答える