2013-03-01 22 views
5

Ho un'applicazione Delphi 6 che utilizza un DSN ODBC per connettersi ai database di destinazione. Voglio includere il testo che elenca il nome del database a cui è connesso il DSN. Ho provato a utilizzare il comando SQL db_name(), ma ho ricevuto solo una risposta negativa nonostante abbia funzionato quando accedo al server SQL.È necessario identificare il nome del database in un'applicazione connessa DSN ODBC

C'è un modo all'interno di Delphi per identificare a quale Database sono connesso? Posso tirare il tavolo sys.database, ma non sono certo come identificare quale database è quello che sono connesso a

Per fare un esempio:

se Sto collegandomi al DSN LocalDSN I vuoi essere in grado di mostrare all'utente che sono connessi al Database, dove database è il nome del database sql con cui stanno comunicando.

+4

Non è possibile prendere il nome DSN tramite sql, poiché AFAIK il motore stesso non è a conoscenza dei meccanismi che si sta utilizzando per connettersi, ma si può sicuramente prenderlo dalla proprietà in cui si trova nell'oggetto di connessione che si sta utilizzando. Ad esempio, se si utilizza TSQLConnection, viene memorizzato nei parametri. – jachguate

+0

Sfortunatamente l'oggetto di connessione sembra avere solo le tre proprietà: il nome del dsn e il nome utente e la password degli utenti. L'applicazione utilizza un oggetto TQuery e TDatabase (entrambi dalla vcl) se questo aiuta – ChargerIIC

+0

@jachguate, è necessario fornire una risposta. –

risposta

3

Il DSN ODBC è memorizzato nel Registro di sistema di Windows. Tenere presente che il registro di Windows e, di conseguenza, le impostazioni ODBC DSN, sono separati tra le versioni a 32 e 64 bit. È possibile accedere a queste informazioni tramite HKEY_LOCAL_MACHINE\Software\ODBC\ODBC.INI\[YOUR_DSN_NAME] e quindi leggere il valore Database o Server per conoscere il nome del database o del server.

Potete leggere il server e il nome del database con queste funzioni:

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; 

seconda di ciò che il motore di database ei driver che si sta utilizzando, i contenuti di questa chiave di registro possono essere diversi, e quindi c'è una possibilità che Server o Database potrebbe non essere il valore del Registro di sistema necessario, ma ispezionarlo personalmente e trovare i nomi dei valori nel registro per sapere come leggerlo.

+0

NOTA: ho incluso solo il nome del server a causa di un'interpretazione errata iniziale della domanda. Inizialmente avevo risposto con il nome del server e in seguito ho aggiunto il nome del database quando ho capito che era quello che veniva chiesto. –

+0

Trovato le impostazioni nella sezione 64 bit del mio sistema operativo. Sarò in grado di ottenere l'applicazione da lì e la posizione a 32 bit per il nome del database. Grazie! – ChargerIIC

1

È possibile utilizzare l'API ODBC SQLGetPrivateProfileString per ottenere il contenuto di DSN creato.

int SQLGetPrivateProfileString( 
LPCSTR lpszSection, 
LPCSTR lpszEntry, 
LPCSTR lpszDefault, 
LPCSTR RetBuffer, 
INT  cbRetBuffer, 
LPCSTR lpszFilename); 

Qui,

lpszSection = sezione del registro che si desidera dettagli per. sarà il nome DSN nel tuo caso.

lpszEntry = chiave da cui si desidera estrarre il valore. si desidera ottenere le informazioni sul nome del database, quindi è necessario controllare la voce di registro HKEY_LOCAL_MACHINE \ Software \ ODBC \ ODBC.INI [YOUR_DSN_NAME] per sapere qual è il nome della chiave per memorizzare le informazioni sul nome del database. Questo perché un diverso driver può avere un nome chiave diverso per memorizzare il nome del database.

lpszDefault = Valore predefinito per la chiave specificata nell'ultimo argomento (lpszEntry) se la chiave non viene trovata.

RetBuffer = Pointer to Output buffer in cui viene ricevuto il valore per la chiave specificata.

cbRetBuffer = dimensione del buffer indicata da RetBuffer nei caratteri.

lpsz Nome file = Nome file in cui si cercano queste voci. Sarà odbc.ini nel tuo caso.

esempio Esempio

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); 

Si cercherà registro di entrata HKEY_CURRENT_USER o HKEY_LOCAL_MACHINE o entrambe a seconda del set modalità di configurazione (Può essere impostato utilizzando SQLSetConfigMode API ODBC). Se la modalità non è impostata in modo esplicito, cercherà sia HKEY_CURRENT_USER che HKEY_LOCAL_MACHINE. Per ulteriori informazioni, consultare https://docs.microsoft.com/en-us/sql/odbc/reference/syntax/sqlgetprivateprofilestring-function.