QSqlQuery с подготовкой и bindValue для имени столбца Sqlite

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 и заполнители для имен столбцов, или я что-то упускаю?


person Littlebitter    schedule 09.04.2013    source источник


Ответы (1)


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

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

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

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

person Amartel    schedule 09.04.2013
comment
Говорится ли где-нибудь об этом в документации Qt или в некоторых других документах? потому что я искал, но не нашел.. - person Littlebitter; 09.04.2013
comment
Связывание значений - это не вещь Qt - это вещь SQL. Вы можете прочитать об этом здесь, например: use-the- index-luke.com/sql/where-clause/bind-parameters . Цитата: параметры привязки не могут изменить структуру оператора SQL. Это означает, что вы не можете использовать параметры привязки для имен таблиц или столбцов. - person Amartel; 09.04.2013