Выберите из SQLite с QT

Я пытаюсь иметь дело с базой данных SQLite по QT 4.5.3 на Linux. Я уже создал databsae.

Затем я пытаюсь выполнить выбор на 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 

Почему это - выбор ничто? Что у меня есть выполнение неправильно?

6
задан Reinstate Monica 10 September 2013 в 13:28
поделиться

5 ответов

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

3
ответ дан 8 December 2019 в 18:35
поделиться

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

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

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

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

QSqlQuery query("select * from lessons");
0
ответ дан 8 December 2019 в 18:35
поделиться

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

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

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

1
ответ дан 8 December 2019 в 18:35
поделиться

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

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

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

9
ответ дан 8 December 2019 в 18:35
поделиться
0
ответ дан 8 December 2019 в 18:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: