5

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

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

于 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 回答