QSqlQuery size() 总是返回 -1

QSqlQuery size() always returns -1

本文关键字:返回 size QSqlQuery      更新时间:2023-10-16
QSqlQuery query;
QString queryText("SELECT * FROM section");
query.exec(queryText);
qDebug() << query.size(); //always -1
while (query.next()) qDebug() << query.value(0).toString(); //got 16 records

方法 size() 始终返回 -1。请帮忙。谢谢。

SQLite不支持query.size()。但是您可以通过解决方法获取行数。 QSqlQuery::last ()检索结果中的最后一条记录(如果可用(,并将查询定位在检索到的记录上。调用 last() 后,您可以使用 first()previous() 检索最后一条记录的索引并将查询定位在第一条记录之前:

int numberOfRows = 0;
if(qry.last())
{
    numberOfRows =  qry.at() + 1;
    qry.first();
    qry.previous(); 
}

来自文档:

返回

结果的大小(返回的行数(,如果 无法确定大小或数据库不支持 报告有关查询大小的信息。请注意,对于非选择。 语句 (isSelect(( 返回 false(,size(( 将返回 -1。如果 查询不活跃(isActive(( 返回 false(,返回 -1。

要确定受非 SELECT 语句影响的行数, 使用 numRowsImpact((。

http://qt-project.org/doc/qt-4.8/qsqlquery.html#size

您的查询isSelect且处于活动状态,但 SQLite 是查询大小不能直接可用的数据库之一。

为了证明,例如调用:

qDebug() <<db.driver()->hasFeature(QSqlDriver::QuerySize);

它返回false

对于我自己,我使用这个函数

int sqlSize(QSqlQuery query)
{
    int initialPos = query.at();
    // Very strange but for no records .at() returns -2
    int pos = 0;
    if (query.last())
        pos = query.at() + 1;
    else
        pos = 0;
    // Important to restore initial pos
    query.seek(initialPos);
    return pos;
}