繁体   English   中英

QSqlQuery size()始终返回-1

[英]QSqlQuery size() always returns -1

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

来自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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM