2015-09-08 3 views
1

Для целей тестирования я пытаюсь получить подготовленную строку инструкции из объекта QSqlQuery до ее фактического запуска.QSqlQuery: получить подготовленную строку оператора перед выполнением

Я проверил lastQuery() и executedQuery() методов, но ни один из них не работает.

void foo(QSqlQuery& q) 
{ 
    QString statement = q.lastQuery(); 
    // statement is empty unless exec() is called 
} 

QSqlQuery q(myDb); 
q.prepare("SELECT * FROM Foo;"); 
foo(q); 

Я хотел бы способ, чтобы получить обратно строку в prepare() параметра.

+0

Что означает «boundValues ​​()»? http://doc.qt.io/qt-4.8/qsqlquery.html#boundValues ​​ – Gombat

+0

Мне нужна полная строка 'SELECT * FROM Foo;' не только значения, привязанные к заполнителям. –

+0

Боюсь, решение состоит в том, чтобы получить связанные значения и заменить вопросительные знаки на связанные значения. – Gombat

ответ

1

Посмотрев на исходный код Qt, я обнаружил, где строка заканчивается в методе prepare:

... 
if (query.isEmpty()) { 
    qWarning("QSqlQuery::prepare: empty query"); 
    return false; 
} 
#ifdef QT_DEBUG_SQL 
    qDebug("\n QSqlQuery::prepare: %s",query.toLocal8Bit().constData()); 
#endif 
return d->sqlResult->savePrepare(query); 

В которой sqlResult частный QSqlQueryPrivate объект. Поэтому я бы сказал, что было бы сложно получить строку оттуда.

Однако решение приходит мне на ум. Подкласс QSqlQuery, устанавливающий атрибут QString, который будет содержать подготовленный оператор. Затем переопределить QSqlQuery::prepare() так он сохраняет значение атрибута, а затем выполняет оригинальную работу:

bool TestQSqlQuery::prepare(const QString& query){ 
    this->m_preparedQuery = query; 
    return QSqlQuery::prepare(query); 
} 

Затем создайте метод getPreparedQuery для получения значения в любой момент времени.

Я не думаю, что это «чистое» решение, но оно может помочь вам, тем не менее.

+0

Не можете ли вы просто изменить приватное на защищенное/публичное в заголовке? – fassl

-1
q.executedQuery(); 

Вернуть подготовленный запрос.

+0

OP сказал, что 'executeQuery' не работает в его случае, потому что ему нужна строка запроса ** перед выполнением **. – SirDarius