Не работает 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 шт):

Автор решения: KoVadim

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();
→ Ссылка
Автор решения: Sergey Tatarincev

Правильное использование 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());
    // ....
}
→ Ссылка