7
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 和占位符,或者我错过了什么?

4

1 回答 1

17

这里正确的代码是:

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

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

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

于 2013-04-09T13:14:56.287 回答