Почему количество параметров не совпадает?

Из того, что я понял, это ошибка в вашей базе данных/запросе, и я пробовал следующее в браузере БД для Sqlite, и это работает:

    UPDATE odgovori SET odgovor="1131" WHERE korisnik_ID="2" AND pitanje_ID="1";
    INSERT INTO odgovori (korisnik_ID, pitanje_ID, odgovor) SELECT "2", "1", "1" WHERE (SELECT Changes()=0);

но когда я пытаюсь это сделать в QT:

    Q_ASSERT(qry.driver()->hasFeature(QSqlDriver::NamedPlaceholders));
    qry.prepare("UPDATE odgovori SET odgovor=:odgovor WHERE korisnik_ID=:korisnik_ID AND pitanje_ID=:pitanje_ID;"
    "INSERT INTO odgovori (korisnik_ID, pitanje_ID, odgovor) SELECT :korisnik_ID, :pitanje_ID, :odgovor WHERE (SELECT Changes()=0);");
    qry.bindValue(":odgovor", odgovor);
    qry.bindValue(":korisnik_ID", id);
    qry.bindValue(":pitanje_ID", QString::number(pitanjeid)); 
    qry.exec();
    qDebug()<<qry.lastError();

Я получаю QSqlError("", "Parameter count mismatch", ""). Я пробовал с ? и qry.addBindValue и получил тот же результат. Что мне не хватает?


person Ivan Pejić    schedule 01.09.2020    source источник
comment
Как создать экземпляр объекта qry?   -  person thibsc    schedule 02.09.2020
comment
@thibsc QSqlQuery qry;   -  person Ivan Pejić    schedule 02.09.2020
comment
Я действительно не вызываю две команды sql в одной подготовке, но я думаю, что вы должны вызывать bindValue шесть раз, а не три раза?   -  person wthung    schedule 02.09.2020
comment
@wthung, вызывающий bindValue шесть раз, тоже не сработал, но я объединил ваше решение со своим.   -  person Ivan Pejić    schedule 02.09.2020


Ответы (1)


Как указал @wthung в комментариях, я попытался вручную вставить фиксированные числа, и отладчик выдал QSqlError("21", "Unable to execute multiple statements at a time", "not an error")
Поэтому я разбил запрос на две части, и это сработало.

qry.prepare("UPDATE odgovori SET odgovor=:odgovor WHERE korisnik_ID=:korisnik_ID AND pitanje_ID=:pitanje_ID;");
qry.bindValue(":odgovor", odgovor);
qry.bindValue(":korisnik_ID", id);
qry.bindValue(":pitanje_ID", QString::number(pitanjeid));
qry.exec();
qry.prepare("INSERT INTO odgovori (korisnik_ID, pitanje_ID, odgovor) SELECT :korisnik_ID, :pitanje_ID, :odgovor WHERE (SELECT Changes()=0);");
qry.bindValue(":odgovor", odgovor);
qry.bindValue(":korisnik_ID", id);
qry.bindValue(":pitanje_ID", QString::number(pitanjeid));
qry.exec();
person Ivan Pejić    schedule 02.09.2020