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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: незакрывается подключение к БД после запросов  (Прочитано 3601 раз)
zloyGamer
Гость
« : Декабрь 01, 2009, 06:26 »

подскажите как поправить, или что тут может быть не так, к примеру простая форма с несколькими кнопками и вьюхой:
Код:
#ifndef form_query_H
#define form_query_H

#include "..."

namespace Ui {  class form_query; }

class form_query :
        public QWidget
{
    Q_OBJECT
  public:
    form_query(QWidget *parent = 0);
    ~form_query();

  private:
    Ui::form_query                 *ui;
    QSqlDatabase                    db;
    QSqlQueryModel                  m_model;

  public slots:
    void _on__connect_refresh();
    void _on__connect();
    void _on__disconnect();
    void _on__remove_connect();
    void _on__connect_select();
};

#endif // form_query_H

Код:
#include "form_query.h"
#include "..."
//-------------------------------------------------------------------------------------------------
form_query::form_query(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::form_query)
{
    ui->setupUi(this);
}
//-------------------------------------------------------------------------------------------------
form_query::~form_query()
{
    delete ui;
}
//-------------------------------------------------------------------------------------------------
void form_query::_on__connect_refresh()
{

  if(db.isValid())
    ui->label_test2->setText( ui->label_test2->text() + " db_is_valid");

  if(db.isOpen())
    ui->label_test2->setText( ui->label_test2->text() + " db_is_open");

  if( m_model.query().isActive())
    ui->label_test2->setText( ui->label_test2->text() + " query_is_active");

}
//-------------------------------------------------------------------------------------------------
void form_query::_on__connect()
{
  ui->label_test2->setText("_on__connect");
  QSqlDatabase::removeDatabase( "test" );

  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();

  _on__connect_refresh();
}
//-------------------------------------------------------------------------------------------------
void form_query::_on__disconnect()
{
  ui->label_test2->setText("_on__disconnect");
  db.close();
  _on__connect_refresh();
}
//-------------------------------------------------------------------------------------------------
void form_query::_on__remove_connect()
{
  ui->label_test2->setText("_on__remove_connect");
  db.removeDatabase("test");
  _on__connect_refresh();
}
//-------------------------------------------------------------------------------------------------
void form_query::_on__connect_select()
{
  ui->label_test2->setText("_on__connect_select");
  QSqlQuery q("SELECT * FROM ui_table",db);
  m_model.setQuery(q);
  ui->view->setModel(&m_model);
  _on__connect_refresh();
}
вообщем при нажатии на _on__connect_refresh(); - срабатывает в любом случае и выдает кое какие данные,
и если подключиться к бд (_on__connect() ) а потом вызвать _on__disconnect() то все ок,: FB вначале выдает что было 1 соединение а потом 0,
но если после _on__connect()  вызвать _on__connect_select() и _on__disconnect() то соединение остается!
что может мешать разорвать соединение?
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #1 : Декабрь 01, 2009, 09:23 »

Попробуй в on_disconnect перед db.close() прописать

Код:
QSqlDatabase::database().removeDatabase(QSqlDatabase::database().connectionName());
Записан
zloyGamer
Гость
« Ответ #2 : Декабрь 03, 2009, 07:04 »

нет не помогло,
  QSqlDatabase::database().removeDatabase(QSqlDatabase::database().connectionName()); //ни этот
  db.removeDatabase("test"); //ни тупо этот вариант
  db.close();
и вообще мне кажется это бессмысленно, чтоб отрубить подключение - должно быть достаточно просто db.close(); или я ошибаюсь?
есть другие варианты?
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Декабрь 03, 2009, 08:17 »

Сделай переменную
QSqlDatabase db;
локальной, а не общей для класса.
Записан

Юра.
zloyGamer
Гость
« Ответ #4 : Декабрь 04, 2009, 02:52 »

Код:
Сделай переменную
QSqlDatabase db;
локальной, а не общей для класса.
проверил, некатит, тоже самое получается - коннект остается, и при следующем подключении создается новый коннект!
какие могут быть варианты?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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