Выберите из SQLite с помощью Qt

Я пытаюсь разобраться с базой данных SQLite на Qt 4.5.3 в Linux. Я уже создал базы данных.

Затем я пытаюсь выполнить select на Qt:

db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(filename); // Here is FULL path to the database. I've checked it twice :)
bool ok = db.open();
qDebug() << db.tables();

QSqlQuery query;
query.exec("select * from lessons");
qDebug() << query.size();
qDebug() << query.isSelect();
qDebug() << query.isValid();

Но консоль отладки говорит:

("lessons", "weeklessons", "weeks") 
-1 
true 
false 

Почему ничего не выбрать? Что я делаю не так?

5 ответов

Метод isValid() возвращает true, если запрос позиционирован на допустимую запись, но после вызова exec () это не так: сначала нужно перейти к допустимой записи, например, с помощью query.first () или query. следующий(). Смотрите документы Qt: http://doc.qt.io/archives/4.6/qsqlquery.html

Размер (), возвращающий -1, не означает, что результата нет: SQLite - это одна из баз данных, для которой размер запроса не доступен напрямую (смотрите документацию по QSqlDriver::hasFeature()). Вы можете проверить, что строки возвращены и найти размер с помощью цикла и query.next ().

В зависимости от того, что вы хотите сделать с результатом вашего выбора, вы также можете использовать QSqlQueryModel вместо QSqlQuery.

В вашем "QSqlQuery query;" Для объявления необходимо указать соединение с базой данных, например, "QSqlQuery query(db)"

Учитывая, что ваша программа сообщает, что запрос недействителен, посмотрите на сообщение об ошибке следующим образом:

QDebug() << query.lastError().text();

Это должно помочь вам в устранении проблемы.

Не зная много о Qt, я задавал себе один вопрос: как QSqlQuery знать, какое соединение использовать. Изучение этого руководства показало, что есть две возможности выполнить запрос:

  1. query = db.exec("select * from lessons");
    Использование соединения с базой данных и выполнение оттуда.
  2. QSqlQuery query( db );
    Построение запроса с использованием существующей базы данных, а затем выполнение запроса:
    query.exec("select * from lessons");

edit: после прочтения немного кажется, что соединения по умолчанию поддерживаются, поэтому ваш пример должен работать...

Не могли бы вы вместо этого передать запрос в качестве значения конструктора? Может быть, это работает тогда.

QSqlQuery query("select * from lessons");
Другие вопросы по тегам