Hat sich jemand schonmal mit dem o.g. Thema beschäftigt?
Wenn ich feststelle, dass eine QSqlQuery auf einen Fehler läuft, möchte ich gerne ermitteln, ob noch eine korrekte Verbindung zur entfernten Datenbank besteht. In meinem Fall Oracle und MySql.
Mein Testfall: Ich verbinde mich fehlerfrei zur Oracle-Datenbank und kann Selects ausführen. Dann ziehe ich das Netzwerkkabel von meinem Rechner. Die Funktion "QSqlQuery->exec()" beendet sich mit "false" und lastError() gibt folgende Infos, die mir leider nicht weiterhelfen:
Ja, das steht da. Nur ich will nicht den Text vergleichen, um herauszufinden, ob noch eine funktionierende Verbindung besteht. Denn der Text kann sich auch ändern (Englische Version, Client-Unterschiede,usw.)
Es ist halt ein Serverprogramm, dass automatisch einen Reconnect machen soll.
Es gibt keinen anderen Hinweis, dass keine Verbindung zur Datenbank besteht. QSqlDatabase->isOpen() liefert true zurück. Alles deutet auf eine korrekt DB-Verbindung hin, wohl es nicht so ist.
Du kannst den Typ der Fehlermeldung von lastError() abfragen. Dürfte sich kaum in naher Zukunft ändern und sollte bei unterschiedlichen Datenbanken gleich sein
AuE hat geschrieben:Das Problem ist doch das isOpen() true liefert..... wie kann man das Umgehen das ist doch hier die Frage!
nana,
die Antwort auf diese Frage hast Du anscheinend nicht erkannt.
1. Qt liefert Unsinn.
2. Also eigene Funktion bool isConnected() o.ä.
3. oder lastError() jedesmal auswerten
an AuE, falls Du eine Funktion von Qt kennst, die das macht, bitte mitteilen.
Das ist es ja grade ... das ist denke ich ein Bug/Feature von Qt
Und der ders gefunden hat darf den Bug eingeben
Was passiert denn wenn du einmal ne query abschießt (die ja dann schief geht) und anschließend nochmals ein isOpen() machst? Spätestens dann sollte dort false kommen.
Ich habe das früher so gelöst das ich meiner open Funktion nen bool bForce = false mitgegeben habe ... und dann einfach wenn ich nen fehler hatte die Funktion mit true aufgerufen habe. Spätestens da solte dann ja etwas passieren!
upsala hat geschrieben:QSqlError liefert im übrigen nicht nur einen Text sondern auch eine Nummer.
hm hm, war das nicht weiter oben schon mein Tip.
AuE hat geschrieben:Das ist es ja grade ... das ist denke ich ein Bug/Feature von Qt
So sehe ich die Sache allerdings auch. Nur angesichts der sonstigen Qualität von Qt und der Tatsache, das Sql schon länger im Angebot von Qt ist kann ich mich des Eindrucks nicht erwehren das Qt diesen Unsinn für ein sinnvolles Feature hält.
QSqlIndex z.B. ist eine sinnfreie Klasse
tschüß
Troll.Soft
Was mich bei dem Error-Type von lastError() verwundert ist, dass er bei einem Verbindungsproblem "StatementError" liefert, obwohl das SQL-Statement 100% in Ordnung ist.
Ich habe es jetzt so gelöst, dass ich bei fehlerhaften Ausführen von QSqlQuery->exec(), die Datenbankverbindung schließe, sie neu aufbaue und das Query noch einmal ausführe. Denn alle Statements werden von der Software generiert, so dass Syntaxfehler auszuschließen sind.
Nur ich muss Troll.Soft zu stimmen, dass das Handling von Verbindungsproblemen nicht "ganz korrekt" ist oder verbessert werden könnte.
Zuletzt geändert von Markus am 30. April 2010 11:04, insgesamt 1-mal geändert.
AuE hat geschrieben:Was passiert denn wenn du einmal ne query abschießt (die ja dann schief geht) und anschließend nochmals ein isOpen() machst? Spätestens dann sollte dort false kommen.
Meiner Erkenntnis nach liefert isOpen() immer "true" zurück bis man eigenhändig die Datenbank schließt. Will man dann die Datenbank wieder öffnen (was ja wegen Netzwerkprobleme - Kabel ab) nicht geht, wird es erkannt und isOpen() und isOpenError() liefern korrekte Return-Werte.
Dann ist es ein Bug -> wenn dir die Query auf Grund von keiner Verbindung (Was ja der Error sagt) um die Ohren fliegt darf danach isOpen() nicht true liefern!