Seite 1 von 1

[gelöst] Datenbank öffnen -> lesen und schreiben

Verfasst: 28. März 2010 12:47
von keo
Hallo,

ich bekomme es nicht hin Datenbanken auszulesen und etwas in die Datenbank zu schreiben.

Hier mal ein Beispiel:

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");

db.setDatabaseName("test.db");
db.open();

QSqlQuery query(db);

--> Ich hatte vorher das gemacht:
query.exec("create table Notizen(ID int primary key,Text varchar(80))");
query.exec("insert into Notizen values(1,'Einkaufen gehen!')");

Damit habe ich die Datenbank erstellt?! Jedenfalls erscheint bei mir eine .db im Verzeichnis. So mit müsste ja auch der Eintrag mit Einkaufen gehen schon vorhanden sein.

Wenn ich jetzt aber das mache:

query.exec("select * from Notizen");
QString Ausgabe(query.value(0).toString());

passiert gar nichts, der String ist leer. Wo ist mein Fehler? Beim Eintragen in die Datenbak oder beim Auslesen?

Wäre für jeden Tipp dankbar!

Verfasst: 28. März 2010 12:51
von Christian81
Woher weisst du das der String leer ist und was sagt QSqlQuery::lastError() dazu?
Funktioniert überhaupt das einfügen? exec() gibt einen Status zurück den man auswerten sollte.

Verfasst: 28. März 2010 14:04
von keo
Hallo erst einmal, danke für die schnelle Antwort!
keo hat geschrieben: query.exec("create table Notizen(ID int primary key,Text varchar(80))");
lastError gibt hier 1 zurück
table Notizen already exists Unable to execute statement
keo hat geschrieben: query.exec("insert into Notizen values(1,'Einkaufen gehen!')");
lastError gibt hier 19 zurück
constraint failed Unable to fetch row

Aber was ist hier dran falsch?

keo hat geschrieben: query.exec("select * from Notizen");
lastError gibt hier -1 zurück
Textform-> Nichts


PS: Ich sehe im Debugger das der String leer ist.

Verfasst: 28. März 2010 14:09
von upsala
LastError hat bestimmt auch eine Textausgabe...

Verfasst: 28. März 2010 20:14
von Troll.Soft
upsala hat geschrieben:LastError hat bestimmt auch eine Textausgabe...
die man auch unbedingt beachten sollte.

Eine Sache scheint im Program noch zu fehlen.
Query.first() wurde nicht aufgerufen. Ist aber zwingend notwendig.
Query.next() geht weiter zum nächsten Datensatz.
exec, first, next geben jeweils true or false zurück

tschüß
Troll.Soft

Verfasst: 29. März 2010 08:40
von jerry42
zur Kontrolle kannst Du dich auch direkt (ohne Qt) mal mit der Datenbank verbinden und schauen, was da möglicherweise drinsteht oder auch nicht.

Aus der Konsole kannst Du tippen:
sqlite3 test.db

Verfasst: 29. März 2010 20:48
von keo
Ah jetzt hab ich das hin bekommen! bzw. verstehe es jetzt.

Die Fehlermeldungen kommen natürlich, weil der Eintrag schon besteht!

Und ja, das first fehlt ;)

Danke euch!

Re:

Verfasst: 7. August 2012 13:01
von ceumern
Troll.Soft hat geschrieben:Query.first() wurde nicht aufgerufen. Ist aber zwingend notwendig.
Kurze Anmerkung dazu, weil ich durch google gerade auf diesen Thread gestossen bin:

Wenn man query.next() verwendet ist Query.first() NICHT zwingend notwendig, wie aus der Dokumentation hervorgeht:

http://doc.trolltech.com/4.7/qsqlquery.html#next