QT Datenbankzugriff
-
Hi,
ich steh vor einen Problem, ich habe Daten in eine SQLite Datenbank geschrieben nur irgendwie bekomm ich sie nicht mehr rausQSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "loadConnection"); db.setHostName("localhost"); db.setDatabaseName("database"); //db.setPassword("time"); //db.setUserName("time"); bool b = db.open(); if(!b) { QSqlError err = db.lastError(); qDebug(err.text().toAscii()); emit error(Constants_SIGNAL_PROCESSOR_ERROR_DB_OPEN); return false; } QSqlQuery selectQuery("SELECT port, time, value FROM temptable;", db); selectQuery.exec(); QSqlError err = selectQuery.lastError(); qDebug()<< "error: " << err.text().toAscii(); int i=0; while(selectQuery.next()) { i++; Signal* sig = new Signal(); int port = selectQuery.boundValue(0).Int; qulonglong time = selectQuery.boundValue(1).ULongLong; sig->setPort(port); sig->setTime(time); sig->setSignalValue(selectQuery.boundValue(2).Int); emit signalSaved(sig); } qDebug() << "Rows: " << i; db.close();
Wenn ich mir die Inhalte als QVariant ausgeben lass sind die immer leer, auch wenn ich mir numRowsEffected ausgeben lass sagt er mir 0 aber das i ist genau so groß wieviele Elemente ich in derTabelle hab.
-
Hm, also ich hab afaik nie SetHostName oder SetDataBaseName für SQLite gebraucht.
Hast du dir das Beispiel für QSQL in der QT Hilfe schon angeschaut?phlox
-
ja das mit Hostname stammt noch aus der Zeit als ich Postgres probiert hatte, aber Databasename müsste eigentlich immer rein, weil irgendwie muss er ja die Datenbankdatei finden oder wie gibst du die an?
Meinst du die Sachen aus der Hilfe?
http://doc.trolltech.com/4.3/qsqlquery.html#detailsNach denen hatte das alles gebaut gehabt.
-
Ein paar Sachen:
qDebug() versteht QStrings. Ein "toAscii()" auf err.text() ist nicht nötig.
Warum hier teporäre Variable anlegen?
bool b = db.open(); if(!b) { ...
Geht doch viel schneller so:
if( !db.open() ) { ...
Das kompiliert echt bei dir?!?
int port = selectQuery.boundValue(0).Int;
QVariant kennt bei mir kein "Int", nur ein "toInt()", was eine Methode ist!
Du machst nirgendwo ein addBindValue() oder bindValue(), darum muss ein boundValue() auch schief gehen. Das ist NICHT das was du willst.
Du suchstint port = selectQuery.value(0).toInt();
Da du nicht 100% sicher sein solltest, dass dein index auch wirklich an der Stelle auftaucht wo er im Query steht, solltest du dir den index geben lassen:
int portIndex = selectQuery.record().indexOf( "Port" ); int port = selectQuery.value( portIndex ).toInt();
Da der QSqlRecord über den ganzen Query gleich sein sollte, kannst du den am Anfang speichern und gleich alle Indices holen.
-
P.S.:
boundValues braucht man für Platzhalter in nem Query, um z.B. ein INSERT allgemein zu formulieren, und danach z.B. per addBindValue die aktuellen Werte zu binden. Siehe dazu die Doku zu QSqlQuery -> "Approaches to Binding Values".
Um aus einem SELECT-Result die Werte einer Spalte zu fischen, geht es definitiv nicht! Das hast du so sicher nicht aus der Doku.
-
das mit dem bindValue ist noch von meinem rumprobieren übergeblieben, früher stand da mal value, das mit dem toInt probiere ich gleich mal aus.
qDebug nimmt als Parameter bei mir keine QStrings, nur mit << macht er das.
-
super das toInt wars, jetzt läufts
Danke