Problem bei QT-Version >5.7 mit QSqlDatabase

Alles rund um die Programmierung mit Qt
Antworten
RobRoy1304
Beiträge: 47
Registriert: 9. Juli 2009 10:56

Problem bei QT-Version >5.7 mit QSqlDatabase

Beitrag von RobRoy1304 »

Hallo Gemeinde,

mir wurde von einem Benutzer meines Projektes, eine Lagerverwaltung (opensource) https://sites.google.com/site/robertewert/,
nach dem er ein Update seiner Linux-Dispo durchführte, Probleme mit meinem Programm bezüglichder der Datenbankverbindung gemeldet.

Konkret geht es um eine SQLite 3-Datenbank und QSqlDatabase. Ich habe eine Zeit lang nicht an dem Projekt gearbeitet und meine letzten Arbeiten
am Projekt liefen mit Version von Qt 5.7 auch tadellos. Ich bin dem nachgegangen und habe feststellen müssen, das neuere Versionen von QT
die Fehlermeldungen:

Code: Alles auswählen

QSqlDatabasePrivate::database: requested database does not belong to the calling thread.
QSqlQuery::prepare: database not open
12:37:07: C:\Users\rober\Desktop\progge
produzieren. (getestet mit Windows 10 (64-Bit) / QtCreator / QT 5.9 (64.Bit))

Zum Aufbau des Programmes:

Code: Alles auswählen

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
    virtual void closeEvent(QCloseEvent *event);

private:
    Ui::MainWindow *ui;
public:
    int m_iTimerId;
    CWorkThread m_thread;//work thread
    CDbConnection m_db;//database interface//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Code: Alles auswählen

class CDbConnection
{
private:
    [b]QSqlDatabase m_db;//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!![/b]
Im Mainwindow gibt es eine Instranz von CDbInterface, in dieses gibt es eine Instanz von QSqlDatabase. Der Code für alle Datenbankzugriffe
befindet sich in der Klasse CDbInterface. Sämtliche Eingabefenster und auch der Workthread haben Zugriff auf die Intanz von CDbInterface
im Mainwindow mittels eines Zeigers.

Der Quellcode ist auf meiner homepage verfügbar, Version 0.34_4. Hat jemand eine Idee für eine Lösung meines Problemes, danke.
Liebe Grüße Robert
veeman
Beiträge: 277
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: Problem bei QT-Version >5.7 mit QSqlDatabase

Beitrag von veeman »

Die Fehlermeldung beschreibt doch das Problem eindeutig.

Die Datenbank ist auf einen bestimmt Thread 'gelocked' und kann nur von diesem Zugegriffen werden.

Vermutlich wurde der Check in einer neuen Sqlite Version hinzugefügt, damit sichergestellt ist das Transaktion nicht kollidieren und Daten verloren gehen.

Du musst sicherstellen, dass die Transaktionen nur von einem Thread ausgeführt werden.
veeman
Beiträge: 277
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: Problem bei QT-Version >5.7 mit QSqlDatabase

Beitrag von veeman »

Ich hab mal kurz in den Code reingeschaut. Du scheinst die Verbindung über mehrere Transaktionen aufrecht zu erhalten, darauf deuten die public open/close Funktionen.

Mittlerweile ist 'best-practice' die Verbindung nur für eine kurze Zeit offen zu halten und logische Transaktionen zu bündeln.

Mein Vorschlag für einen schnellen fix wäre diese zwei Methoden private zu definieren und alle Funktionen die die Datenbank-Klasse zum Zugriff darauf bereitstellt mit open/close zu umschlissen. Und ggf. Mit einem einfachen Mutex zu schützen, insofern dein Threading dies zu lässt ohne in ein Dead-Lock reinzulaufen.
Antworten