Verbindung zu MS SQL Express 2005 testen
-
Ich möchte, wie es bereits in der Überschrift steht, vor einem Datenbankzugriff testen, ob ich überhaupt eine Verbindung herstellen kann.
Ich greife über ODBC auf einen MS SQL Server 2005 zu. Ist der Server down bzw. die Datenbank nicht existent, dann dauert es realtiv lange, bis mir meine Anwendung über die interne Ausnahmenverwaltung (try.... catch....) mitteilt, dass der Zugriff gescheitert ist. Ich möchte eine kurze Prüfung ähnlich dem "Verbinung testen"-Button im ODBC-Manager des Betriebssystems. Leider fehlen mir da die Ansätze. Hat jemand einen Tipp wie das gehen könnte?
-
Hallo,
vermutlich hat die Connect-Methode einen Rückgabewert im Stil von true/false. Das hängt nun aber stark von der verwendeten Sprache ab!
LG
-
Ich denke eher dass bei einem Verbindungsversuch auf ein Server, der nicht reagiert, 1 Minute lang gewartet wird (network timeout). Du hast das mit dem "Verbinung testen" mit Maschinen geprüft die erreichbar waren. Ich denke nicht dass der Test den tcp-Stack umgeht und sich so die Minute sparen kann. Eventuell kannst du ein vorher ein ping absetzen, aber ich weiß nicht was du erreichen willst. Schließlich kann der server ja wirklich solange brauchen...
-
witte schrieb:
Ich denke eher dass bei einem Verbindungsversuch auf ein Server, der nicht reagiert, 1 Minute lang gewartet wird (network timeout). Du hast das mit dem "Verbinung testen" mit Maschinen geprüft die erreichbar waren. Ich denke nicht dass der Test den tcp-Stack umgeht und sich so die Minute sparen kann. Eventuell kannst du ein vorher ein ping absetzen, aber ich weiß nicht was du erreichen willst. Schließlich kann der server ja wirklich solange brauchen...
Nein, wenn du eine nicht erreichbare Maschine abtestest, dann geht das wesentlich schneller als aus meiner C-Anwendung heraus. Ich habe auch vermutet, dass es dann einen TimeOut gibt und das diese Zeit das limitierende Etwas ist.
RandomAccess85 schrieb:
Hallo,
vermutlich hat die Connect-Methode einen Rückgabewert im Stil von true/false. Das hängt nun aber stark von der verwendeten Sprache ab!
LG
Dies wird indirekt über try/catch gemacht. Dort wird eine Exception geworfen, die man dann abfängt und behandelt. Da ich mit dem Klassengerüst der MFC arbeite habe ich keinen direkten Zugriff auf die Connect-Methode, da diese vom Anwendungsgerüst indrirekt aufgerufen wird.
-
AndyDD schrieb:
Nein, wenn du eine nicht erreichbare Maschine abtestest, dann geht das wesentlich schneller als aus meiner C-Anwendung heraus. Ich habe auch vermutet, dass es dann einen TimeOut gibt und das diese Zeit das limitierende Etwas ist.
Nein, wenn ich eine nicht vorhandene IP-Adresse eingebe habe ich in dem odbc-Testfenster den 1 min-timeout. Gebe ich den Namen eines lokalen, nicht vorhandenen Servers ein bekomme ich schnell eine Antwort weil der lokale DNS/netbios keinen Eintrag für ihn hat.
1. Du kannst mal mit wireshark überprüfen was er in dem Testfenster macht.
2. Du solltest klären was du mit nicht erreichbar meinst, z.Z. down oder generell nicht existent.
-
witte schrieb:
AndyDD schrieb:
Nein, wenn du eine nicht erreichbare Maschine abtestest, dann geht das wesentlich schneller als aus meiner C-Anwendung heraus. Ich habe auch vermutet, dass es dann einen TimeOut gibt und das diese Zeit das limitierende Etwas ist.
Nein, wenn ich eine nicht vorhandene IP-Adresse eingebe habe ich in dem odbc-Testfenster den 1 min-timeout. Gebe ich den Namen eines lokalen, nicht vorhandenen Servers ein bekomme ich schnell eine Antwort weil der lokale DNS/netbios keinen Eintrag für ihn hat.
1. Du kannst mal mit wireshark überprüfen was er in dem Testfenster macht.
2. Du solltest klären was du mit nicht erreichbar meinst, z.Z. down oder generell nicht existent.Ok, ich hatte mich falch ausgedrückt. Ich meinte den Fall: Maschine ist Online (also IP ist korrekt und auch anpingbar), aber es laufen erstens entweder keine SQL-Dienste oder zweitens selbst die Datenbank ist existent, enthält aber nicht die angeforderte Tabelle. Dort hat es bisher bei mir auch eine Minute gedauert.
-
...das sollte dann aber nicht solange dauern. Wenn es wirklich am DB-server liegt könntest mit dem SQL Server Profiler mal schauen wo er hängt bzw dein Aufruf da sofort registriert wird.
-
witte schrieb:
...das sollte dann aber nicht solange dauern. Wenn es wirklich am DB-server liegt könntest mit dem SQL Server Profiler mal schauen wo er hängt bzw dein Aufruf da sofort registriert wird.
Ja das ist mir klar. Allerdings war das nicht die Fragestellung. Ich wollte nur wissen ob es unter C++ die Möglichkeit gibt, eine Abfrage nach Existenz und Lauffähigkeit des Servers bzw. der Datenbankinstanz und Tabelle durchzuführen.