Seite 1 von 1

[gelöst] QSqlTableModel verliert Datenbank Connection ... ?

Verfasst: 13. März 2012 08:24
von fmr
Guten Tag,
ich erarbeite mir gerade ein eigenes Maskenframework in QT4.7 zur Programmierung größerer Datenbankprojekte.
Im großen und ganzen komme ich gut voran allerdings möchte ich die Datenbankverbindung mit einem eigenen Namen versehen und nicht immer mit der "qt_sql_default_connection" arbeiten. Immerhin könnte es mal sein, dass eine Maske mehrere Datenbankverbindungen benötigt.

Mein Problem:
Benutze ich einen eigenen Datenbanknamen geht die Datenbank Connection irgendwo im QSqlRealtionalTableModel verloren, so dass darin nicht mehr auf die Tabellen in der Datenbank zugegriffen werden kann.

Für den Code in dem der Fehler auftritt wird zunächst ein QDialog mit Widgets für Eingabe von Kennung und Passwort angezeigt und dann mit der Datenbank erfolgreich verbunden. Datenbank: Oracle, Treiber: in Qt mitgelieferter QOCI8 Treiber.

Code: Alles auswählen

class MyQSqlTableModel : public QSqlRelationalTableModel
{
public:
    explicit MyQSqlTableModel ( QObject * parent = 0, QSqlDatabase db = QSqlDatabase() )
    {
        m_specialColumnNo = -1;
        qDebug() <<"MyQSqlTableModel, connection: "<<db.connectionName() <<"  Offen? "<<db.isOpen() <<" Valid? "<<db.isValid();
        ::QSqlRelationalTableModel (parent, db);
        qDebug() <<"verwendete connection: "<<database().connectionName() <<"  Offen? "<<database().isOpen() <<" Valid? "<<database().isValid();
    }
Setze ich beim

Code: Alles auswählen

.....
  name = "qt_sql_default_connection";
.....

bool MyLogin::isDbOpen() {
    MyDb::db = QSqlDatabase::addDatabase("QOCI8", name);
    if (MyDb::db.isOpen())
      return true;
    return false;
}
bekomme ich als Meldungen im Debug Fenster:

Code: Alles auswählen

Datenbank offen ? true   Name:  ("qt_sql_default_connection") 
MyQSqlTableModel, connection:  "qt_sql_default_connection"   Offen?  true  Valid?  true 
verwendete connection:  "qt_sql_default_connection"   Offen?  true  Valid?  true 
Setze ich "name" aber auf "MeineMaske", dann kommt als Meldung:

Code: Alles auswählen

Datenbank offen ? true   Name:  ("MeineMaske") 
MyQSqlTableModel, connection:  "MeineMaske"   Offen?  true  Valid?  true 
verwendete connection:  ""   Offen?  false  Valid?  false 
es geht also bei der Initialisierung von QSqlRelationalTableModel die Datenbank verloren.

Ich weiss, das ist ein bisschen wenig Code, aber könnte es sein, dass ich etwas grundsätzliches übersehen habe oder ist da irgendwo tief drinnen vielleicht eine "Funktionsabweichung" ?


Bei der Gelegenheit gleich noch eine kleine Wissensfrage:
Wie kann eine vorhandene Datenbank Connection an ein weiteres parallel gestartetes Qt Programm (z.B. via SharedMemory) weiter geben?

Viele Grüsse,
Volker

Re: QSqlTableModel verliert Datenbank Connection ... ?

Verfasst: 13. März 2012 08:44
von franzf
Du hast den Sinn von connectionName nicht verstanden. Dieser soll für JEDE Verbindung EINDEUTIG sein. Wenn du für alle Verbindungen nur defaultConnection nimmst, geht das schief (siehe QSqlDatabase::addDatabase() - das dicke WARNING). Ersetzt du das durch "MeineMaske", geht es genauso schief, aus dem selben Grund.
Du musst es also irgendwie schaffen, für jede Verbindung einen eigenen Namen zu finden. Z.B. kannst du einen int bei jeder Verbindung hochzählen und per QString::number an "MeineMaske" anhängen -> "MeineMaske0", "MeineMaske1"...

Re: QSqlTableModel verliert Datenbank Connection ... ?

Verfasst: 13. März 2012 09:31
von fmr
Einspruch euer Ehren :-)

Ich habe das durchaus richtig verstanden. Genau deshalb will ich ja die Namen verwenden.
Bisher benutzt die Maske nur genau diese eine Verbindung und damit kommt das QSqlRelationalTableModel eben nicht klar, wenn der Name nicht der Default ist.
Hatte ich mich dermaßen missverständlich ausgedrückt? Ich bitte um Endschuldigung.

Ok, ich habe eben nochmal ein make clean, qmake, make all ausgeführt, für den Fall dass er mit irgendetwas veraltetem nicht klar kommt, es hat die Situation aber nicht geändert.

Re: QSqlTableModel verliert Datenbank Connection ... ?

Verfasst: 13. März 2012 10:13
von franzf
Argh - OK!
Dann eben das -> Basisintialisierung! ;)

Code: Alles auswählen

explicit MyQSqlTableModel ( QObject * parent = 0, QSqlDatabase db = QSqlDatabase() )
 : QSqlRelationalTaleModel(parent, db)
{
Problem:
QSqlRelationalTableModel-Konstruktor hat geschrieben:If db is not valid, the default database connection will be used.
Wenn du also die Basis nicht explizit selber initialisierst, wird diese automatisch mit dem Default-Konstruktor erledigt - parent=0, db=QSqlDatabase()->ist invalid-> verwende QSqlDatabase::database(/*defaultConnection*/)!
Auf alle Fälle jetzt direkt dein C++-Grundlagenbuch zur Hand nehmen und alles über Initialisierungsliste, Basisinitialisierer und Elementinitialisierer lesen (und merken! ist wichtig, wichtig, wichtig ;))

Re: QSqlTableModel verliert Datenbank Connection ... ?

Verfasst: 13. März 2012 10:59
von fmr
Hallo, Danke dass du dir mit mir so viel Mühe gibst.

Aufgabe an mich: Lesen lernen.

Danke, bitte markiert diese Frage als gelöst.

Re: QSqlTableModel verliert Datenbank Connection ... ?

Verfasst: 13. März 2012 11:08
von franzf
Ah, da wollte ich gerade antworten, dass das entscheidende die Zeile mit dem ":" ist, aber bis ich eingeloggt war, hast du es wohl selber gesehen ;)

Als "gelöst" markieren kannst du selber: Deinen ersten Post bearbeiten, und im Titel irgend was angeben, was auf das gelöst hindeutet (z.B. ein "[gelöst]" vorne dranstellen) - speichern - fertig :)