从QSqlQuery中获取行数,但得到了-1

7
我正在尝试获取一个QSqlQuery的行数,数据库驱动程序是qsqlite。
bool Database::runSQL(QSqlQueryModel *model, const QString & q)
{
    Q_ASSERT (model);

    model->setQuery(QSqlQuery(q, my_db));
    rowCount = model->query().size();
    return my_db.lastError().isValid();
}

这里的查询是一个选择查询,但我仍然得到了-1;如果我使用model->rowCount(),我只会得到那些被显示的记录,例如256条,但是选择计数(select count(*))返回了120k个结果。有什么问题吗?
3个回答

9

这个行数计算代码片段适用于基于SQLite3的表格,并且处理了与某些SQLite版本相关的“fetchMore”问题。

QSqlQuery query( m_database );

query.prepare( QString( "SELECT * FROM MyDatabaseTable WHERE SampleNumber = ?;"));
query.addBindValue( _sample_number );

bool table_ok = query.exec();
if ( !table_ok )
{
    DATABASETHREAD_REPORT_ERROR( "Error from MyDataBaseTable", query.lastError() );
}
else
{
    //  only way to get a row count, size function does not work for SQLite3
    query.last();
    int row_count = query.at() + 1;
    qDebug() << "getNoteCounts = " << row_count;
}

我说这样做的正确性在于,当你想要迭代结果时,你需要回到第一个,因此你不能再使用setForwardOnly()了吗?我目前使用这种方法来获取行数,因为我需要提前计算进度条的最大步数;然而,即使只有几千个结果,迭代结果也非常慢。似乎只能向前移动可以帮助很多,但是我就不能检查行数了。重复查询但使用COUNT的方式会更快吗? - oblivioncth

6

文档中写道:

如果大小无法确定或数据库不支持报告有关查询大小的信息,则返回-1。

SQLite确实不支持此功能。

请注意,缓存120k条记录并不是非常高效的(没有人会查看所有记录);您应该通过某种方式过滤它们,以将结果减少到可管理的大小。


0
遇到了同样的问题, query.numRowsAffected() 对我有效。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接