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

Non funziona. Nel frattempo se riscrivo la query aQSqlQuery con prepare e bindValue per il nome della colonna Sqlite

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

funziona. Funziona anche se cancello: segnaposto di colonna e scrivi nel nome della colonna della query, su cui sto testando questo. Quindi sembra che non possa usare bindValue e segnaposto per i nomi di colonne, almeno con Sqlite. Ma non ho trovato alcuna documentazione che menzionasse questo.

Quindi non c'è modo di usare bindValue e segnaposto per i nomi di colonne, o mi manca qualcosa?

risposta

11

codice corretto qui sarebbe:

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

Si associa valori, non campi nomi.

P.S .: risposto prima di leggere l'intera domanda. Sì, hai ragione - non c'è modo di usare bindValues ​​per associare le colonne, non solo per sqlite, ma per ogni db.

+0

La documentazione Qt o altri documenti dicono da qualche parte su questo? 'cos ho cercato ma non ho trovato .. – Littlebitter

+2

valori di binding non è una cosa di Qt - è cosa SQL. Puoi leggere qui, ad esempio: http://use-the-index-luke.com/sql/where-clause/bind-parameters. Citazione: "I parametri di bind non possono modificare la struttura di un'istruzione SQL Ciò significa che non è possibile utilizzare i parametri di bind per i nomi di tabella o colonna." – Amartel

Problemi correlati