Verbindung zu einer SQL-Tabelle überprüfen
-
Guten Tag
Ich muss bei meinem Tool beim Start des Programms die Verbindung zu der MySQL-Tabelle überprüfen.
Ich habe ein TDatabase Objekt und TQuery Objekt. Die Verbindung wird ja dabei über die ODBC-Schnittstelle hergestellt.
Nun muss ich eben die Verbindung zu der SQL-Tabelle überprüfen, sprich ob die Verbinung steht oder eben nicht..
Habt ihr mir evtl einen Tipp? Ich habe es wie folgt versucht:
if(Database1->Connected == true) { // .. } else { // .. }Jedoch funktioniert dies leider nicht.. Sonst im Notfall würde mir auch reichen eine Überprüfung ob der Server noch on ist, aber schon lieber ob die Verbindung zu dem Server besteht..
Besten Dank
-
einfache moeglichkeit unter der annahme dass du nicht allzu oft pruefen musst waere, einfach was abzufragen, etwa "COUNT (*) FROM users;".... und wenn da was zurueckkommt besteht ne verbindung....
in dem fall sollte aber der timeout recht niedrig eingestellt sein.
-
also ich habe das nun mal wiefolgt versucht:
void __fastcall Tfrmmain::Timer1Timer(TObject *Sender) { // try { SQL_ETS->Close(); SQL_ETS->SQL->Clear(); SQL_ETS->SQL->Add("SELECT id FROM user LIMIT 1"); SQL_ETS->ExecSQL(); SQL_ETS->Open(); disconnect = 0; } catch (...) { // Fehler disconnect = 1; } }Hat mir jemand sonst noch einen Tipp, wie ich das machen könnte? Evtl mit einem Ping zu der IP des Servers, wie würde dies gehen?
-
Lies dir in der BCB-Hilfe bitte bei TQuery und ExecSQL bzw. Open durch wann was verwendet wird, da du dort einen Fehler hast
-
Linnea schrieb:
Lies dir in der BCB-Hilfe bitte bei TQuery und ExecSQL bzw. Open durch wann was verwendet wird, da du dort einen Fehler hast
hm, sehe den fehler gerade nicht so ganz.. aber diese abfrage funktioniert eigentlich, das problem ist einfach, dass sich das programm im tray aufhängt, wenn keine verbindung besteht..
eine andere möglichkeit wäre ja mit einem ping an den server.. wie würde dies funktionieren?
-
Du solltest trotzdem ExecSQL hier weglassen. Du brauchst sowieso nur ExecSQL oder Open (hier Open).
-
Hallo
Thema Ping : Im Indy-Package gibt es eine Ping-Komponente. Damit kannst du an den Server und Port testen.
Allerdings heißt eine Antwort nicht, das dort an dem Port ein MySQL-Server läuft, nur das irgendetwas dort läuft.Ich verstehe nicht warum du mit
if(Database1->Connected == true)
Probleme hast. Wenn die Datenbank-Kompo verbunden ist läuft der Server, wenn nicht dann kann keine Verbinduing hergestellt werden. Sollte doch völlig reichen.
bis bald
akari
-
akari schrieb:
Thema Ping : Im Indy-Package gibt es eine Ping-Komponente. Damit kannst du an den Server und Port testen.
Allerdings heißt eine Antwort nicht, das dort an dem Port ein MySQL-Server läuft, nur das irgendetwas dort läuft.Und welche Komponente, wäre dies? Da gibt es ja so einige und keine die mit Ping heisst..
akari schrieb:
Ich verstehe nicht warum du mit
if(Database1->Connected == true)
Probleme hast. Wenn die Datenbank-Kompo verbunden ist läuft der Server, wenn nicht dann kann keine Verbinduing hergestellt werden. Sollte doch völlig reichen.
Naja gute Frage.. Keine Ahnung, da hängt sich das Programm einfach auf, da es trotzdem durch diese If-Anweisung geht..
Muss natürlich sagen, dass ich um dies zu testen, immer meine Internet-Verbindung trenne und nicht die zum Server, aber sollte ja eigentlich aufs selbe ankommen..
-
Hallo
Und welche Komponente, wäre dies? Da gibt es ja so einige und keine die mit Ping heisst..
das liegt daran das Ping nur ein umgangsprachlicher Begriff ist. Das Protokoll heißt richtig ICMP. Und deshalb heißt die Indy-Komponente auch TIdICMP
Naja gute Frage.. Keine Ahnung, da hängt sich das Programm einfach auf, da es trotzdem durch diese If-Anweisung geht..
Bestimmt nicht wegen dieser Abfrage, der grund wird eher sein das du vort dieser Abfrage schon auf die nicht-verbundene Kompo zugreifen willst.
Das solltest du lieber debuggen. Auch ein Minimalbeispiel wär gut. Desweiteren kannst du Fehelr beim Verbindungsaufbau auch durch entstrechende Exceptions abfangen.bis bald
akari
-
Und welche Komponente, wäre dies? Da gibt es ja so einige und keine die mit Ping heisst..
das liegt daran das Ping nur ein umgangsprachlicher Begriff ist. Das Protokoll heißt richtig ICMP. Und deshalb heißt die Indy-Komponente auch TIdICMPAlso erstmal besten Dank. Habe mir nun mal diese Komonente angeschaut..
void __fastcall TForm1::Timer1Timer(TObject *Sender) { IdIcmpClient1->Host = "marcluethi2.homeunix.com"; IdIcmpClient1->Port = 3306; IdIcmpClient1->Ping(); if(IdIcmpClient1->ReplyStatus.ReplyStatusType == rsTimeOut) { Application->MessageBoxA("Verbindung: Fehler!","...",0); } }Mein Problem.. Der Timer habe ich auf 5 sec gestellt und das TimeOut auf 2sec. Wenn das Programm jedoch schon einmal durch die If-Schlaufe gegangen ist funktioniert das Pring nicht mehr.. Kommt ein Socket-Fehler.
Naja gute Frage.. Keine Ahnung, da hängt sich das Programm einfach auf, da es trotzdem durch diese If-Anweisung geht..
Bestimmt nicht wegen dieser Abfrage, der grund wird eher sein das du vort dieser Abfrage schon auf die nicht-verbundene Kompo zugreifen willst.
Das solltest du lieber debuggen. Auch ein Minimalbeispiel wär gut. Desweiteren kannst du Fehelr beim Verbindungsaufbau auch durch entstrechende Exceptions abfangen.Ich denke ich habe nun das Problem gefunden.. Habe ein Projekt eröffnet, welches nur die Verbindung überprüft und diese dann versucht wieder aufzubauen, wenn sie nicht besteht.. So wie ich nun dies gesehen habe, ist Database1->Connected nur die Verbindung zu der ODBC-Schnitstelle.. und nicht bis zum Server. Kann das mir nur so erklähren
