QtSql: привязка не меняет запрос с SQLite - PullRequest
0 голосов
/ 01 июня 2018

У меня есть следующий код, который должен связать значение с оператором prepare:

QSqlQuery query(db);
query.setForwardOnly(true);
query.prepare("SELECT Entry.* FROM Entry WHERE body LIKE ?;");
query.addBindValue(QVariant("%" + name + "%"));
query.exec();
tDebug("%s", query.executedQuery().toUtf8().data());

Например, если name было "thing", то запрос должен выполнить инструкцию SELECT Entry.* FROM Entry WHERE body LIKE "%thing%", но он выполняет SELECT Entry.* FROM Entry WHERE body LIKE ?, почти как если бы привязанное значение было проигнорировано.Именованные заполнители имеют ту же проблему.

1 Ответ

0 голосов
/ 01 июня 2018

Я попробовал это на эквивалентном примере и надлежащим образом протестировал результат «prepare» и «exec», которые оба возвращают логическое значение.Я проверил, что значения ограничены нормально после exec с:

  QList<QVariant> list = query.boundValues().values();
  for (int i = 0; i < list.size(); ++i)
    qDebug() << i << ": " << list.at(i).toString();

Я проверил, что получил ожидаемый результат с

  while (query.next())
    qDebug()<<"result = "<<query.value(0);

Действительно, executedQuery не содержал ограниченныйзначений, но комментарий в Qt несколько расплывчат на этом:

"Если подготовленный запрос с заполнителями выполняется в СУБД, которая его не поддерживает, подготовка этого запроса эмулируется. Заполнители в оригиналезапрос заменяется связанными значениями для формирования нового запроса. Эта функция возвращает измененный запрос. Это в основном полезно для целей отладки. "

Поэтому я предполагаю, что для postgresql (что у меня есть) и SQLite,executedQuery возвращает оригинал с заполнителями, а не с ограниченными значениями.

...