9
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。请帮忙。谢谢。

4

3 回答 3

14

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

int numberOfRows = 0;
if(qry.last())
{
    numberOfRows =  qry.at() + 1;
    qry.first();
    qry.previous(); 
}
于 2014-10-22T05:26:15.653 回答
4

来自文档:

返回结果的大小(返回的行数),如果无法确定大小或数据库不支持报告有关查询大小的信息,则返回 -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

于 2014-10-21T19:49:49.213 回答
2

对于我自己,我使用此功能

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;
}
于 2016-09-13T11:38:59.823 回答