crossplatform.ru

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

> незакрывается подключение к БД после запросов
zloyGamer
  опции профиля:
сообщение 6.12.2009, 22:02
Сообщение #1


Студент
*

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

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




Репутация:   0  


подскажите как поправить, или что тут может быть не так, к примеру есть простая форма с вьюхой QSqlQueryModel m_model;

  QSqlDatabase::removeDatabase( "test" );
  QSqlDatabase db = QSqlDatabase::addDatabase( "QIBASE"  , "test" );
  db.setHostName( "127.0.0.1" );
  db.setPort( 3050 );
  db.setDatabaseName( "D:\\test.FDB" );
  db.setConnectOptions( "" );
  db.setUserName( "SYSDBA" );
  db.setPassword( "masterkey" );


далее если выполнить:
  db.open();  
  //...
  db.close();

то FB вначале выдает что было 1 соединение а потом 0

а если выполнить какието операции с бд:
  db.open();  
  QSqlQuery q("SELECT * FROM ui_table",db);
  m_model.setQuery(q);
  ui->view->setModel(&m_model);
  db.close();

то FB вначале выдает что было 1 соединение а после db.close(); всеравно остается 1 соединение, но из приложения уже нельзя выполнять запросы
а если далее опять вызвать db.open(); то FB выдает что уже установлено 2 соединения, и т.д.
все соединения обрываются тока после закрытия приложения, как это можно исправить?
что можно сделать чтобы соединение корректно закрывалось?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
SABROG
  опции профиля:
сообщение 8.12.2009, 17:25
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

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




Репутация:   34  


Можно посмотреть отладчиком, что тут происходит:

void QIBaseDriver::close()
{
    if (isOpen()) {

        if (d->eventBuffers.size()) {
            ISC_STATUS status[20];
            QMap<QString, QIBaseEventBuffer *>::const_iterator i;
            for (i = d->eventBuffers.constBegin(); i != d->eventBuffers.constEnd(); ++i) {
                QIBaseEventBuffer *eBuffer = i.value();
                eBuffer->subscriptionState = QIBaseEventBuffer::Finished;
                isc_cancel_events(status, &d->ibase, &eBuffer->eventId);
                qFreeEventBuffer(eBuffer);
            }
            d->eventBuffers.clear();

#if defined(FB_API_VER)
            // Workaround for Firebird crash
            QTime timer;
            timer.start();
            while (timer.elapsed() < 500)
                QCoreApplication::processEvents();
#endif
        }

        isc_detach_database(d->status, &d->ibase);
        d->ibase = 0;
        setOpen(false);
        setOpenError(false);
    }
}


Сообщение отредактировал SABROG - 8.12.2009, 17:27
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


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


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




RSS Текстовая версия Сейчас: 5.12.2024, 0:58