Выбрать из SQLite с помощью Qt - PullRequest
       44

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

6 голосов
/ 22 февраля 2010

Я пытаюсь разобраться с базой данных 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 ]

9 голосов
/ 16 апреля 2010

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

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

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

3 голосов
/ 23 февраля 2010

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

1 голос
/ 23 февраля 2010

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

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

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

0 голосов
/ 05 августа 2010
0 голосов
/ 22 февраля 2010

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

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

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

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

QSqlQuery query("select * from lessons");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...