Russian Qt Forum

Qt => Базы данных => Тема начата: Keeper_B от Март 27, 2010, 01:17



Название: Работа с QSqlQueryModel при множестве соединений к БД
Отправлено: Keeper_B от Март 27, 2010, 01:17
Привет всем.
Обнаружил странную вещь.
При использовании
Код
C++ (Qt)
QSqlQueryModel queryModel(this);
ui->tableView->setModel(&queryModel);
queryModel.setQuery("select * from mytable", QSqlDatabase::database("MyConnect"));
 
почему то таблица tableView моргает и остаётся пустой.

Если исправить на
Код
C++ (Qt)
QSqlQueryModel *queryModel = new QSqlQueryModel(this);
ui->tableView->setModel(queryModel);
queryModel->setQuery("select * from mytable", QSqlDatabase::database("MyConnect"));
 
то всё работает нормально.
Кто может объяснить почему так?


Название: Re: Работа с QSqlQueryModel при множестве соединений к БД
Отправлено: BRE от Март 27, 2010, 07:28
Потому, что в первом случае объект модели создается на стеке и соответственно при выходе из зоны видимости/функции он разрушается, во втором случае этот объект создается в куче и продолжает жить после выхода из зоны видимости.


Название: Re: Работа с QSqlQueryModel при множестве соединений к БД
Отправлено: Keeper_B от Март 27, 2010, 11:30
Спасибо.

Блин а я ведь это знал.  ;)

Возможно меня сбило с толку вот что, у меня работало соединение пока была база по умолчанию,
то есть так:
Код
C++ (Qt)
QSqlQueryModel queryModel(this);
ui->tableView->setModel(&queryModel);
queryModel.setQuery("select * from mytable");
 
и всё работало.

Когда я исправил на множество соединений, оно стало вести себя так.
То есть, почему раньше когда соединение было по умолчанию всё работало?


Название: Re: Работа с QSqlQueryModel при множестве соединений к БД
Отправлено: Пантер от Март 27, 2010, 11:58
QSqlQueryModel queryModel(QSqlDatabase::database("NAME_CONNECTION"))


Название: Re: Работа с QSqlQueryModel при множестве соединений к БД
Отправлено: Keeper_B от Март 27, 2010, 12:32
мммм
Вроде по документации работать не должно.
Там вроде один не перегруженный конструктор QSqlQueryModel ( QObject * parent = 0 ).

А подключение к базе ассоциируется именно в запросе так: void QSqlQueryModel::setQuery ( const QString & query, const QSqlDatabase & db = QSqlDatabase() ).


Название: Re: Работа с QSqlQueryModel при множестве соединений к БД
Отправлено: Пантер от Март 27, 2010, 12:49
Точно, писал по памяти и подзабыл. Конечно
queryModel.setQuery("select * from mytable", QSqlDatabase::database("NAME_CONNECTION"));


Название: Re: Работа с QSqlQueryModel при множестве соединений к БД
Отправлено: Keeper_B от Март 27, 2010, 14:29
А как решить проблему с периодическим пропаданием БД?
На пример требуется удалить строку пишу такой код:
Код
C++ (Qt)
int row = model->rowCount();
model->insertRow(row);
QModelIndex index = model->index(row, 2);
ui->tableView->setCurrentIndex(index);
ui->tableView->edit(index);
 
В ответ говорит что база не открыта.
Хотя саму таблицу грузит и отображает данные.
Даже удалять строки можно.
А вот добавить нет. :(


Название: Re: Работа с QSqlQueryModel при множестве соединений к БД
Отправлено: Пантер от Март 27, 2010, 14:41
А если попробовать int row = model->rowCount() - 1?
Сделай небольшой тестовый пример с SQLite и сюда скинь.


Название: Re: Работа с QSqlQueryModel при множестве соединений к БД
Отправлено: Keeper_B от Март 29, 2010, 12:51
Всё нашёл причину. :) Можно ставить решено.

Я там для генерации нового id использовал QSqlQuery в inline функции и не передавал ей указатель на БД.
То есть забыл QSqlQuery query(QSqlDatabase::database("MyConnect")); сказать.