Russian Qt Forum

Qt => Базы данных => Тема начата: Admin от Май 03, 2009, 10:26



Название: QSqlQuery - нужно вывести полный запрос в случае с bind
Отправлено: Admin от Май 03, 2009, 10:26
Как мне вывести реальный исполняемый запрос?

Код
C++ (Qt)
   QSqlQuery q;
   q.prepare("SELECT DISTINCT id FROM features WHERE ftype=? AND dcheck>? GROUP BY domain ORDER BY dcheck DESC");
   q.addBindValue(feature);
   q.addBindValue(QDateTime::currentDateTime().addSecs(-second));
 

после выполняю

Код
C++ (Qt)
qDebug() << "getExpDomain SQL: " << q.lastQuery();
 

и получаю

Цитировать
getExpDomain SQL:  "SELECT DISTINCT id FROM features WHERE ftype=? AND dcheck>? GROUP BY domain ORDER BY dcheck DESC"

а хотелось бы реально выполненный запрос. База sqlite.


Название: Re: QSqlQuery - нужно вывести полный запрос в случае с bind
Отправлено: ритт от Май 03, 2009, 10:39
кажись, средствами кутэ никак )


Название: Re: QSqlQuery - нужно вывести полный запрос в случае с bind
Отправлено: Admin от Май 03, 2009, 10:41
Вот и я так думаю -  и логирование на базе sqlite тоже вроде не делается  :-\


Название: Re: QSqlQuery - нужно вывести полный запрос в случае с bind
Отправлено: Rcus от Май 03, 2009, 11:13
lastQuery всегда вернет установленный текст, executedQuery - настоящий текст запроса, но поскольку SQLite поддерживает PositionalPlaceholders Qt не будет заменять их на значения.


Название: Re: QSqlQuery - нужно вывести полный запрос в случае с bind
Отправлено: lit-uriy от Май 03, 2009, 12:32
2 Rcus, это похоже справедливо для всех БД поддерживаемых в Qt.


Название: Re: QSqlQuery - нужно вывести полный запрос в случае с bind
Отправлено: Tonal от Май 04, 2009, 12:12
Вообще-то запросы с параметрами - это стандартный апи самого движка базы.
При этом движку сначала передаётся запрос со специальными заменителями, а потом параметры к нему.
Это позволяет экономить время на разборе запроса движком и трафик, если предполагается выполнить несколько похожих запросов подряд.
Т.е. Qt при этом просто не знает "полного" текста запроса.


Название: Re: QSqlQuery - нужно вывести полный запрос в случае с bind
Отправлено: MoPDoBoPoT от Июнь 25, 2009, 21:11
Ответ, конечно, запоздалый :) но все же:
QVariant QSqlQuery::boundValue ( const QString & placeholder ) const
QVariant QSqlQuery::boundValue ( int pos ) const
QMap<QString, QVariant> QSqlQuery::boundValues () const

Используя одну из этих функций можно восстановить весь текст запроса. Метод boundValues() самый универсальный, с помощью него слегкостью можно восстановить текст запроса, незная даже вид оного.