Не работает SQL запрос UPDATE в QT на C++
мой пример
query.prepare("UPDATE TableExample SET Like = " + true + " WHERE id = "+id);
не компилируется и пишет invalid operands of types 'const char*' and 'const char [13]' to binary 'operator '
Советовали решать такую проблему путем =: или =@, но у меня это не работает (ничего не меняется в БД и пишет error update TableExample "No query Unable to fetch row" )
Ответы (3 шт):
C++ не умеет складывать две сишные строки.
Поэтому, сделайте где то так
QString q = "UPDATE TableExample SET Like = ";
q += true; // это странная конструкция, работать не будет
q += "true"; // может так? компилироваться будет, но смысла мало
q += " WHERE id = "+QString::number(id);
query.prepare(q);
или так
query.prepare(QString("UPDATE TableExample SET Like = %1 WHERE id = %2").arg(true).arg(id));
Но с true лучше разобраться.
А теперь самый правильный способ
QSqlQuery query;
query.prepare("UPDATE TableExample SET Like = :text WHERE id = :id");
query.bindValue(":id", id);
query.bindValue(":text", "true");
query.exec();
Правильное использование prepare. рекомендуется запросы подготавливать именно так, поскольку во-первых даст правильное преобразование типов на основе драйвера СУБД (тот же формат времени/даты) и защитит от sql инъекций (в отличие от простого конструирования QString)
query.prepare("UPDATE TableExample SET Like = :Like WHERE id = :id");
query.bindValue(":Like",true);
query.bindValue(":id",id);
query.exec();
Не надо так делать - сделайте так:
QString queryStr = " UPDATE TableExample SET Like =:Like WHERE id =:Id";
query.prepare(queryStr);
bool Like =true;
//Аналогиично с Id Id=...
query.bindValue(":Like ",Like );
query.bindValue(":Id",Id);
if( !query.exec() )
{
QSqlError err = query.lastError();
// ... mLogger.AddMessage(err.text());
// ....
}