QSqlQuery 与列名 Sqlite 的 prepare 和 bindValue

Posted

技术标签:

【中文标题】QSqlQuery 与列名 Sqlite 的 prepare 和 bindValue【英文标题】:QSqlQuery with prepare and bindValue for column name Sqlite 【发布时间】: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 和占位符,或者我遗漏了什么?

【问题讨论】:

【参考方案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 语句的结构。这意味着您不能将绑定参数用于表名或列名。”

以上是关于QSqlQuery 与列名 Sqlite 的 prepare 和 bindValue的主要内容,如果未能解决你的问题,请参考以下文章

QSqlQuery 忽略 SQLite DB 的排序顺序

使用 next() 进行前向迭代的 SQLite 的 QSqlQuery 只会找到一行

加快sqlite的读写

42.QT-QSqlQuery类操作SQLite数据库(创建查询删除修改)详解

sqlite中以GBK存的中文,在Linux环境的QT开发中QSqlQuery查询出来是乱码,需要如何转换,具体如何操作,谢

qt : QSqlQuery 返回 QVariant 的向量