Автор: Kagami 18.12.2009, 17:34
Есть база данных. Она отображается в QTableView с помощью QSqlTableModel и иногда редактируется мной с помощью QSqlQuery. При этом я использую транзакции. И заметил что при вызове QSqlDatabase::commit(), ничего не происходит, база данных сообщает что есть активные запросы. Может ли это влиять модель, которая внутри тоже использует QSqlQuery? Тестовый пример попробую сделать чуть позже.
Автор: Litkevich Yuriy 18.12.2009, 18:52
попробуй существующий код, только для QSqlQuery использовать отдельное (самостоятельное) соединение (именованное, а не умалчиваемое).
Возможно, что в Qt одно соединение - одна транзакция
Автор: trdm 18.12.2009, 19:53
Цитата(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)
Ну я делал на таком упрощенном донельзя принципе ТабличногоПоля (это подошло для моего частного случая) - в модели подготавливал параметризированный запрос, получающий ОДНУ строку таблицы, и храню ключ считанной строки (в моем случае он совпадает с номером строки в гриде). Когда грид просит данные, смотрю, если номер строки не совпадает с ключом, выполняю запрос, запоминаю номер строки.
После этого возвращаю данные для нужной колонки.
может чего намекнет.
Автор: Kagami 18.12.2009, 20:30
Я пока так решил проблему в основной программе:
Цитата
QSqlTableModel *model = new QSqltableModel();
//настраиваем что надо
model->select();
//и сразу же
model->query().finish();
Автор: MoPDoBoPoT 18.12.2009, 20:42
Да, такая штука будет, если в таблице больше 255 записей. Чтобы транзакция не висела, можно попробовать вытащить все данные:
while (sqlModel->canFetchMore())
sqlModel->fetchMore();
Но если данных будет много, то, сам понимаешь, все будет висеть в памяти
Цитата(Litkevich Yuriy @ 18.12.2009, 18:52)
попробуй существующий код, только для QSqlQuery использовать отдельное (самостоятельное) соединение (именованное, а не умалчиваемое).
Кстати, да. Если обременяет тянуть все данные, то осуществляй свое редактирование в другом соединении.