Seite 1 von 1

Datenbank-Zugriff in QDialog

Verfasst: 16. Januar 2020 22:56
von Nukleus
Hallo,

ich habe eine Applikation mit einer Reihe von Masken, die teilweise zugehörige Dialoge haben. D.h. ich stelle in einer Maske z.B. Daten dar, die ich aus einer Datenbank lese. Wenn ich einen neuen Datensatz erstellen, einen bestehenden Datensatz ändern oder einen Datensatz löschen will, dann habe ich dazu jeweils einen Dialog geschrieben, der die nötigen Aktionen durchführt.

Die Daten liegen in einer MYSQL-Datenbank.

Ich habe eine einzige QSQLDatabase-Instanz (in QApplication). Dort wird auch die Datenbank geöffnet. Alle (ca. 35) Masken verwenden einfach QSqlQuery, um auf die anzuzeigenden Daten zuzugreifen. Das Ganze funktioniert (auch jetzt noch) einwandfrei.

Zur Datenmodifikation verwende ich jeweils QDialog. In diesen wird im Konstruktor grundsätzlich Konfigurationsparameter (ebenfalls per QSqlQuery) aus der Datenbank gelesen und auch das funktioniert einwandfrei. D.h. der Konstruktor eines Dialogs kann ebenfalls auf die Datenbank zugreifen und Daten daraus lesen. Eine Dialog ist jeweils Child der zugehörigen Maske.

In jedem Dialog habe ich eine Routine, über die ich dem Dialog mitteilen kann, welchen Datensatz ich verändern und was (Neu, Mod, Del) ich mit dem Datensatz machen will. Das funktionierte bis vor kurzem auch einwandfrei.

Seit einigen Tagen (genauer kann ich es leider nicht eingrenzen) haben alle Dialoge zwar Zugang zur Datenbank im Konstruktor, aber nicht mehr in der Routine, über die ich mitteile, was ich an welchem Datensatz verändern will.

Ich erhalte jetzt Fehler "QSqlQuery::prepare: database not open" bzw. "QSqlQuery::exec: database not open" und keiner der Dialoge funktioniert mehr. Dies unabhängig davon, ob ich den Dialog mit exec oder mit open starte.

Ich verwende Leap 15.1 als Betriebssystem und Qt5.9.7 als Qt-Version. Als Datenbank benutze ich 10.2.29-MariaDB.
Die Datenbank läßt 151 Connections zu und ich benutze ca. 40. Probehalber habe ich die maximale Zahl der Connections auf 250 hochgesetzt, ohne daß sich am beschriebenen Verhalten was geändert hätte.

Frage: Was könnte die Ursache sein?

Re: Datenbank-Zugriff in QDialog

Verfasst: 17. Januar 2020 09:20
von Nukleus
einen (zeitlichen) Hinweis habe ich noch.

Ich habe eine zweite Applikation, mit deren Hilfe ich meine Garmin-Laufuhr auslese und die gelesenen Daten tabellarisch darstelle. Auch da liegen die zugehörigen Daten in einer MYSQL-Datenbank. Auch da gibt es einen Dialog, mit dem ich den Leseprozess von der Uhr durchführen, einen bestimmten Datensatz löschen oder einen Datensatz ändern kann (z.B. welcher Laufschuh wurde benutzt).

Auch in dieser Applikation funktioniert der zugehörige Dialog nicht mehr.

Den Datensatz vom 11.1. konnte ich noch auslesen und in die Datenbank schreiben, beim Datensatz vom 16.1. ging das nicht mehr.

Dies ohne jede Modifikation des Codes.

Re: Datenbank-Zugriff in QDialog

Verfasst: 17. Januar 2020 22:47
von Nukleus
ok, ich habe das Problem sozusagen mit der Brechstange gelöst:

In jeder der in Frage kommenden Methoden habe ich eine Abfrage eingebaut, ob die Datenbank geöffnet ist. Wenn nicht, dann wird sie geöffnet.
Damit läuft meine Applikation wieder.

Ich weiß aber damit natürlich nicht, was sich geändert hat, damit diese Änderung überhaupt notwendig wurde.

Re: Datenbank-Zugriff in QDialog

Verfasst: 20. Januar 2020 22:45
von veeman
Hast du MariaDB oder Qt geupdatet? Möglicherweise schließt jemand die verbindung autmoatisch. Ggf der Host?

Re: Datenbank-Zugriff in QDialog

Verfasst: 30. Januar 2020 11:26
von Nukleus
Es kann schon sein, daß Qt / MariaDB mal aktualisiert worden ist / sind.

Einen "Host" gibt es nicht. Der Host ist mein eigener Rechner, auf dem sowohl Datenbank wie auch die auf Qt beruhende Applikation(en) laufen. So gut wie alles, was auf diesem Rechner passiert, habe ich in der Hand.

Ich habe natürlich die automatische Aktualisierung des Systems eingeschaltet, da kommen ja häufig Updates. Das sind so viele, daß ich mir nicht mehr genauer anschaue, was da alles reinkommt. Es ist gut möglich, daß irgendwann auch MariaDB oder Qt dabei waren.

Ich habe aber wg. Updates nie meine Applikation neu übersetzen müssen, was nach meinem Verständnis passiert wäre, wenn die Applikation z.B. auf einer veralteten Qt-Bibliothek beruht. Dann schmiert die Applikation möglicherweise ab, ich übersetze sie neu und alles ist wieder gut.

Mich wundert nur: zahlreiche Masken haben offene Datenbank-Verbindungen, die immer offen sind, wenn die betreffende Maske aktualisiert wird, ohne daß ich irgendwo ein zusätzliches db.open hätte absetzen müssen. Ein einziges db.open in der QApplication hat gereicht. Und diese zahlreichen Masken laufen immer noch so.

So liefen auch die Dialoge. Und urplötzlich können die Dialoge zwar im Konstruktor noch auf die Datenbank zugreifen, aber in den restlichen Methoden dann nicht mehr.

Wie gesagt: Mein Leidensdruck ist weg, es läuft alles wieder. Gewundert hat es mich trotzdem.