2013-06-12 78 views
4

以下问题已经不时讨论。然而,它从来没有解决自己的问题。正如我发现,在向前和向后迭代行中存在差异。向前迭代QSqlQuery::next()可能导致只有一行,但向后迭代QSqlQuery::previous()总是查找所有行。前向迭代是否被明确设定,没有效果。QSqlQuery for SQLite在forward迭代中使用next()将只发现一行

编辑:引用删除

关于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()); 
} 

反向迭代可能非常缓慢,应该避免。有没有人有一个想法,为什么这不适用于前向迭代?

编辑:这种行为并不总是可以重现给我,有时会发生,有时不会。在这种情况下,该数据库包含以上的更多。这个问题恰好出现在这段代码片段中。有没有同样的问题?

编辑2:看来这个bug已经在Qt 4.8.5中修复了。

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

回答

-1

这简直是错误的,以下问题已经在这里讨论了几次。您提供的参考文献有与您所看到的行为无关

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

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

+0

正如我所说的,向后迭代查找所有行,只有前向迭代(请参阅我的代码片段)只能激发一行。 '//对行做些什么......'只是用'q.value()'来读取它的值,仅此而已。此外,如果这部分内部有bug(不是这种情况),为什么它在这种情况下在向后迭代中工作? – bkausbk

+0

如果你找到了解决方案,你应该发布一个答案。参考Qt错误号会有帮助。 –