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

问题描述 投票:5回答:2

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

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

举个例子:

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

sql delphi odbc dsn delphi-6
2个回答
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
投票

您可以使用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

© www.soinside.com 2019 - 2024. All rights reserved.