Выберите из 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();
Это должно помочь вам в устранении проблемы.
Это может дать вам ответ: http://www.qtcentre.org/threads/7904-Is-there-any-other-reason-why-QSqlQuery-size%28%29-returns-1
Не зная много о Qt, я задавал себе один вопрос: как QSqlQuery
знать, какое соединение использовать. Изучение этого руководства показало, что есть две возможности выполнить запрос:
query = db.exec("select * from lessons");
Использование соединения с базой данных и выполнение оттуда.QSqlQuery query( db );
Построение запроса с использованием существующей базы данных, а затем выполнение запроса:query.exec("select * from lessons");
edit: после прочтения немного кажется, что соединения по умолчанию поддерживаются, поэтому ваш пример должен работать...
Не могли бы вы вместо этого передать запрос в качестве значения конструктора? Может быть, это работает тогда.
QSqlQuery query("select * from lessons");