我正在使用QT5.7和C++编写一个库应用程序,该应用程序由一个sqLite v3数据库支持。我想实现一个贷款/返回功能。我已经在我的数据库中启用了一个名为isLoaned的bool字段,每当用户单击loan按钮时,我希望将相应记录的值更改为true。我得到了与数据库的正确连接,没有错误,但是数据库没有更新,字段值保持不变。我按照Qt文档说明了这些类的使用情况,但我找不到解决方案。这是我的代码:
void loanBookDialog::on_loanBookBtn_clicked()
{
MainWindow mw;
mw.connOpen();
QString id, title;
id = ui->idLnEdit->text();
title = ui->titleLnEdit->text();
QSqlQuery qry(mw.myDb);
qry.prepare("select * from Books where (id='"+id+"' OR title='"+title+"') AND isLoaned=0");
if (qry.exec()) {
QSqlRecord loanRec(qry.record());
QSqlField loanField = loanRec.field(5);
loanField.setValue(true);
qDebug() << loanField.isNull();
qDebug() << loanField.isReadOnly();
qDebug() << loanField.isValid();
qDebug() << loanField.isGenerated();
ui->wrong5Lbl->setStyleSheet("QLabel {color: green}");
ui->wrong5Lbl->setText("Loaned succesfuly.");
mw.connClose();
}
else {
ui->wrong5Lbl->setStyleSheet("QLabel {color: red}");
ui->wrong5Lbl->setText("Oops! Something went wrong, try again.");
}
}
调试输出:
Field value: QVariant(bool, true)
isNull: false
isReadOnly: false
isValid: true
isGenerated: true
发布于 2016-08-31 11:03:35
在任何数据库中,SQL查询按值返回结果。QSqlRecord
是数据库的副本,而不是对它的引用。因此,loanField.setValue(true);
绝对一无所获。
要修改数据库的内容,需要执行数据修改语句,在本例中是更新。
此外,请记住,由于引用问题,使用字符串组合组合查询充满了危险,不应在参数可以使用的地方使用。
QSqlQuery loanQuery(mw.myDb);
loanQuery.prepare("update Books set isLoaned where id=:id");
// note: you can re-use the prepared query with different bindings to improve performance
loanQuery.bindValue(":id", id);
loanQuery.exec();
另外,不要忘记在事务中包装它。做:
mw.myDb.transation();
在此之前
mw.myDb.commit();
之后。检查错误!如果提交失败,则不会写入数据!
https://stackoverflow.com/questions/39247566
复制相似问题