Russian Qt Forum
Сентябрь 30, 2024, 10:35 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Работа с QSqlQueryModel при множестве соединений к БД  (Прочитано 7100 раз)
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"));
 
то всё работает нормально.
Кто может объяснить почему так?
Записан
BRE
Гость
« Ответ #1 : Март 27, 2010, 07:28 »

Потому, что в первом случае объект модели создается на стеке и соответственно при выходе из зоны видимости/функции он разрушается, во втором случае этот объект создается в куче и продолжает жить после выхода из зоны видимости.
Записан
Keeper_B
Гость
« Ответ #2 : Март 27, 2010, 11:30 »

Спасибо.

Блин а я ведь это знал.  Подмигивающий

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

Когда я исправил на множество соединений, оно стало вести себя так.
То есть, почему раньше когда соединение было по умолчанию всё работало?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Март 27, 2010, 11:58 »

QSqlQueryModel queryModel(QSqlDatabase::database("NAME_CONNECTION"))
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Keeper_B
Гость
« Ответ #4 : Март 27, 2010, 12:32 »

мммм
Вроде по документации работать не должно.
Там вроде один не перегруженный конструктор QSqlQueryModel ( QObject * parent = 0 ).

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

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #5 : Март 27, 2010, 12:49 »

Точно, писал по памяти и подзабыл. Конечно
queryModel.setQuery("select * from mytable", QSqlDatabase::database("NAME_CONNECTION"));
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Keeper_B
Гость
« Ответ #6 : Март 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);
 
В ответ говорит что база не открыта.
Хотя саму таблицу грузит и отображает данные.
Даже удалять строки можно.
А вот добавить нет. Грустный
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #7 : Март 27, 2010, 14:41 »

А если попробовать int row = model->rowCount() - 1?
Сделай небольшой тестовый пример с SQLite и сюда скинь.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Keeper_B
Гость
« Ответ #8 : Март 29, 2010, 12:51 »

Всё нашёл причину. Улыбающийся Можно ставить решено.

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


Страница сгенерирована за 0.177 секунд. Запросов: 22.