Qt. Не работает bindValue для select SQL запроса с like

202
02 февраля 2019, 00:50

Товарищи, прошу помощи:

Что не делаю, все без толку, даже с отладчиком себе не помог. Подскажите.

Есть довольно простая функция:

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. Да с нормальным С++ общался не так долго. Первый серьезный камень преткновения, а так изучаю ударными темпами :)

Answer 1

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 + "%");

Такой код должен работать для привязок.

Answer 2

Использование bindValue не совсем понятно, в examples нет примеров, сделайте лучше так:

QString queryLine = "SELECT * FROM People WHERE surname LIKE ?";
_query.prepare(queryLine);
_query.addBindValue(searchData);
READ ALSO
GWT Как в ListGrid вернуть предыдущую выделенную строку после обработки события?

GWT Как в ListGrid вернуть предыдущую выделенную строку после обработки события?

При клике на другую запись в гриде и имеющихся не сохраненных данных в предыдущей строке бросается предупреждение: перейти без сохранения...

178
Как парсить дату?

Как парсить дату?

Какой паттерн распарсит дату в таком формате Fri Oct 05 23:57:19 GMT+00:00 2018?

199
Проверка введенного слова

Проверка введенного слова

Меня интересует как можно проверить ввод данныхМне нужно вводить слова но не более 5 символов все с маленькой буквы и английскими буквами

174
Android адаптивный размер для фото

Android адаптивный размер для фото

Пока делал приложение узнал и проверил на практике утверждение что нужно скачивать фото уже нужного размера для экрана, а не в том размере...

178