Вопрос: QSqlQuery size () всегда возвращает -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. Помоги пожалуйста. Благодарю.


5


источник


Ответы:


query.size() не поддерживается SQLite. Но вы можете получить количество строк с обходным путем. QSqlQuery::last () извлекает последнюю запись в результате, если она доступна, и позиционирует запрос на извлеченную запись. После звонка last() вы можете получить индекс последней записи и поместить запрос до первой записи, используя first() а также previous() :

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

8



Из документа:

Возвращает размер результата (количество возвращенных строк) или -1, если   размер не может быть определен или если база данных не поддерживает   представление информации о размерах запросов. Обратите внимание, что для не-SELECT   statement (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;
}

2