C++ QSqlQuery:执行前获取准备好的语句字符串

C++ QSqlQuery:执行前获取准备好的语句字符串,c++,qt,qsqlquery,qtsql,C++,Qt,Qsqlquery,Qtsql,出于测试目的,我试图在实际运行QSqlQuery对象之前,从中取出准备好的语句字符串 我已经检查了lastQuery()和executeQuery()方法,但它们都不起作用 void foo(QSqlQuery& q) { QString statement = q.lastQuery(); // statement is empty unless exec() is called } QSqlQuery q(myDb); q.prepare("SELECT * FRO

出于测试目的,我试图在实际运行
QSqlQuery
对象之前,从中取出准备好的语句字符串

我已经检查了
lastQuery()
executeQuery()
方法,但它们都不起作用

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()
参数字符串的方法

q.executedQuery();

将返回准备好的查询。

查看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
方法,在任何给定时间检索该值


我不认为这是一个“干净”的解决方案,但它可能会对您有所帮助。

那么“boundValues()”呢?我想要完整的字符串
SELECT*FROM Foo不仅仅是绑定到占位符的值。我担心解决方案是获取绑定值并用绑定值替换问号。示例没有绑定值或问号,仍然返回空字符串。事实上,带问号的语句对于我当前的用例是有效的,但是在运行
exec()
之前,我没有找到返回字符串的方法,只要您将查询表示为自己的数据结构就可以了。在合成和验证完成之前,不应该使用
QSqlQuery
QSqlQuery
并不是设计得很好的高级查询操作工具。这是一种提交查询以供执行的方法,仅此而已。OP说,
executedQuery
在他的情况下不起作用,因为他在执行之前需要查询字符串。您不能在标题中将private更改为protected/public吗?