QSqlTableModel ist immer leer

Alles rund um die Programmierung mit Qt
Antworten
derhandwerk
Beiträge: 7
Registriert: 28. Juli 2005 13:42

QSqlTableModel ist immer leer

Beitrag von derhandwerk »

Hallo zusammen,

ich habe folgendes Problem:

Ich versuche eine Klasse zu erstellen, mit dessen Hilfe es möglich sein soll zur Laufzeit die Datenbank (QSQLITE) abzuändern.

Die Klasse DBManager stellt meinen Versuch dar:

Code: Alles auswählen

class DBManager : public QObject
{
Q_OBJECT
public:

   DBManager(QObject *parent = 0);

    QString dbName();
    void setDBName(QString dbName);
   
    void initDB();

private:
    QString _dbName;
    QSqlDatabase _db;
    

};

Code: Alles auswählen

/* ... getter für die Attribute  ... */

void DBManager::initDB()
{
    this->_db = QSqlDatabase::addDatabase("QSQLITE");
    this->_db.setDatabaseName(this->dbName());

    if (!this->_db.open()) {
        QMessageBox::critical(0, tr("DB could not be opened!"), this->_db.lastError().text());
        return;
    }

    qDebug("db opened");
}
Zum Programmstart übergebe ich dem DBManager den DB-Namen und rufe initDB() auf, welche auch ohne Fehlermeldung abläuft.
Die Instanz des DBManager wird als privates Attribut in meinem Hauptfenster gehalten, wenn ich nun jedoch in meinem Hauptfenster ein QSqlTableModel anlege und eine abfrage auf einer Tabelle, in der zugehörigen DB Mache, bleibt das Ergebnis (ohne Fehlermeldung) leer, obwohl die entsprechende Tabelle definitiv nicht leer ist.

Code: Alles auswählen

void MainWindow::MainWindow()
{
   QSqlTableModel model;
   model.setTable("members");
   model.select();
   
   int i = model.rowCount(); // ist 0
}
Versuche ich das ganze innerhalb von DBManager, funktioniert es ohne Probleme.



Kann mir hier jemand weiterhelfen?


Gruß und Dank

DerHandwerk
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Und woher weiß dein Model welche DB er nehmen soll? Das TableModel hat außerdem ein paar Funktionen mit denen man abfragen kann was nicht funktioniert.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
derhandwerk
Beiträge: 7
Registriert: 28. Juli 2005 13:42

Beitrag von derhandwerk »

Hallo,

so weit wich es verstanden habe, wir durch

this->_db = QSqlDatabase::addDatabase("QSQLITE");

Die Standard Verbindung deklariert, dann für alle weiteren DB-Operationen herangezogen wird.

Bedeutet die nun, dass ich dem QSqlTabelModel über den Konstruktur die DB-Verbindun mit geben muss? Aber warum muss ich dies nicht tun, wenn ich das TabelModel innerhalb von DBManager verwenden?

Gruß

DerHandwerk
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Du gibst ja der Verbindung keinen Namen - stimmt dann reicht die Standardverbindung.
Trotzdem hat QSqlDataModel eine Funktion lastError(). Auch kann man schauen welche DB-Connection er verwendet und ob diese offen ist usw.

/edit: Rechtschreibkorrektur :)
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
derhandwerk
Beiträge: 7
Registriert: 28. Juli 2005 13:42

Beitrag von derhandwerk »

Hallo,

ich hab nun einmal ein kleines Testprojekt angelegt um das Problem isoliert zu betrachten.

Code: Alles auswählen

class DBManager : public QObject
{
public:
    DBManager();

    QString dbName();
    void setDbName(QString dbName);

    void openDB();
    void closeDB();

private:
    QSqlDatabase _db;
};

Code: Alles auswählen

DBManager::DBManager()
{
    this->_db = QSqlDatabase::addDatabase("QSQLITE");
}

/**
  * PUBLIC METHODS
  */
QString DBManager::dbName()
{
    return this->_db.databaseName();
}

void DBManager::setDbName(QString dbName)
{
    this->_db.setDatabaseName(dbName);
}

void DBManager::openDB()
{
    if (!this->_db.open()) {
        qDebug(this->_db.lastError().text().toLocal8Bit());
    }

    qDebug("db opened");
}

void DBManager::closeDB()
{
    if (this->_db.open()) {
        this->_db.close();
        qDebug("db closed");
    }
}

Code: Alles auswählen

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    DBManager dbManager;
    dbManager.setDbName("/Users/wolle/club1.db");

    QSqlTableModel model;
    model.setTable("members");
    model.select();

    int i = model.rowCount();
    qDebug(QVariant(i).toString().toLocal8Bit());

    dbManager.setDbName("/Users/wolle/club2.db");
    model.select();

    int j = model.rowCount();
    qDebug(QVariant(j).toString().toLocal8Bit());

    return a.exec();
}
Hier klappt es so weit ganz gut, warum es in meinem eigentlichen Programm nicht funktioniert muss ich nun noch herausfinden.

In der members Tabelle in club 1 ist genau ein Eintrag, welcher auch gefunden wird. In der Tabelle in club2 sind es zwei Reihen. Ich stehe jetzt jedoch vor dem Problem, die DB während der Lauf zeit von club1 auf club2 ändern zu wollen. Im obigen Teil geben beide qDebugs den Wert 1 aus (also die Zeilenanzahl von members in club1). Vermutlich bekommt das Tabelmodel den DB-Wechsel nicht mit, gibt es dort einen Weg das Model zu aktualisieren?
jerry42
Beiträge: 126
Registriert: 9. Oktober 2008 10:48

Beitrag von jerry42 »

Vielleicht hilft Dir die Methode weiter.

http://doc.trolltech.com/4.5/qsqlquerymodel.html#clear
Antworten