2013-04-09 4 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(); 

Не работает. Между тем, если я переписал запрос наQSqlQuery with prepare and bindValue для имени столбца Sqlite

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

он работает. Он также работает, если я удаляю: column placeholder и записываю в имя столбца запроса, на котором я тестирую это. Похоже, что я не могу использовать bindValue и placeholders для имен столбцов, по крайней мере, с Sqlite. Но я не нашел ни одной документации об этом.

Так что нет возможности использовать bindValue и заполнители для имен столбцов, или я чего-то не хватает?

ответ

11

Правильный код здесь будет:

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

привязывается значения, а не поле имен.

P.S .: ответил перед тем, как читать весь вопрос. Да, вы правы - нет возможности использовать bindValues ​​для связывания столбцов не только для sqlite, но и для каждого db.

+0

Описывает ли Qt документация или некоторые другие документы об этом где-то? «Потому что я искал, но не нашел .. – Littlebitter

+2

Значения привязки - это не вещь Qt - это вещь SQL. Вы можете прочитать об этом здесь, например: http://use-the-index-luke.com/sql/where-clause/bind-parameters. Цитата: «Параметры привязки не могут изменить структуру оператора SQL. Это означает, что вы не можете использовать параметры привязки для имен таблиц или столбцов». – Amartel