使用 next() 进行前向迭代的 SQLite 的 QSqlQuery 只会找到一行

Posted

技术标签:

【中文标题】使用 next() 进行前向迭代的 SQLite 的 QSqlQuery 只会找到一行【英文标题】:QSqlQuery for SQLite in forward iteration with next() will only find one row 【发布时间】:2013-06-08 14:43:34 【问题描述】:

不时讨论以下问题。然而,它本身的问题从来没有解决方案。正如我发现的那样,向前和向后迭代行是有区别的。 QSqlQuery::next() 的前向迭代可能只产生一行,但 QSqlQuery::previous() 的后向迭代将总是找到所有行。前向迭代是否显式设置,没有任何影响。

编辑: 引用已删除

关于 Qt 文档,正确的方法如下:

QSqlQuery q = db.exec("SELECT * FROM Table");
while (q.next()) 
    // Do something with row...

但是,这只会导致一行。向后迭代将找到所有行。

QSqlQuery q = db.exec("SELECT * FROM Table");
if (q.last()) 
    do 
        // Do something with row...
     while (q.previous());

向后迭代可能非常慢,应该避免。有谁知道为什么这在前向迭代中不起作用?

编辑:这种行为对我来说并不总是可重现的,有时会发生,有时不会。在这种情况下,数据库包含 更多 行。问题恰好出现在这段代码 sn-ps 中。有没有遇到同样问题的人?

编辑 2: 似乎该错误已在 Qt 4.8.5 中修复。

我当前的环境:Windows 7 (SP1),Qt 4.8.5。

【问题讨论】:

【参考方案1】:

这里已经多次讨论过以下问题,这是完全错误的。您提供的参考与您看到的行为无关

替换// Do something with row... 的代码中可能存在错误。您需要完整地显示该代码。您还可以简单地看到这样一个事实:在问题发生时,您的表中实际上只有一行。这可能是由于与修改数据库的其他代码的交互,但您从不共享该代码,那么我们怎么知道?

如果您只是向前迭代,您应该调用q.setForwardOnly(true),因为这会使某些数据库后端的处理速度更快。

【讨论】:

正如我所说,向后迭代找到所有行,只有向前迭代(参见我的代码 sn-ps)只能找到一行。 // Do something with row... 只是用q.value() 读取它的值,仅此而已。另外,如果本节中存在错误(不是这种情况),为什么在这种情况下它应该在反向迭代中工作? 如果您找到了解决方案,您应该发布答案。对 Qt 错误编号的引用会很有帮助。

以上是关于使用 next() 进行前向迭代的 SQLite 的 QSqlQuery 只会找到一行的主要内容,如果未能解决你的问题,请参考以下文章

链式前向星

如何避免前向声明错误?

如何使用 next.jdbc 将 SQLite 中的 bool 列读入 bool Clojure 值? SQLite 将布尔值存储为 0/1

最短路 SPFA()链式前向星

POJ 1511 链式前向星+SPFA

迭代器