以下问题已被多次讨论。然而,从来没有解决这个问题本身。正如我发现的那样,向前迭代和向后迭代行是有区别的。使用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());
}
向后迭代可能非常慢,应该避免。有人知道为什么这在正向迭代中不起作用吗?
编辑:这种行为对我来说并不总是可复制的,有时会发生,有时不会。在这种情况下,数据库包含的多于一行。问题正好发生在这段代码中。有人有同样的问题吗?
Edit 2:看来这个bug已经在Qt 4.8.5中修复了。
我的当前环境:Windows 7 (SP1), Qt 4.8.5.
下面的问题已经在这里讨论过几次了,这是完全错误的。您提供的引用与您所看到的行为无关。
替换// Do something with row...
的代码中可能存在bug。您需要完整地显示该代码。您还可以简单地看到,当问题发生时,表中实际上只有一行。这可能是由于与修改数据库的其他代码的交互,但您从未共享该代码,因此我们如何知道?
如果你只是向前迭代,你应该调用q.setForwardOnly(true)
,因为这将使一些数据库后端更快。