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 соединения, и т.д.
все соединения обрываются тока после закрытия приложения, как это можно исправить?
что можно сделать чтобы соединение корректно закрывалось?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
zloyGamer
  опции профиля:
сообщение 9.12.2009, 20:06
Сообщение #2


Студент
*

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

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




Репутация:   0  


да дествительно видимо что то не так идет в функции isc_detach_database,
ща проверил,
вот с этим вариантом нормально работает:
if(m_model!=0)
{
delete m_model; //раньше модель была не динамическая и ДОЛЖНА была уничтожаться вместе с классом формы, но видимо этого не происходило!
m_model = 0;
}

QSqlDatabase db = QSqlDatabase::database( "test" );
db.close();
db.removeDatabase("test");
_on__connect_refresh();

тоесть если явно вызывать delete или m_model->clear(); ДО закрытия бд - то все ок и закрывается,
иначе isc_detach_database возвращает значение != 0 ( уменя было ==335544357, я пока ненашел что это за ошибка но над будет както проверить передаваемые параметры)

получается надо уничтожить все модели перед тем как закрывать подключение..., хотя в доке явно прописано:
void QSqlDatabase::close ()
Closes the database connection, freeing any resources acquired, and invalidating any existing QSqlQuery objects that are used with the database.
This will also affect copies of this QSqlDatabase object.

и на основе этого я уже успел нагородить кучу говнокода,
оно так и должно работать(необходимо обязательно уничтожать или чистить все модели) или нет?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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


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




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