QSqlQuery for SQLite在使用next()进行正向迭代时只会找到一行

QSqlQuery for SQLite in forward iteration with next() will only find one row

提问人:bkausbk 提问时间:6/12/2013 最后编辑:bkausbk 更新时间:10/26/2013 访问量:1165

问:

以下问题不时被讨论。然而,它本身的问题从来没有解决方案。正如我所发现的,向前和向后迭代行是有区别的。前向迭代 with 可能只生成一行,但后向迭代 with 将始终找到所有行。无论是否显式设置正向迭代,都不起作用。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());
}

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

编辑:这种行为对我来说并不总是可复制的,有时它会发生,有时不会。在本例中,数据库包含行。问题恰好出现在此代码片段中。有没有同样的问题?

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

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

数据库 sqlite qt select qsqlquery

评论


答:

0赞 Kuba hasn't forgotten Monica 9/10/2013 #1

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

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

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

评论

0赞 bkausbk 9/11/2013
正如我所说,向后迭代会找到所有行,只有向前迭代(参见我的代码片段)只能找到一行。 只是用 ,仅此而已。此外,如果本节中存在错误(不是这种情况),为什么在这种情况下它应该在向后迭代中工作?// Do something with row...q.value()
0赞 Kuba hasn't forgotten Monica 9/11/2013
如果你找到了解决方案,你应该发布一个答案。引用 Qt 错误编号会有所帮助。