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