5

ODBC DSN を使用してターゲット データベースに接続する Delphi 6 アプリケーションがあります。DSN が接続されているデータベースの名前をリストするテキストを含めたいと考えています。SQL コマンド db_name() を使用しようとしましたが、SQL サーバーにログインしたときに機能していたにもかかわらず、応答で nil しか受信しませんでした。

どのデータベースに接続しているかを Delphi 内で特定する方法はありますか? sys.databases テーブルを取得できますが、接続先のデータベースを特定する方法がわかりません

例として:

dsn LocalDSNに接続している場合、ユーザーがDatabaseに接続していることをユーザーに表示できるようにしたいと考えています。ここで、 database は通信している SQL データベースの名前です。

4

2 に答える 2

3

ODBC DSN は、Windows レジストリに格納されます。Windows レジストリ、つまり ODBC DSN 設定は、32 ビット バージョンと 64 ビット バージョンに分かれていることに注意してください。この情報にアクセスしHKEY_LOCAL_MACHINE\Software\ODBC\ODBC.INI\[YOUR_DSN_NAME]て値を読み取っDatabaseたりServer、データベースまたはサーバー名を知ることができます。

次の関数を使用して、サーバーとデータベースの名前を読み取ることができます。

uses
  Registry;

function ServerOfDSN(const Name: String): String;
var
  R: TRegistry;
  K: String;
begin
  K:= 'Software\ODBC\ODBC.INI\'+Name;
  R:= TRegistry.Create(KEY_READ);
  try
    R.RootKey:= HKEY_LOCAL_MACHINE;
    if R.KeyExists(K) then begin
      if R.OpenKey(K, False) then begin
        if R.ValueExists('Server') then
          Result:= R.ReadString('Server');
        R.CloseKey;
      end;
    end;
  finally
    R.Free;
  end;
end;

function DatabaseOfDSN(const Name: String): String;
var
  R: TRegistry;
  K: String;
begin
  K:= 'Software\ODBC\ODBC.INI\'+Name;
  R:= TRegistry.Create(KEY_READ);
  try
    R.RootKey:= HKEY_LOCAL_MACHINE;
    if R.KeyExists(K) then begin
      if R.OpenKey(K, False) then begin
        if R.ValueExists('Database') then
          Result:= R.ReadString('Database');
        R.CloseKey;
      end;
    end;
  finally
    R.Free;
  end;
end;

使用しているデータベース エンジンとドライバーによっては、このレジストリ キーの内容が異なる可能性があるため、必要なレジストリ値である可能性ServerDatabaseそうでない可能性がありますが、自分で調べて、レジストリで値の名前を見つけてください。読み方を知ること。

于 2013-03-02T01:46:10.027 に答える
1

SQLGetPrivateProfileStringODBC API を使用して、作成された DSN の内容を取得できます。

int SQLGetPrivateProfileString(  
 LPCSTR   lpszSection,  
 LPCSTR   lpszEntry,  
 LPCSTR   lpszDefault,  
 LPCSTR   RetBuffer,  
 INT      cbRetBuffer,  
 LPCSTR   lpszFilename);

ここ、

lpszSection = 詳細が必要なレジストリ セクション。あなたの場合はDSN名になります。

lpszEntry = 値を抽出するキー。データベース名情報を取得したいので、レジストリ エントリ HKEY_LOCAL_MACHINE\Software\ODBC\ODBC.INI[YOUR_DSN_NAME] をチェックして、データベース名情報を格納するためのキー名を確認する必要があります。これは、ドライバーが異なれば、データベース名を格納するためのキー名も異なる可能性があるためです。

lpszDefault = キーが見つからない場合、最後の引数 (lpszEntry) で指定されたキーのデフォルト値。

RetBuffer = 指定されたキーの値が受信される出力バッファへのポインタ。

cbRetBuffer = RetBuffer が指すバッファーのサイズ (文字数)。

lpszFilename = これらのエントリを検索するファイル名。この場合は odbc.ini になります。

サンプル例

CHAR *dsn_name = "Your DSN name";
CHAR db_name[20];
char *odbcini = NULL;
odbcini = "odbc.ini";

SQLGetPrivateProfileString(dsn_name, (CHAR*)"DATABASE", (CHAR*)"", db_name, 
sizeof(db_name), odbcini);

設定モードに応じて、レジストリ エントリ HKEY_CURRENT_USER または HKEY_LOCAL_MACHINE またはその両方を検索します (SQLSetConfigMode ODBC API を使用して設定できます)。モードが明示的に設定されていない場合、HKEY_CURRENT_USER と HKEY_LOCAL_MACHINE の両方が検索されます。詳細については、 https://docs.microsoft.com/en-us/sql/odbc/reference/syntax/sqlgetprivateprofilestring-functionを参照してください。

于 2017-12-14T09:31:34.300 に答える