QSqlQuery mit SQL in Tabelle suchen bzw. Anzahl ausgeben

Alles rund um die Programmierung mit Qt
Antworten
binnio
Beiträge: 9
Registriert: 5. Juni 2010 13:08

QSqlQuery mit SQL in Tabelle suchen bzw. Anzahl ausgeben

Beitrag von binnio »

Hallo QT Freunde :)

also ich möchte ein User in meine Datenbank hinzufügen.
Vorher möchte ich natürlich überprüfen ob dieser Vor- und Nachname schon existiert. Dazu habe ich mir folgendes überlegt (erlesen):

Code: Alles auswählen

QString sql_bef = QString("SELECT vn, nn FROM person WHERE vn='%1' OR nn='%2'").arg(ui->lineEdit_vorname->text()).arg(ui->lineEdit_nachname->text());
    QSqlQuery query(sql_bef, mSQLManager->get_mDb());
    QSqlRecord record = query.record();
    qDebug() << "Number of columns: " << record.count();
    query.finish();
mein ergebnis ist immer die Zahl 2. Egal ob ich die Vor- und Nachnamen Felder leer lasse oder nicht. Mache ich einen riesen Denkfehler oder ist mein Befehl falsch ?
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

liefert dir record.count() ned die anzahl der Felder im Record ?
Und QSQLQuery hat sinnigerweisse kein count !

und prinzipiell ist "count" ne Aggregatsfunktion im SQL.

"SELECT COUNT FROM person WHERE vn='%1' OR nn='%2 "

sollte dir nen recordset mit genau einem eintrag und einem feld zurueckliefern. Der wert iss numerisch und iss die Anzahl deiner treffer.

Bei Oracle und Mfc wars zum beispiel auch so, dass du ueber das RecordSet erst den "richtigen" count bekommst, wenns ans ende movst.
Count ist die sicherere Variante, oder du cachst halt die komplette liste !

.
also ich möchte ein User in meine Datenbank hinzufügen.
Vorher möchte ich natürlich überprüfen ob dieser Vor- und Nachname schon existiert.
Prinzipiell iss das sehr naiv gedacht, zumindest auf multiuser sicht !
du muesstest um 100% nachvollziehbares Verhalten zu erreichen, die Tabelle Locken, fuer das zäheln und das einfuegen, bzw das in einer transaktion machen.

Besser: eindeutigen Index ueber Vorname + Nachname anlegen, und fehlercode beim einfuegen auswerten. Damit wird das ganze eine aktion .... und dein suchen ueber vorname/nachname wird indiziert und damit schneller, so als nebeneffekt.

Anmerkung: kann es nie vorkommen das Vorname+name gleich ist ?

weiss ned wie relevant das für Dich ist ....

Ciao ...
binnio
Beiträge: 9
Registriert: 5. Juni 2010 13:08

Beitrag von binnio »

Code: Alles auswählen

QString sql_bef = QString("SELECT COUNT FROM person WHERE vn='%1' OR nn='%2'").arg(ui->lineEdit_vorname->text()).arg(ui->lineEdit_nachname->text());
qDebug()<< selectQuery.record();
geht leider nicht(unknown Column "Count" in field list).

auch

Code: Alles auswählen

QString sql_bef = QString("SELECT COUNT(*) FROM person WHERE vn='%1' OR nn='%2'").arg(ui->lineEdit_vorname->text()).arg(ui->lineEdit_nachname->text());
qDebug()<< selectQuery.record();
gibt 0 zurück.

Code: Alles auswählen

QString sql_bef = QString("SELECT COUNT(*) FROM person WHERE vn='%1' OR nn='%2'").arg(ui->lineEdit_vorname->text()).arg(ui->lineEdit_nachname->text());
    
    QSqlQuery selectQuery(sql_bef, mSQLManager->get_mDb());
    selectQuery.exec();

    QSqlRecord record = selectQuery.record();
    qDebug() << "Number of columns: " << record.count();
gibt mir immer 1 zurück :(

frage ich die Zahl falsch ab ?

Im grunde hast Du recht mit dem Vor- bzw. Nachnamen. Michael Müller gibt es als Person sicherlich mehrmals. Daher werde ich das jetzt auch lassen mit der Abfrage. Interessieren tut mich aber trotzdem wie ich es machen müsste (da sowas oft vorkommt das man erstmal gucken muss ob es das nicht schon gibt).
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

gibt 0 zurück.
Da sehe ich auch nirgends ein "exec()"...
gibt mir immer 1 zurück
Das stimmt ja auch. "COUNT(*)" liefert dir eine Zeile und eine Spalte mit _einem_ Ergebnis (z.B. "0" oder "23").

Du fragst ja nicht nach Vornamen/Nachnamen, sondern nach der ANZAHL..

Wenn du im Umgang mit SQL noch etwas wackelig bist, empfehle ich, vor der Implementation in Qt die Query immer in einem SQL-CLient auszuprobieren (mysql-query-browser & CO oder gleich dem CLI "mysql").
Dann weisst du auch, was du als Ergebnis im Code zu erwarten hast..

hth!

[edit]
Die Antwort auf deine Ursprüngliche Frage lautet übrigens:
http://doc.trolltech.com/4.6/qsqlquery.html#size
(einfach falls du ein andermal die Anzahl Datensätze ermitteln möchtest)
Antworten