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