PDA

View Full Version : sql query problem



unix7777
25th August 2012, 11:20
I want to update a record with this code.Unfortunately the record remains unchanged!

QString name=ui->lineEdit_name->text();
QString city=ui->lineEdit_city->text();

QSqlQuery query;
query.prepare("UPDATE clients ClientName="+name+", ClientCity="+city+"WHERE RAWID="+rowid);
query.exec();

What is the reason?Where i make mistake?

spirit
25th August 2012, 16:20
This is how "prepare" _shouldn't_ work.
This is how it _should_ work (http://qt-project.org/doc/qt-4.8/qsqlquery.html#approaches-to-binding-values).
PS. Where are you going to start reading docs carefully?

unix7777
25th August 2012, 19:01
Thanks.
I saw the documentation before some time because i use this in another part of my code where i use SELECT statement.
I changed the code to:


QSqlQuery query;
query.prepare("UPDATE clients (ClientName, ClientCity, ClientAddress, ClientTel, ClientMail, ClientMol, ClientEik, ClientVat) WHERE RAWID="+rowid+"VALUES (?, ?, ?, ?, ?, ?, ?, ?)");
query.addBindValue(ui->lineEdit_name->text());
query.addBindValue(ui->lineEdit_city->text());
query.addBindValue(ui->lineEdit_address->text());
query.addBindValue(ui->lineEdit_mol->text());
query.addBindValue(ui->lineEdit_eik->text());
query.addBindValue(ui->lineEdit_vat->text());
query.addBindValue(ui->lineEdit_tel->text());
query.addBindValue(ui->lineEdit_mail->text());
query.exec();
and i still got some error of conversation probably because of +rowid+ i don't know

i also changed it to:

QSqlQuery query;
query.prepare("UPDATE clients (ClientName=?, ClientCity=?, ClientAddress=?, ClientTel=?, ClientMail=?, ClientMol=?, ClientEik=?, ClientVat=?) WHERE RAWID="+rowid);
query.addBindValue(ui->lineEdit_name->text());
query.addBindValue(ui->lineEdit_city->text());
query.addBindValue(ui->lineEdit_address->text());
query.addBindValue(ui->lineEdit_tel->text());
query.addBindValue(ui->lineEdit_mail->text());
query.addBindValue(ui->lineEdit_mol->text());
query.addBindValue(ui->lineEdit_eik->text());
query.addBindValue(ui->lineEdit_vat->text());
query.exec();

I HAVE TRIED ALSO:

QSqlQuery query;
query.prepare("UPDATE clients ClientName=?, ClientCity=?, ClientAddress=?, ClientTel=?, ClientMail=?, ClientMol=?, ClientEik=?, ClientVat=? WHERE RAWID=?");
query.addBindValue(ui->lineEdit_name->text());
query.addBindValue(ui->lineEdit_city->text());
query.addBindValue(ui->lineEdit_address->text());
query.addBindValue(ui->lineEdit_tel->text());
query.addBindValue(ui->lineEdit_mail->text());
query.addBindValue(ui->lineEdit_mol->text());
query.addBindValue(ui->lineEdit_eik->text());
query.addBindValue(ui->lineEdit_vat->text());
query.addBindValue(QString::number(rowid));
query.exec();

emit updateTable();

this->close();

Doesn't work again!
P.S.I'm not lazy as you see.

ObiWanKenobe
25th August 2012, 20:18
Try this:


QSqlQuery query;
query.prepare("UPDATE clients ClientName=?, ClientCity=?, ClientAddress=?, ClientTel=?, ClientMail=?, ClientMol=?, ClientEik=?, ClientVat=? WHERE RAWID=?");
query.addBindValue(0, ui->lineEdit_name->text());
query.addBindValue(1, ui->lineEdit_city->text());
query.addBindValue(2. ui->lineEdit_address->text());
query.addBindValue(3, ui->lineEdit_tel->text());
query.addBindValue(4, ui->lineEdit_mail->text());
query.addBindValue(5, ui->lineEdit_mol->text());
query.addBindValue(6, ui->lineEdit_eik->text());
query.addBindValue(7, ui->lineEdit_vat->text());
query.addBindValue(8, rowid);
query.exec();

I assume that rowid is numeric.
I recommend to use oracle style named placeholders, eg. ":my_bind_value".
It makes the code more readable.
Ad one last thing: RTFM.;)

unix7777
25th August 2012, 21:11
Desktop_Qt_4_8_1_for_GCC__Qt_SDK__Debug/../../../QtSDK/Desktop/Qt/4.8.1/gcc/lib/QtSql.framework/Versions/4/Headers/qsqlquery.h:113: candidates are: void QSqlQuery::addBindValue(const QVariant&, QSql::ParamType)

spirit
25th August 2012, 21:27
bindValue, use QSqlQuery::bindValue

unix7777
25th August 2012, 21:28
Thanks, what i miss is what to do with WHERE statement, because there is no example with this?

ChrisW67
26th August 2012, 00:10
Search this site (https://www.google.com/search?q=bindvalue+where+site%3Aqtcentre.org) because there are plenty of examples littered throughout the forum. Or even do the experiment: try putting placeholders in the WHERE clause and find out... cannot take more than a few minutes to try.

unix7777
26th August 2012, 10:25
I have tried this even before you write me:

QSqlQuery query;
query.prepare("UPDATE clients ( ClientName, ClientCity, ClientAddress, ClientMol, ClientEik, ClientVat, ClientTel, ClientMail) WHERE (ROWID)"
"VALUES (:name, :address, :mol, :eik, :vat, :tel, :mail, :rowid)");
query.bindValue(":name", ui->lineEdit_name->text());
query.bindValue(":address", ui->lineEdit_city->text());
query.bindValue(":mol", ui->lineEdit_address->text());
query.bindValue(":eik", ui->lineEdit_mol->text());
query.bindValue(":vat", ui->lineEdit_eik->text());
query.bindValue(":tel", ui->lineEdit_vat->text());
query.bindValue(":mail", ui->lineEdit_tel->text());
query.bindValue(":rowid", QString::number(rowid));
query.exec()

AND ALSO THIS:

QSqlQuery query;
query.prepare("UPDATE clients ClientName=:name, ClientCity=:city, ClientAddress=:address, ClientMol=:mol, ClientEik=:eik, ClientVat=:vat, ClientTel=:tel, ClientMail=:mail WHERE ROWID=:rowid");
query.bindValue(":name", ui->lineEdit_name->text());
query.bindValue(":address", ui->lineEdit_city->text());
query.bindValue(":mol", ui->lineEdit_address->text());
query.bindValue(":eik", ui->lineEdit_mol->text());
query.bindValue(":vat", ui->lineEdit_eik->text());
query.bindValue(":tel", ui->lineEdit_vat->text());
query.bindValue(":mail", ui->lineEdit_tel->text());
query.bindValue(":rowid", QString::number(rowid));
query.exec();

It's all about this WHERE statement.How to handle it?To put it in parenthesis or not?To stay after VALUES or not?

Added after 12 minutes:

Problem SOLVED!!!
There should be a SET after UPDATE in the query!

spirit
26th August 2012, 10:27
We are all glad for you! ;)

unix7777
29th August 2012, 21:04
Unfortunately i didn't see right: still doesn't work!