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的主要内容,如果未能解决你的问题,请参考以下文章
使用 next() 进行前向迭代的 SQLite 的 QSqlQuery 只会找到一行
42.QT-QSqlQuery类操作SQLite数据库(创建查询删除修改)详解
sqlite中以GBK存的中文,在Linux环境的QT开发中QSqlQuery查询出来是乱码,需要如何转换,具体如何操作,谢