Wählen Sie aus SQLite mit Qt

Ich versuche, mit SQLite-database auf Qt 4.5.3 unter Linux umzugehen. Ich habe die Databasae bereits erstellt.

Dann versuche ich Select auf Qt auszuführen:

db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName(filename); // Here is FULL path to the database. I've checked it twice :) bool ok = db.open(); qDebug() << db.tables(); QSqlQuery query; query.exec("select * from lessons"); qDebug() << query.size(); qDebug() << query.isSelect(); qDebug() << query.isValid(); 

Aber Debug-Konsole sagt:

 ("lessons", "weeklessons", "weeks") -1 true false 

Warum es nichts auswählt? Was habe ich falsch gemacht?

Die isValid () -Methode gibt true zurück, wenn die Abfrage in einem gültigen datasatz positioniert ist, aber nach dem Aufruf von exec () nicht: Sie müssen zuerst zu einem gültigen datasatz wechseln, zum Beispiel mit query.first () oder query. Nächster(). Siehe Qt-Dokumentation: http://doc.qt.io/archives/4.6/qsqlquery.html

Die Größe (), die -1 zurückgibt, bedeutet nicht, dass es kein Ergebnis gibt: SQLite ist eine der databaseen, für die die Größe der Abfrage nicht direkt verfügbar ist (siehe in der Dokumentation zu QSqlDriver :: hasFeature ()). Sie können überprüfen, ob Zeilen zurückgegeben werden, und die Größe mit einer loop und query.next () ermitteln.

Je nachdem, was Sie mit dem Ergebnis Ihrer Auswahl tun möchten, können Sie auch QSqlQueryModel anstelle von QSqlQuery verwenden.

In Ihrer "QSqlQuery-Abfrage" Deklaration müssen Sie die databaseverbindung angeben, zB "QSqlQuery query (db)"

Wenn Ihr Programm meldet, dass die Abfrage ungültig ist, sehen Sie sich die Fehlermeldung wie folgt an:

 QDebug() << query.lastError().text(); 

Dies sollte Ihnen beim Debuggen des Problems helfen.

Ohne viel über Qt zu wissen, stellte ich mir eine Frage: Wie weiß die QSqlQuery , welche Verbindung zu verwenden ist QSqlQuery Wenn Sie das im Handbuch nachschlagen, haben Sie im Grunde genommen zwei Möglichkeiten, eine Abfrage auszuführen:

  1. query = db.exec("select * from lessons");
    databaseverbindung verwenden und von dort aus ausführen .
  2. QSqlQuery query( db );
    Die Abfrage mit der vorhandenen database erstellen und dann die Abfrage ausführen:
    query.exec("select * from lessons");

edit: Nach dem Lesen von mehr, scheint es, dass Standard-Verbindungen unterstützt werden, so sollte Ihr Beispiel funktionieren …

Könnten Sie versuchen, die Abfrage stattdessen als Konstruktorwert zu übergeben? Vielleicht klappt es dann.

 QSqlQuery query("select * from lessons");