【问题标题】:How to write a prepared update query?如何编写准备好的更新查询?
【发布时间】:2020-11-08 20:07:09
【问题描述】:

我一直在尝试编写一个更新函数,该函数需要更新用户(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

如何解决这个问题?

【问题讨论】:

    标签: c++ windows sqlite qt


    【解决方案1】:

    原因

    第一个问题

    不难猜测,值绑定只对值有效,对字段名无效。

    更多信息,请阅读Inserting, Updating, and Deleting Records

    第二个问题

    由@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);
      

    【讨论】:

    • 哇,我对这个错字感到很傻。应用所有更正后,代码执行良好。谢谢
    • @Anon01011010,不客气!如果您将答案标记为已接受和/或考虑在您的声誉允许的情况下对其进行投票,那就太好了。
    猜你喜欢
    • 2011-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多