需要在ODBC DSN连接的应用程序中标识数据库名称

时间:2013-03-01 00:01:45

标签: sql delphi odbc dsn delphi-6

我有一个Delphi 6应用程序,它使用ODBC DSN连接到目标数据库。我想要包含列出DSN所连接的数据库名称的文本。我尝试使用SQL命令db_name(),但只有在我登录SQL服务器时才能使用它才响应nil。

Delphi中有没有办法识别我连接的数据库?我可以提取sys.databases表,但不确定如何识别哪个数据库是我连接的数据库

作为例子:

如果我连接到dsn LocalDSN 我希望能够向用户显示他们已连接到 Database ,其中database是sql的名称他们正在与之沟通的数据库。

2 个答案:

答案 0 :(得分:3)

ODBC DSN存储在Windows注册表中。请记住,Windows注册表以及ODBC DSN设置在32位和64位版本之间分开。您可以通过HKEY_LOCAL_MACHINE\Software\ODBC\ODBC.INI\[YOUR_DSN_NAME]访问此信息,然后阅读值DatabaseServer以了解数据库或服务器名称。

您可以使用以下函数读取服务器和数据库名称:

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可能不是您需要的注册表值,但请自行检查并在注册表中找到您的值名称,以了解如何阅读它。

答案 1 :(得分:1)

您可以使用SQLGetPrivateProfileString ODBC 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进行设置)。如果未明确设置mode,它将同时搜索HKEY_CURRENT_USER和HKEY_LOCAL_MACHINE。 有关详细信息,请参阅https://docs.microsoft.com/en-us/sql/odbc/reference/syntax/sqlgetprivateprofilestring-function