Запрос Select не воспринимает переменную из кода

243
02 ноября 2018, 15:40

В интернете нашла кучу подсказок, как в запрос insert добавить определенные переменные из кода, но нашла лишь одно упоминание про вставку переменной, заданной ранее, в запрос select, который к тому же у меня не работает. Перепробовала уже миллион разных вариантов, только в цикле еще все ответы не перебирала (надеюсь, до этого не дойдет).

QSqlQuery qry1;
qry1.prepare("select max(Missiles_id) from Missiles");
qry1.exec();
qry1.next();
int missId=qry1.value(0).toInt();
qDebug()<<missId;
qry=new QSqlQuery;
qry->prepare("SELECT * FROM Missiles WHERE Missiles_id="+missId);
qry->exec();
model->setQuery(*qry);
ui->tableViewMissiles->setModel(model);
ui->tableViewMissiles->horizontalHeader()-> resizeSections(QHeaderView::ResizeToContents);`

Думаю, ошибка в самом запросе, так как первый запрос все ищет правильно, находит максимальный индекс в таблице, а вот как его дальше передать - не знаю.

Answer 1

Смысл QSqlQuery::prepare именно в том, чтобы подготовить строку-запрос с отсутствующими параметрами для последующей подстановки.

qry->prepare("SELECT * FROM Missiles WHERE Missiles_id = ?");
qry->addBindValue(missId);
qry->exec();

Или

qry->prepare("SELECT * FROM Missiles WHERE Missiles_id = :id");
qry->bindValue(":id", missId);
qry->exec();

P.S:

Если подстановка не нужна, то prepare не нужно использовать вообще. Таким образом, ваш код

QSqlQuery qry1;
qry1.prepare("select max(Missiles_id) from Missiles");
qry1.exec();

превращается в

QSqlQuery qry1("select max(Missiles_id) from Missiles");
// если передана непустая строка, exec вызывается автоматически

И еще, если вам надо передать результат одного запроса в следующий (не говоря уже о том, что все это можно превратить в один запрос средствами sql), делать приведение типа QVariant -> int не нужно. addBindValue и bindValue ожидают именно QVariant.

Answer 2

Что у вас тут?

"SELECT * FROM Missiles WHERE Missiles_id="+missId

Строка char* плюс целое число. Т.е. строка со сдвигом :) - например, если missId равно 5, то это получается указатель на строку

"T * FROM Missiles WHERE Missiles_id="

Если уж передаете строку - то сначала сделайте верную строку. Вариантов масса. Не скажу, что именно хорошего есть в Qt, не знаю...

Например, вариант с буфером:

char query[150];
sprintf(query,"SELECT * FROM Missiles WHERE Missiles_id=%d",missId);
qry->prepare(query);

Вариант со строкой С++:

qry->prepare((string("SELECT * FROM Missiles WHERE Missiles_id=")+to_string(missId)).c_str());

Вобщем, главное - правильно приготовьте строку запроса.

READ ALSO
Подсказка на css. Как треугольнику задать border?

Подсказка на css. Как треугольнику задать border?

Есть иконка (сделанная на html + css) и при наведении на неё курсора, выпадает подсказка

169
Не работает очень простой слайдер на js

Не работает очень простой слайдер на js

У меня есть слайдер на 4 картинкиКаждая занимает 100% блока

219
Смена div&#39;в при клике по ссылке

Смена div'в при клике по ссылке

Нужна помощь! Ситуация такая, что есть боковое меню, с 4 пунктами и для каждого из них свой блокКак мне реализовать, чтобы при клике из каких-нибудь...

222