crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> QTableView мешает транзакциям?
Kagami
  опции профиля:
сообщение 18.12.2009, 17:34
Сообщение #1


Старейший участник
****

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

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




Репутация:   9  


Есть база данных. Она отображается в QTableView с помощью QSqlTableModel и иногда редактируется мной с помощью QSqlQuery. При этом я использую транзакции. И заметил что при вызове QSqlDatabase::commit(), ничего не происходит, база данных сообщает что есть активные запросы. Может ли это влиять модель, которая внутри тоже использует QSqlQuery? Тестовый пример попробую сделать чуть позже.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 18.12.2009, 18:52
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


попробуй существующий код, только для QSqlQuery использовать отдельное (самостоятельное) соединение (именованное, а не умалчиваемое).

Возможно, что в Qt одно соединение - одна транзакция
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
trdm
  опции профиля:
сообщение 18.12.2009, 19:53
Сообщение #3


Дмитрий Трошин
****

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

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




Репутация:   6  


Цитата(Kagami @ 18.12.2009, 17:34) *
QTableView мешает транзакциям?
Да, мешает. Где-то даже пост был, где чел анализировал взаимосвязь, не помню, хоть убейте :)
нашел в аське:
Цитата
trdm (09:33:26 15/04/2008)
а, понятно.
А сообщение по аське не были видны из-за пыли из под копыт.
Я тут тоже на QT подсел, щас с моделями разбираюсь.
Кстати, под какой лицензией система? На http://www.crossplatform.ru/ в разделе QT/Бизнес не появится случаем?

orefkov (09:36:54 15/04/2008)
Об этом даже не задумывались еще.
А вот для работы с скл - модели, как показал опыт, мало пригодны.
Такой красоты, как ТабличноеПоле (по принципу работы) нетути.
При скроллинге таблиц все данные постепенно подтягиваются в клиента.
А с SQLite еще хуже - пока открыт select - нельзя сделать коммит транзакции,
а в гриде постоянно открыт селект, пока не вычерпаешь его до последней строки.
orefkov (09:38:21 15/04/2008)
Пришлось писать свою модельку для отображения строк продажи.
orefkov (09:38:21 15/04/2008)
Пришлось писать свою модельку для отображения строк продажи.

trdm (09:50:39 15/04/2008)
Модельку или поле?

orefkov (09:51:24 15/04/2008)
Модельку конечно, поле оно и в африке поле.

trdm (09:51:54 15/04/2008)
За сведения на счет селекта спасибо, буду знать.

orefkov (09:53:44 15/04/2008)
Так что при записи в базу sqlite всегда приходится следить, что бы перед коммитом все селекты были закрыты, или выбраны до конца (в этом случае они автоматом закрываются)

trdm (09:53:54 15/04/2008)
А наследовались от абстрактитеммодел или врукопашную модельку делали?

orefkov (09:54:19 15/04/2008)
class SCurrentSale : public QAbstractTableModel

trdm (09:57:30 15/04/2008)
да, любопытно было бы посмотреть. Мне самому предстоит пару табличек обслужить.
Правда это не рабочий проект.

orefkov (10:01:10 15/04/2008)
Ну я делал на таком упрощенном донельзя принципе ТабличногоПоля (это подошло для моего частного случая) - в модели подготавливал параметризированный запрос, получающий ОДНУ строку таблицы, и храню ключ считанной строки (в моем случае он совпадает с номером строки в гриде). Когда грид просит данные, смотрю, если номер строки не совпадает с ключом, выполняю запрос, запоминаю номер строки.
После этого возвращаю данные для нужной колонки.

может чего намекнет.

Сообщение отредактировал trdm - 18.12.2009, 20:15
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Kagami
  опции профиля:
сообщение 18.12.2009, 20:30
Сообщение #4


Старейший участник
****

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

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




Репутация:   9  


Я пока так решил проблему в основной программе:
Цитата
QSqlTableModel *model = new QSqltableModel();
//настраиваем что надо
model->select();
//и сразу же
model->query().finish();
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MoPDoBoPoT
  опции профиля:
сообщение 18.12.2009, 20:42
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 172
Регистрация: 7.5.2009
Из: Москва
Пользователь №: 738

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




Репутация:   9  


Да, такая штука будет, если в таблице больше 255 записей. Чтобы транзакция не висела, можно попробовать вытащить все данные:
while (sqlModel->canFetchMore())
     sqlModel->fetchMore();

Но если данных будет много, то, сам понимаешь, все будет висеть в памяти :)

Цитата(Litkevich Yuriy @ 18.12.2009, 18:52) *
попробуй существующий код, только для QSqlQuery использовать отдельное (самостоятельное) соединение (именованное, а не умалчиваемое).

Кстати, да. Если обременяет тянуть все данные, то осуществляй свое редактирование в другом соединении.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 11.8.2020, 12:56