2013-06-12 5 views
4

Время от времени обсуждалась следующая проблема. Однако никогда не было решения проблемы. Как я узнал, есть разница в повторении строк вперед и назад. Итерация вперед с QSqlQuery::next()может привести только к одной строке, однако обратная итерация с QSqlQuery::previous() будет всегда найти все строки. Является ли прямая итерация заданной явно или нет, не имеет никакого эффекта.QSqlQuery для SQLite в передовой итерации со следующей() найдет только одну строку

Edit:Ссылки удалены

Qt документации статьи применима правильный подход будет следующее:

QSqlQuery q = db.exec("SELECT * FROM Table"); 
while (q.next()) { 
    // Do something with row... 
} 

Однако это приведет только в одной строке. Итерация в обратном порядке найдет все строки.

QSqlQuery q = db.exec("SELECT * FROM Table"); 
if (q.last()) { 
    do { 
     // Do something with row... 
    } while (q.previous()); 
} 

Обратный ход может быть очень медленным и его следует избегать. У кого-нибудь есть идея, почему это не работает в передовой итерации?

Редактировать: Это поведение не всегда воспроизводимо для меня, а иногда это случается, иногда нет. База данных содержит больше, чем одна строка в этом случае. Проблема возникает именно в этом фрагменте кода. Есть ли кто-то с той же проблемой?

Редактировать 2: Похоже, что ошибка была исправлена ​​в Qt 4.8.5.

Моя текущая среда: Windows 7 (SP1), Qt 4.8.5.

ответ

-1

Это просто неверно, что здесь обсуждалась следующая проблема:. В приведенных вами ссылках ничего не делать с поведением, которое вы видите.

Вероятно, у вас есть ошибки в коде, который заменяет // Do something with row.... Вам нужно показать этот код целиком. Вы также можете просто увидеть факт, что на самом деле только одна строка в вашей таблице в момент возникновения проблемы. Это связано с взаимодействием с другим кодом, который изменяет базу данных, но вы никогда не делитесь этим кодом, так как мы можем знать?

Если вы только итерации вперед, вы должны позвонить q.setForwardOnly(true), так как это ускорит работу на некоторых базах данных базы данных.

+0

Как я уже сказал, итерация назад находит все строки, только вперед итерация (см. Мои фрагменты кода) только находят одну строку. '// Делаем что-то с строкой ...' просто читаем его значения с помощью 'q.value()', не более того. Также, если в этом разделе будет ошибка (это не так), почему это должно работать в обратной итерации в этом случае? – bkausbk

+0

Если вы нашли решение, вам следует отправить ответ. Ссылка на номер ошибки Qt была бы полезна. –