我有一个Delphi 6应用程序,它使用ODBC DSN连接到目标数据库。我想要包含列出DSN所连接的数据库名称的文本。我尝试使用SQL命令db_name(),但只有在我登录SQL服务器时才能使用它才响应nil。
Delphi中有没有办法识别我连接的数据库?我可以提取sys.databases表,但不确定如何识别哪个数据库是我连接的数据库
举个例子:
如果我连接到dsn LocalDSN,我希望能够向用户显示它们已连接到Database,其中database是与之通信的sql数据库的名称。
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;
根据您使用的数据库引擎和驱动程序,此注册表项的内容可能不同,因此Server
或Database
可能不是您需要的注册表值,但您自己检查并找到您的值名称注册表知道如何阅读它。
您可以使用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。