【问题标题】:QSqlQuery with prepare and bindValue for column name SqliteQSqlQuery 与列名 Sqlite 的 prepare 和 bindValue
【发布时间】:2013-03-31 22:29:49
【问题描述】:
void updateDB(const int id, const QString& column, const QVariant& value) const 
 //*****
 //all stuff on open DB etc. 
QSqlQuery query;
query.prepare("UPDATE table SET  :column = :value WHERE id = :id ");
query.bindValue(":column", QVariant(column));   
query.bindValue(":value", value);
query.bindValue(":id", id);
query.exec();

不起作用。同时,如果我将查询重写为

query.exec("UPDATE table SET " + column + " = " + value.toString() + " WHERE id = " + QString::number(id));

它有效。如果我删除 :column 占位符并写入我正在测试的查询列名,它也可以工作。所以看来我不能对列名使用 bindValue 和占位符,至少在 Sqlite 中是这样。但是我在任何文档中都没有找到提到这一点。

所以没有办法对列名使用 bindValue 和占位符,或者我遗漏了什么?

【问题讨论】:

    标签: c++ sqlite qt qsqlquery


    【解决方案1】:

    这里的正确代码是:

    query.prepare(QString("UPDATE table SET %1 = :value WHERE id = :id ").arg(column));
    query.bindValue(":value", value);
    

    您绑定的是值,而不是字段名称。

    P.S.:在阅读整个问题之前回答。是的,你是对的 - 没有办法使用 bindValues 来绑定列,不仅适用于 sqlite,而且适用于每个 db。

    【讨论】:

    • Qt 文档或其他一些文档是否在某处提到了这一点? '因为我搜索但没有找到..
    • 绑定值不是 Qt 的事情——它是 SQL 的事情。你可以在这里阅读它,例如:use-the-index-luke.com/sql/where-clause/bind-parameters。引用:“绑定参数不能改变 SQL 语句的结构。这意味着您不能将绑定参数用于表名或列名。”
    猜你喜欢
    • 2019-04-09
    • 2015-01-22
    • 2011-01-06
    • 1970-01-01
    • 2014-01-14
    • 2013-04-01
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多