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

+0

нет ошибок, IsActive() = = true, query.exec == true. – Efog

ответ

5

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

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

Я получаю этот результат для QODBC (MS SQL через источник данных), а также результаты – gollumullog

3

От док:

Возвращает размер результата (количество строк, возвращаемых), или -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

+0

Спасибо, но как я могу получить количество строк? – Efog

+0

@Efog Я не знаю конкретной задачи, но если вы хотите определить размер, тогда вы не сможете этого сделать, если вам нужно количество строк в будущем, вы можете использовать дополнительную переменную int в качестве счетчика и использовать ее, но sqlite может Я тебе помогу. – Chernobyl

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

 Смежные вопросы

  • Нет связанных вопросов^_^