Russian Qt Forum

Qt => Базы данных => Тема начата: Astrologer от Октябрь 08, 2010, 16:13



Название: Ошибка сегментации после commit
Отправлено: 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";
Что это может быть?


Название: Re: Ошибка сегментации после commit
Отправлено: Hellraiser от Октябрь 08, 2010, 16:50
Зачем для select`а использовать транзакцию? Она требуется для случая записи в базу (insert, update, delete).


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

Ну и, рекомендую перейти на драйвер QFIREBIRD. Пользуясь случаем, выражаю благодарность автору этого замечательного драйвера.


Название: Re: Ошибка сегментации после commit
Отправлено: Astrologer от Октябрь 12, 2010, 22:55
Спасибо за ответы. Это и есть Firebird драйвер.


Название: Re: Ошибка сегментации после commit
Отправлено: Whiplash от Октябрь 13, 2010, 10:59
Спасибо за ответы. Это и есть Firebird драйвер.

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

QIBASE - так называется стандартный драйвер от Qt. Есть ещё драйвер QFIREBIRD, основанный на ibpp.