Товарищи, прошу помощи:
Что не делаю, все без толку, даже с отладчиком себе не помог. Подскажите.
Есть довольно простая функция:
QVector<QMap<QString, QString>> MainWindow::_getRowsBySearch(const QString& searchData) {
QVector<QMap<QString, QString>> result;
/* Не Сработало
QString queryLine = "SELECT * FROM People WHERE surname LIKE ':searchData%'";
QString queryLine = QString("SELECT * FROM People WHERE surname LIKE ':%1%'").arg(searchData);
const QString sqlTemplate = "'" + searchData + "%'"; - обертка
*/
// Работает только явная подстановка в коде
QString queryLine = "SELECT * FROM People WHERE surname LIKE 'S%'";
_query.prepare(queryLine);
_query.bindValue(":searchData", searchData);
if (!(_query.exec(queryLine))) {
qDebug() << "SELECT ERROR" << _query.lastError().text();
result.reserve(0);
return result;
}
QSqlRecord rec = _query.record();
if (_query.size() == -1) {
result.reserve(0);
// return result;
} else {
result.reserve(_query.size());
}
while(_query.next()) {
QMap<QString, QString> row;
row["name"] = _query.value(rec.indexOf("name")).toString();
row["surname"] = _query.value(rec.indexOf("surname")).toString();
row["email"] = _query.value(rec.indexOf("email")).toString();
result.push_back(row);
}
return result;
}
Суть ее в поиске данных в базе с помощью LIKE,и возврат в виде вектора.
Проблема в том, что я никак не могу подставить свое значение с помощью bindValue или банального шаблона в QString (arg). Так же не помог вариант с "оберткой" данных во все нужные кавычки и %.
Возможно проблема в неправильным использованием подстановки.
P.S: Я только недавно сел за Qt. Да с нормальным С++ общался не так долго. Первый серьезный камень преткновения, а так изучаю ударными темпами :)
QString::arg
выполняет буквальную подстановку, поэтому выглядеть Ваш код должен так:
QString queryLine = QString("SELECT * FROM People WHERE surname LIKE '%1%'").arg(searchData);
Т.е. в отличии от Вашей строки, в моей нет двоеточия. Двоеточие нужно для заполнителей (placeholder), которые как раз используются для привязок. Буквальную подстановку запрещено использовать при работе с SQL. Нарушение карается остракизмом и увольнением с занесением в личное дело, поэтому никогда так не делайте. Используйте исключительно привязки.
QString queryLine = "SELECT * FROM People WHERE surname LIKE :searchData";
_query.prepare(queryLine);
_query.bindValue(":searchData", searchData + "%");
Такой код должен работать для привязок.
Использование bindValue не совсем понятно, в examples нет примеров, сделайте лучше так:
QString queryLine = "SELECT * FROM People WHERE surname LIKE ?";
_query.prepare(queryLine);
_query.addBindValue(searchData);
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
При клике на другую запись в гриде и имеющихся не сохраненных данных в предыдущей строке бросается предупреждение: перейти без сохранения...
Какой паттерн распарсит дату в таком формате Fri Oct 05 23:57:19 GMT+00:00 2018?
Меня интересует как можно проверить ввод данныхМне нужно вводить слова но не более 5 символов все с маленькой буквы и английскими буквами
Пока делал приложение узнал и проверил на практике утверждение что нужно скачивать фото уже нужного размера для экрана, а не в том размере...