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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Ошибка сегментации после commit  (Прочитано 2697 раз)
Astrologer
Гость
« : Октябрь 08, 2010, 16:13 »

Странные дела. Ошибка вылетает в отладчике после закрытия окна:

Код:
void QDbfReader::sql_execute(QString query)
{
    QSqlDatabase dbs = QSqlDatabase::addDatabase("QIBASE", "con");
    dbs.setDatabaseName("c:\\database.fdb");
    dbs.setUserName("sysdba");
    dbs.setPassword("masterkey");
    dbs.open();
    dbs.transaction();
    model->setQuery(query, dbs);
    dbs.commit();
    dbs.close();
}

Стоит закомментить
Код:
//dbs.transaction();
и
Код:
//dbs.commit();
 - все хорошо.
Код:
query = "select * from basetable";
Что это может быть?
« Последнее редактирование: Октябрь 08, 2010, 16:21 от Astrologer » Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #1 : Октябрь 08, 2010, 16:50 »

Зачем для select`а использовать транзакцию? Она требуется для случая записи в базу (insert, update, delete).
Записан
Whiplash
Гость
« Ответ #2 : Октябрь 11, 2010, 09:34 »

На самом деле, для всего требуется транзакция в Файербёрде (ну, и в интербейсе). И если явно не указать транзакцию, то стартуется неявная транзакция. Драйвер QIBASE не поддерживает вложенные транзакции, кстати. Но тут, ИМХО, проблема не в этом. А в том, что при использовании модели данные, в общем случае, не загружаются все сразу, а поставляются вьюхе по необходимости. Т.е. налицо длинная читающая транзакция. А вы её прерываете коммитом.
Тут, как мне кажется, два решения:
1. Не оборачивать setQuery в явную транзакцию.
2. Попробовать после setQuery выбрать все данные, а вотом уже закоммитить. Т.е. воспользоваться функциями canFetchMore и fetchMore.

Ну и, рекомендую перейти на драйвер QFIREBIRD. Пользуясь случаем, выражаю благодарность автору этого замечательного драйвера.
Записан
Astrologer
Гость
« Ответ #3 : Октябрь 12, 2010, 22:55 »

Спасибо за ответы. Это и есть Firebird драйвер.
Записан
Whiplash
Гость
« Ответ #4 : Октябрь 13, 2010, 10:59 »

Спасибо за ответы. Это и есть Firebird драйвер.

В твоём коде вот что:
Код:
QSqlDatabase dbs = QSqlDatabase::addDatabase("QIBASE", "con");

QIBASE - так называется стандартный драйвер от Qt. Есть ещё драйвер QFIREBIRD, основанный на ibpp.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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