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

Nie działa. W międzyczasie, jeśli przepisuję zapytanie naQSqlQuery z przygotowaniem i bindValue dla nazwy kolumny Sqlite

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

to działa. Działa również, gdy usunę: symbol zastępczy kolumny i zapisz w kolumnie kolumny zapytania, na której testuję to. Tak więc wydaje się, że nie mogę używać bindValue i placeholder do nazw kolumn, przynajmniej z Sqlite. Ale nie znalazłem w żadnej dokumentacji o tym.

Więc nie ma sposobu, aby użyć bindValue i placeholder do nazw kolumn, lub czegoś brakuje?

Odpowiedz

11

Prawidłowy kod tutaj byłoby:

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

powiązać wartości, a nie nazwy pól.

P.S .: odpowiedział przed przeczytaniem całego pytania. Tak, masz rację - nie ma sposobu, aby użyć bindValues ​​do wiązania kolumn, nie tylko dla sqlite, ale dla każdego db.

+0

Czy dokumentacja Qt lub inne dokumenty mówią o tym gdzieś? "Szukałem, ale nie znalazłem. – Littlebitter

+2

Wartości wiążące nie są rzeczami Qt - to jest SQL. Możesz przeczytać o tym tutaj, na przykład: http://use-the-index-luke.com/sql/where-clause/bind-parameters. Cytat: "Parametry wiązania nie mogą zmienić struktury instrukcji SQL: Oznacza to, że nie można używać parametrów wiązania dla nazw tabel lub kolumn." – Amartel

Powiązane problemy