2013-04-09 24 views
5
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(); 

は機能しません。一方、私が列名SqliteのprepareおよびbindValueを使用するQSqlQuery

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

にクエリを書き直すと、それは動作します。また、削除すると動作します:列のプレースホルダと、これをテストしているクエリの列名に書き込む。したがって、少なくともSqliteでは、bindValueとプレースホルダをカラム名に使用できないようです。しかし、私はどのドキュメンテーションでもこれについて言及していませんでした。

したがって、bindValueとプレースホルダを列名に使用する方法はありませんか、何か不足していますか?ここ

答えて

11

正しいコードは次のようになります。

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

あなたが値ではなく、フィールド名をバインドします。

P .:質問全体を読む前に回答してください。はい、あなたは正しいです - bindValuesを使用して列をバインドする方法はありません。sqliteだけでなく各dbもバインドします。

+0

Qtのドキュメントや他のドキュメントでは、これについてどこかに言いますか? '私は検索したが見つかりませんでした。 – Littlebitter

+2

バインド値はQtのものではなく、SQLのものです。ここでは、たとえばhttp://use-the-index-luke.com/sql/where-clause/bind-parametersなどの情報を読むことができます。引用:「バインド・パラメータはSQL文の構造を変更できません。つまり、表名または列名にバインド・パラメータを使用できません。 – Amartel

関連する問題