2013-03-01 9 views
5

Mam aplikację Delphi 6, która korzysta z DSN ODBC do łączenia się z docelowymi bazami danych. Chcę dołączyć tekst, który zawiera nazwę bazy danych, z którą DSN jest połączony. Próbowałem użyć polecenia SQL db_name(), ale otrzymałem tylko zero w odpowiedzi, mimo że działa po zalogowaniu się do serwera SQL.Konieczność zidentyfikowania nazwy bazy danych w aplikacji podłączonej do ODN DSN

Czy istnieje sposób w Delphi do identyfikacji bazy danych, z którą jestem połączony? mogę podciągnąć tabelę sys.databases, ale nie jestem pewien, w jaki sposób określić, które bazy danych jest jeden mam podłączony do

jako przykład:

jeśli Łączę się DSN LocalDSN I chcą być w stanie wyświetlić użytkownikowi, że są one podłączone do bazy danych , gdzie baza danych jest nazwą bazy danych sql, z którą się komunikują.

+4

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

+0

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

+0

@jachguate należy upewnić, że odpowiedź. –

Odpowiedz

3

Serwer DSN ODBC jest przechowywany w Rejestrze systemu Windows. Należy pamiętać, że rejestr systemu Windows, a tym samym ustawienia ODN DSN, są oddzielone między wersjami 32- i 64-bitowymi. Dostęp do tych informacji można uzyskać za pośrednictwem HKEY_LOCAL_MACHINE\Software\ODBC\ODBC.INI\[YOUR_DSN_NAME], a następnie odczytać wartość Database lub Server, aby poznać nazwę bazy danych lub serwera.

można odczytać z serwera i nazwę bazy danych z tych funkcji:

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; 

zależności od silnika bazy danych i kierowców, której używasz, zawartość tego klucza rejestru mogą być różne, a zatem istnieje możliwość ta wartość to nie jest wartość rejestru, której potrzebujesz, ale sprawdź ją samodzielnie i znajdź nazwy wartości w rejestrze, aby wiedzieć, jak ją odczytać.

+0

UWAGA: Podałem tylko nazwę serwera z powodu początkowej błędnej interpretacji pytania. Pierwotnie odebrałem nazwę serwera, a później dodałem nazwę bazy danych, gdy zorientowałem się, że właśnie o to pytano. –

+0

Znaleziono ustawienia w sekcji 64-bitowej mojego systemu operacyjnego. Będę mógł pobrać aplikację z tego miejsca i 32-bitową lokalizację dla nazwy bazy danych. Dzięki! – ChargerIIC

1

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.

Powiązane problemy