【问题标题】:QSqlQuery: get prepared statement string before executionQSqlQuery:在执行前获取准备好的语句字符串
【发布时间】:2015-09-08 11:02:36
【问题描述】:

出于测试目的,我试图在实际运行之前从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() 参数字符串。

【问题讨论】:

  • 什么是“boundValues()”? doc.qt.io/qt-4.8/qsqlquery.html#boundValues
  • 我想要完整的字符串 SELECT * FROM Foo; 而不仅仅是绑定到占位符的值。
  • 恐怕解决方法是获取绑定值并将问号替换为绑定值。
  • 该示例没有绑定值或问号,仍然lastQuery 返回一个空字符串。实际上,带有问号的语句对于我当前的用例是有效的,但是我发现没有返回字符串 before 运行 exec() 的方法
  • 只要您将查询表示为您自己的数据结构就可以。在您的合成和验证完成之前,您不应该使用QSqlQueryQSqlQuery 并没有真正设计成一个高级查询操作工具。这是一种提交查询以供执行的方式,仅此而已。

标签: c++ qt qsqlquery qtsql


【解决方案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 方法以在任何给定时间检索该值。

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

【讨论】:

  • 你不能在标题中将 private 更改为 protected/public 吗?
【解决方案2】:
q.executedQuery();

将返回准备好的查询。

【讨论】:

  • OP说executedQuery在他的情况下不起作用,因为他需要查询字符串before执行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
  • 2013-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多