2013-03-01 7 views
5

Ich habe eine Delphi 6-Anwendung, die eine ODBC-DSN verwendet, um eine Verbindung zu Zieldatenbanken herzustellen. Ich möchte einen Text einfügen, der den Namen der Datenbank auflistet, mit der der DSN verbunden ist. Ich habe versucht, den SQL-Befehl db_name() zu verwenden, erhielt aber nur eine Antwort als Antwort, obwohl es funktioniert, wenn ich mich beim SQL Server anmelde.Müssen den Datenbanknamen in einer ODBC DSN verbundenen Anwendung identifizieren

Gibt es einen Weg innerhalb von Delphi zu identifizieren, mit welcher Datenbank ich verbunden bin? Ich kann die sys.databases Tabelle nach oben ziehen, aber ich bin nicht sicher, wie zu erkennen, welche Datenbank die ist, ich

Als Beispiel verbunden bin:

, wenn ich an die dsn anschließe LocalDSN I wollen dem Benutzer anzeigen können, dass sie mit Datenbank verbunden sind, wobei Datenbank der Name der SQL-Datenbank ist, mit der sie kommunizieren.

+4

Sie können den DSN-Namen nicht über sql annehmen, da AFAIK der Engine selbst nicht die Mechanismen bekannt ist, die Sie zum Herstellen einer Verbindung verwenden, aber Sie können sie sicher aus der Eigenschaft übernehmen, in der sie sich im Verbindungsobjekt befinden verwenden. Wenn Sie beispielsweise TSQLConnection verwenden, wird dies in den Parametern gespeichert. – jachguate

+0

Leider scheint das Verbindungsobjekt nur die drei Eigenschaften zu haben - den Namen des DSN und den Benutzernamen und das Passwort des Benutzers. Die Anwendung verwendet ein TQuery und TDatabase-Objekt (beide aus dem vcl), wenn das hilft – ChargerIIC

+0

@jachguate sollten Sie das eine Antwort machen. –

Antwort

3

Der ODBC-DSN wird in der Windows-Registrierung gespeichert. Beachten Sie, dass die Windows-Registrierung und damit die ODBC-DSN-Einstellungen zwischen 32- und 64-Bit-Versionen aufgeteilt sind. Sie können auf diese Informationen über HKEY_LOCAL_MACHINE\Software\ODBC\ODBC.INI\[YOUR_DSN_NAME] zugreifen und dann den Wert Database oder Server lesen, um den Namen der Datenbank oder des Servers zu erfahren.

Sie den Server und die Datenbank-Namen mit diesen Funktionen lesen:

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; 

Je nachdem, welche Datenbank-Engine und Treiber, die Sie verwenden, können die Inhalte dieser Registrierungsschlüssel unterschiedlich sein, und daher ist es eine Möglichkeit, dass Server oder Database möglicherweise nicht der Registrierungswert ist, den Sie benötigen, aber überprüfen Sie es selbst und finden Sie Ihre Wertnamen in der Registrierung, um zu wissen, wie man es liest.

+0

Hinweis: Ich habe nur den Servernamen wegen einer ersten falschen Interpretation der Frage aufgenommen. Ich habe ursprünglich mit dem Servernamen geantwortet und später den Datenbanknamen hinzugefügt, als mir klar wurde, dass das gefragt wurde. –

+0

Gefunden die Einstellungen unter dem 64-Bit-Abschnitt meines Betriebssystems. Ich werde in der Lage sein, die Anwendung von dort und dem 32-Bit-Speicherort für den Datenbanknamen ziehen zu lassen. Vielen Dank! – ChargerIIC

1

Sie können die SQLGetPrivateProfileString ODBC-API verwenden, um den Inhalt von DSN zu erstellen. Hier

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

,

lpszSection = Registry-Abschnitt möchten Sie Informationen zu. In Ihrem Fall wird es DSN-Name sein.

lpszEntry = Schlüssel, aus dem der Wert extrahiert werden soll. Wenn Sie Informationen zum Datenbanknamen abrufen möchten, müssen Sie den Registrierungseintrag HKEY_LOCAL_MACHINE \ Software \ ODBC \ ODBC.INI [YOUR_DSN_NAME] überprüfen, um zu wissen, welcher Schlüsselname zum Speichern von Datenbanknamensinformationen dient. Dies liegt daran, dass unterschiedliche Treiber unterschiedliche Schlüsselnamen zum Speichern des Datenbanknamens haben können.

lpszDefault = Standardwert für den im letzten Argument angegebenen Schlüssel (lpszEntry), wenn der Schlüssel nicht gefunden wird.

RetBuffer = Zeiger auf Ausgabepuffer, in dem der Wert für den angegebenen Schlüssel empfangen wird.

cbRetBuffer = Größe des Puffers, auf den RetBuffer in Zeichen zeigt.

lpszDateiname = Dateiname, in dem Sie diese Einträge suchen. In Ihrem Fall wird es odbc.ini sein.

Musterbeispiel

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

Es wird Registrierungseintrag HKEY_CURRENT_USER oder HKEY_LOCAL_MACHINE oder beide in Abhängigkeit von dem Config Mode-Set suchen (Es kann mit SQLSetConfigMode ODBC-API festgelegt werden). Wenn der Modus nicht explizit festgelegt ist, wird sowohl nach HKEY_CURRENT_USER als auch nach HKEY_LOCAL_MACHINE gesucht. Weitere Informationen finden Sie unter https://docs.microsoft.com/en-us/sql/odbc/reference/syntax/sqlgetprivateprofilestring-function.

Verwandte Themen