使用 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