您可以使用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]以知道存儲數據庫名稱信息的密鑰名稱是什麼。這是因爲不同的驅動程序可以有不同的密鑰名稱來存儲數據庫名稱。
lpsz默認 =如果未找到密鑰,則在最後一個參數(lpszEntry)中指定的密鑰的默認值。
RetBuffer =指向指定密鑰的接收值的輸出緩衝區的指針。
cbRetBuffer = RetBuffer指向的緩衝區大小,以字符爲單位。
lpsz文件名 =文件名,你在這裏搜索這些條目。在你的情況下它將是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。
您不能通過sql獲取DSN名稱,因爲AFAIK引擎本身並不知道您用於連接的機制,但您肯定可以從它駐留在連接對象中的屬性中獲取它使用。例如,如果您使用TSQLConnection,它將存儲在參數上。 – jachguate 2013-03-01 00:17:34
不幸的是,連接對象似乎只有三個屬性 - dsn的名稱和用戶的用戶名和密碼。 應用程序正在使用TQuery和TDatabase對象(都來自vcl),如果有幫助 – ChargerIIC 2013-03-01 14:54:09
@jachguate你應該做出答案。 – 2013-03-01 15:31:17