首页 文章

QSqlQuery size()始终返回-1

提问于
浏览
6
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 . 请帮忙 . 谢谢 .

3 回答

  • 2

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

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

    来自doc:

    返回结果的大小(返回的行数),如果无法确定大小,或者数据库不支持报告有关查询大小的信息,则返回-1 . 请注意,对于非SELECT语句(isSelect()返回false),size()将返回-1 . 如果查询未激活(isActive()返回false),则返回-1 . 要确定受非SELECT语句影响的行数,请使用numRowsAffected() .

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

    您的查询 isSelect 并且处于活动状态,但SQLite是查询大小无法直接使用的数据库之一 .

    为了证明这称为例如:

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

    它返回 false

  • 3

    对我自己,我使用这个功能

    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;
    }
    

相关问题