ETwas speichern mit SQL

Dein Thema passt einfach in kein Forum? Dann probiers mal hier.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Wenn du die Doku zum QSqlQuery gelesen hast, kommt dir sicher dieses allererste Beispiel bekannt vor:

Code: Alles auswählen

QSqlQuery query("SELECT country FROM artist");
while (query.next()) {
    QString country = query.value(0).toString();
    doSomething(country);
}
Du kannst jetzt selber schauen, was an dem Code anders ist wie an deinem. Und zu addDatabase steht in der Doku nicht, dass du ne neue Datenbank hinzufügst, sondern ne neue Verbindung.

Ich weiß leider auch nicht, was daran so schlimm ist. Und bitte wunder dich nicht, wenn du irgendwann keine Antworten mehr kriegst. Das Forum hier basiert auf freier Hilfsbereitschaft, nicht der SUpport-Verpflichtung. Du vergraulst dir mit dem Ton nur die Helfer. Wenn Antworten wie "schau in die Doku, steht doch genau drinnen" oder "frag Google" kriegst, solltest du nicht böse reagieren, sondern vllt. noch mal nen zweiten Blick riskieren. Wenn du nicht weißt, wonach du suchen sollst, versuch deinen "Wunsch" mit einigen englischen Begriffen zu umschreiben (Tip: dict.leo.org hilft beim Übersetzen), und dann danach in der Doku und Google suchen. Solltest du es DANN nicht selber hinkriegen, ist dir wahrscheinlich niemand böse, wenn du nochmal nachhakst - vorausgesetzt du zeigst den Willen, dein Problem selbst gelöst zu bekommen.
borbih
Beiträge: 9
Registriert: 3. März 2009 17:27

Beitrag von borbih »

schau doch mal nur seine Beiträge in diesem Thread an und schau die anderen Beiträge die haben alle geholfen außer die von ihm! Der will gar nicht helfen der kommt gleich mit SQL an obwohl das gar nicht mein Problem war.

Was für ein Ton !!! weil ich mich aufrege wenn ich nach Hilfe frage das ich solche antworten wie von ihm bekomme damit er sein posting erhöhen kann. Also bitte dann ändern doch das Forum in nur für professionelle Entwickler die schon mit der Dokumentation von 244 Seiten geboren sind können hier schreiben alle die eine Triviale frage haben sind hier falsch. Wenn das die Foren regeln sind dann bin ich hier falsch.

Und wenn ich nix gemacht hätte aus den ganzen Beiträgen hier dann hätte ich doch wohl keine Datenbank anlegen können. Ich habe ja das mal nicht gekonnt und habe mich durch die ganzen Antworten und links erst zurechtgefunden, weil die ja sehr hilfreich waren mein Problem ist es ja die Datenbank jetzt zu öffnen und ob da was falsch ist an meinem code. Könnten wir Bitte über dieses Problem sprechen und solche nutzlosen Beiträge lassen. Danke
borbih
Beiträge: 9
Registriert: 3. März 2009 17:27

Beitrag von borbih »

franzf hat geschrieben:Wenn du die Doku zum QSqlQuery gelesen hast, kommt dir sicher dieses allererste Beispiel bekannt vor:

Code: Alles auswählen

QSqlQuery query("SELECT country FROM artist");
while (query.next()) {
    QString country = query.value(0).toString();
    doSomething(country);
}
Du kannst jetzt selber schauen, was an dem Code anders ist wie an deinem. Und zu addDatabase steht in der Doku nicht, dass du ne neue Datenbank hinzufügst, sondern ne neue Verbindung.

Ich weiß leider auch nicht, was daran so schlimm ist. Und bitte wunder dich nicht, wenn du irgendwann keine Antworten mehr kriegst. Das Forum hier basiert auf freier Hilfsbereitschaft, nicht der SUpport-Verpflichtung. Du vergraulst dir mit dem Ton nur die Helfer. Wenn Antworten wie "schau in die Doku, steht doch genau drinnen" oder "frag Google" kriegst, solltest du nicht böse reagieren, sondern vllt. noch mal nen zweiten Blick riskieren. Wenn du nicht weißt, wonach du suchen sollst, versuch deinen "Wunsch" mit einigen englischen Begriffen zu umschreiben (Tip: dict.leo.org hilft beim Übersetzen), und dann danach in der Doku und Google suchen. Solltest du es DANN nicht selber hinkriegen, ist dir wahrscheinlich niemand böse, wenn du nochmal nachhakst - vorausgesetzt du zeigst den Willen, dein Problem selbst gelöst zu bekommen.

Danke aber das brauche ich nicht ich will nur eine Zeile auslesen um zu testen ob es geht. Mein code hört ja da nicht auf der geht noch weiter und da ist das mit der schleife drin und der abfrage und er geht gar nicht in die schleife rein while (query2next())) weil dort nix drin ist.

Code: Alles auswählen

QSqlQuery query2(
	 			"SELECT id,laengeinnen,laengeaussen,grad,start,end FROM segment;");
	 Segment *curSeg = firstSegment;
	 qcout << "hey22" << endl;
	 if (query2.isActive()) {
	 		while (query2.next()) {
	 			curSeg->setID(query2.value(0).toInt());
	 			curSeg->setLaengeInnen(query2.value(1).toDouble());
	 			curSeg->setLaengeAussen(query2.value(2).toDouble());
	 			curSeg->setGrad(query2.value(3).toInt());
	 			curSeg->setStart(query2.value(4).toBool());
	 			curSeg->setEnd(query2.value(5).toBool());
	 			curSeg = curSeg->getNext();
	 	
	 		}
	 	}
Hier geht er gar nicht rein weil in der query2 nix drinnen steht. Wenn addatabase richtig ist was ist dann mit db.setDatabaseName(nameStrecke); ?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Mit db.setDatabaseName() musst du die Datei angeben, in der die Datenbank steht. Machst du das auch?
Hast du DB denn schon korrekt mit Tabellen gefüttert? (->schema)
Kannst du bitte mal eine Konsole aufmachen und Folgendes versuchen:

Code: Alles auswählen

$ sqlite3 pfad/zu/meiner/datenbank.db
SQLite version 3.6.11
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .schema;
[Ausgabe, die uns hier interessiert]
So kannst du sehen, wie dein DB-schema ausschaut.

Ich nehme nämlich an, dass da noch gar nix drin steht, und du deshalb auch kein Ergebnis bekommst :/

Solltest du damit nicht zurecht kommen, kannst du auch zur Orientierung in deinem Programm nach dem Öffnen der Verbindung auch mittels db.tables() schauen, wie die Tabellen heißen. (->nutz mal qDebug() um die Tabellen auf der Konsole auszuspucken).
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Danke aber das brauche ich nicht ich will nur eine Zeile auslesen um zu testen ob es geht.
Schon lustig, dass die Fragenden immer wissen was sie _nicht_ brauchen, aber sich wundern, dass ihr Code nicht funktioniert...

zu "query":
Du bist dir aber schon bewusst, dass vor(!!) dem ersten Abfragen (query.value(0)) die Methode "next()" aufgerufen werden muss (genau das sehen wir in deinem Code nicht).

zu "query2":
Gegenfrage: warum sollte die Query nach dem exec() in deinem Fall noch aktiv (isActive()) sein.. respektive warum ist das überhaupt an dieser Stelle von Interesse?
borbih
Beiträge: 9
Registriert: 3. März 2009 17:27

Beitrag von borbih »

sqlite> .schema
CREATE TABLE segment (id INTEGER, laengeinnen REAL, laengeaussen REAL,grad INTEG
ER, start BOOLEAN, end BOOLEAN,PRIMARY KEY(id));
CREATE TABLE track (name varchar(20), laengeinnen REAL, laengeaussen REAL,PRIMAR
Y KEY(name));

sqlite> select * from track;
monza|1835.0|2149.0

sqlite> select * from segment;
1|261.666666666667|366.333333333333|60|true|false
2|130.833333333333|183.166666666667|30|false|false
3|261.666666666667|366.333333333333|60|false|false
4|130.833333333333|183.166666666667|30|false|false
5|350.0|350.0|0|false|false
6|350.0|350.0|0|false|false
sqlite>



zu query

Code: Alles auswählen

QSqlQuery query("SELECT name,laengeinnen,laengeaussen FROM track");
		while (query.next()) {
			 setName(query.value(0).toString());
			 setLaengeInnen(query.value(1).toDouble());
			 setLaengeAussen(query.value(2).toDouble());
			 qcout << query.value(0).toString() << " : " << query.value(1).toDouble() << " : " << query.value(2).toDouble() << endl;
		}
habe ich geändert trotzdem kommt er nicht in die schleife rein
das gleiche bei query2

Code: Alles auswählen

QSqlQuery query2("SELECT id,laengeinnen,laengeaussen,grad,start,end FROM segment");
	 Segment *curSeg = firstSegment;
	 qcout << "hey22" << endl;
		while (query2.next()) {
			curSeg->setID(query2.value(0).toInt());
			curSeg->setLaengeInnen(query2.value(1).toDouble());
			curSeg->setLaengeAussen(query2.value(2).toDouble());
			curSeg->setGrad(query2.value(3).toInt());
			curSeg->setStart(query2.value(4).toBool());
			curSeg->setEnd(query2.value(5).toBool());
			curSeg = curSeg->getNext();
			qcout << "hey2" << endl;
			qcout << query2.value(0).toInt() << " : " << query2.value(1).toDouble() << " : " << query.value(2).toDouble() << endl;
		}

wie ich mich verbinde

Code: Alles auswählen

	QTextStream qcout(stdout);

	if (!correctDatabaseFileVersion(nameStrecke)) {
		QMessageBox::critical(0, qApp->tr(
						"Kann keine Verbindung zur SQL Datenbank aufbaun"), qApp->tr(
						"Kann keine verbindung aufbaun.\n"
							"Klicken sie auf Abbrechen um zu abbrechen."),
						QMessageBox::Cancel);

				return false;
	}

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

	db.setDatabaseName(nameStrecke);
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Wirklich einen Fehler kann ich da nicht erkennen. Dafür brauchts mehr zusammenhängenden Code. Kannst du bitte mal dein komplettes Projekt mit allen Dateien in ein zip packen ( z.B. http://www.7zip.org oder was du willst ), und hier anhängen?
Dann kommt man auch auf deinen Fehler.

Grüße
Franz
Antworten