crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> SQLite, TableModel и QueryModel, TableModel работает, а QueryModel - нет.
Lassaaire
  опции профиля:
сообщение 23.10.2014, 13:20
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 6
Регистрация: 23.10.2014
Пользователь №: 4258

Спасибо сказали: 0 раз(а)




Репутация:   0  


Всем привет.

Недавно начал изучать Qt, в частности, взаимодействие с БД. Есть такой код:

#include "myclass.h"
#include <QtGui/QApplication>
#include <QtSql>
#include <QTableView>
MyClass::MyClass(QWidget *parent, Qt::WFlags flags): QMainWindow(parent, flags)
{
    ui.setupUi(this);
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("stf.db");

    QSqlQueryModel* qmodel = new QSqlQueryModel;
    QSqlQuery* query = new QSqlQuery;
    query->prepare("SELECT * FROM table_name");//Что-то не то. Я что, sql забыл?
    query->exec();
    qmodel->setQuery(*query);
    ui.tv1->setModel(qmodel);

    QSqlTableModel* tmodel = new QSqlTableModel;
    tmodel->setTable("table_name");
    tmodel->select();
    tmodel->setEditStrategy(QSqlTableModel::OnFieldChange);
    ui.tv2->setModel(tmodel);
}


Две таблички, база, выдёргиваем из базы данные и выводим в таблички. Казалось бы, примитив. Да и кода-то кот наплакал. Однако если табличка с TableModel работает отлично, то QueryModel выдаёт гнетущую пустоту. То ли селект пустой, то ли квери не срабатывает, не могу понять. Пробовал прямым запросом, без prepare. Пробовал даже без QSqlQuery-объекта, напрямую в exec() запрос класть. Хоть бы что.

Может, кто сталкивался? Нужна помощь.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Lassaaire
  опции профиля:
сообщение 23.10.2014, 15:27
Сообщение #2


Новичок


Группа: Новичок
Сообщений: 6
Регистрация: 23.10.2014
Пользователь №: 4258

Спасибо сказали: 0 раз(а)




Репутация:   0  


Виноват, поспешил с созданием темы.
помогла замена
QSqlQueryModel* qmodel = new QSqlQueryModel;

на
QSqlQueryModel* qmodel = dynamic_cast<QSqlQueryModel*>(tmodel);


Осталось понять, что это, почему и как работает.

Снова поспешил. Не помогла.
И почему нельзя редактировать сообщения?..
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Lassaaire
  опции профиля:
сообщение 23.10.2014, 16:24
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 6
Регистрация: 23.10.2014
Пользователь №: 4258

Спасибо сказали: 0 раз(а)




Репутация:   0  


exec() возвращает false.

Да тут ошибаться-то негде!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Lassaaire
  опции профиля:
сообщение 23.10.2014, 17:03
Сообщение #4


Новичок


Группа: Новичок
Сообщений: 6
Регистрация: 23.10.2014
Пользователь №: 4258

Спасибо сказали: 0 раз(а)




Репутация:   0  


exec() возвращает false ВООБЩЕ на любой запрос, даже представление не создать.
Значит, я не забыл SQL, а косяк где-то в коде.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ahalaj
  опции профиля:
сообщение 23.10.2014, 20:34
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 47
Регистрация: 14.6.2014
Пользователь №: 4166

Спасибо сказали: 13 раз(а)




Репутация:   1  


Цитата(Lassaaire @ 23.10.2014, 18:03) *
exec() возвращает false ВООБЩЕ на любой запрос, даже представление не создать.
Значит, я не забыл SQL, а косяк где-то в коде.

А вызвать в случае false lastError() и посмотреть что он покажет, какая конкретно ошибка?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Lassaaire
  опции профиля:
сообщение 27.10.2014, 9:37
Сообщение #6


Новичок


Группа: Новичок
Сообщений: 6
Регистрация: 23.10.2014
Пользователь №: 4258

Спасибо сказали: 0 раз(а)




Репутация:   0  


Я балбес. Забыл сделать db.open();

#include "myclass.h"
#include <QtGui/QApplication>
#include <QtSql>
#include <QTableView>
MyClass::MyClass(QWidget *parent, Qt::WFlags flags): QMainWindow(parent, flags)
{
    ui.setupUi(this);
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("stf.db");
    QSqlQuery* query = new QSqlQuery(db);
    QSqlQueryModel* qmodel = new QSqlQueryModel;

    db.open();

    *query = db.exec("SELECT id, id2, name, icon FROM table_name");



    qmodel->setQuery(*query);
    ui.tv1->setModel(qmodel);

    QSqlTableModel* tmodel = new QSqlTableModel;
    tmodel->setTable("table_name");
    tmodel->select();
    tmodel->setEditStrategy(QSqlTableModel::OnFieldChange);
    ui.tv2->setModel(tmodel);
}


Так - работает.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.3.2024, 1:02