Możesz użyć interfejsu API ODBC od SQLGetPrivateProfileString
, aby uzyskać zawartość utworzonego DSN.
int SQLGetPrivateProfileString(
LPCSTR lpszSection,
LPCSTR lpszEntry,
LPCSTR lpszDefault,
LPCSTR RetBuffer,
INT cbRetBuffer,
LPCSTR lpszFilename);
Tutaj
lpszSection = sekcja rejestru chcesz szczegóły. w twoim przypadku będzie to nazwa DSN.
lpszEntry = klucz, z którego chcesz wyodrębnić wartość. chcesz uzyskać informacje o nazwie bazy danych, więc musisz sprawdzić wpis rejestru HKEY_LOCAL_MACHINE \ Software \ ODBC \ ODBC.INI [YOUR_DSN_NAME], aby wiedzieć, jaka jest nazwa klucza do przechowywania informacji o nazwie bazy danych. Jest tak dlatego, że inny sterownik może mieć inną nazwę klucza do przechowywania nazwy bazy danych.
lpszDefault = Wartość domyślna dla klucza określonego w ostatnim argumencie (lpszEntry), jeśli klucz nie zostanie znaleziony.
RetBuffer = Wskaźnik do bufora wyjściowego, w którym odebrano wartość dla określonego klucza.
cbRetBuffer = wielkość bufora wskazywanego przez RetBuffer w znakach.
lpszFilename = Nazwa pliku, w którym wyszukiwane są te wpisy. Będzie to odbc.ini w twoim przypadku.
Przykładowy przykład
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);
To wyszuka wpis rejestru HKEY_CURRENT_USER lub HKEY_LOCAL_MACHINE lub oba w zależności od ustawionego trybu config (może być ustawiony za pomocą SQLSetConfigMode ODBC API). Jeśli tryb nie jest jawnie ustawiony, przeszuka zarówno HKEY_CURRENT_USER, jak i HKEY_LOCAL_MACHINE. Aby uzyskać więcej informacji, zapoznaj się z https://docs.microsoft.com/en-us/sql/odbc/reference/syntax/sqlgetprivateprofilestring-function.
Nie można przyjąć nazwę DSN za pośrednictwem SQL, ponieważ AFAIK sam silnik nie jest świadomy mechanizmów, którego używasz do łączenia, ale na pewno można wziąć ją od obiektu, gdzie się ona znajduje w obiekcie połączenia jesteś za pomocą. Na przykład, jeśli używasz TSQLConnection, jest on przechowywany na parametrach. – jachguate
Niestety, obiekt połączenia wydaje się mieć tylko trzy właściwości - nazwę dsn i nazwę użytkownika i hasło. Aplikacja używa TQuery i przedmiot TDatabase (zarówno z VCL), jeśli pomaga – ChargerIIC
@jachguate należy upewnić, że odpowiedź. –