如何编写准备好的更新查询



我一直在尝试编写一个更新函数,它将用户(usr(、标志转换为要更新的字段和新值。这是的功能

bool DBManager::updateDB(User* usr, int flag, QVariant& value)
{
QSqlQuery query;
bool status = false;
QString temp_value = "";
QList<QString> fieldlist = {"First_Name", "Last_Name", "Email", "Username", "Password"};
QString field = fieldlist.at(flag);
if (field == "First_Name") {
usr->setFirstName(value.toString());
temp_value = usr->getFirstName();
} else if (field == "Last_Name") {
usr->setLastName(value.toString());
temp_value = usr->getLastName();
} else {
qDebug() << "invalid option";
}
query.prepare("UPADATE Users SET :field = :newValue WHERE Username = :Username");
query.bindValue(":field",field);
query.bindValue(":newValue",temp_value);
query.bindValue(":Username",usr->getUserName());
qDebug() << query.boundValues();
if (m_db.isOpen()){
if (query.exec()){
status = true;
qDebug() << "DATABASE:: Record update successful";
} else {
qDebug() << "DATABASE:: Record update unsuccessful - " << query.lastError();
}
} else {
qDebug() << "DATABASE:: not open ";
}
return status;
}

当我运行代码时,我会得到一个错误。这是输出:

QMap((":Username", QVariant(QString, "zielinkin1"))(":field", QVariant(QString, "Last_Name"))(":newValue", QVariant(QString, "Thibos")))
DATABASE:: Record update unsuccessful -  QSqlError("", "Parameter count mismatch", "") User not updated DATABASE:: database closed

如何解决此问题?

原因

第一个问题

不难猜测,值绑定只适用于值,而不适用于字段名。

有关更多信息,请阅读"插入、更新和删除记录"。

第二个问题

由@JimCastro发现:

您的查询中有一个拼写错误。UPADATE应该是UPDATE

解决方案

使用字符串串联来形成准备好的查询。

示例

  1. 代替

    query.prepare("UPDATE Users SET :field = :newValue WHERE Username = :Username");
    

    写入

    query.prepare("UPDATE Users SET " + field + " = :newValue WHERE Username = :Username");
    
  2. 删除或注释此行

    query.bindValue(":field",field);
    

最新更新