crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Проблема с Переподключением к БД
JohnZ
  опции профиля:
сообщение 11.1.2017, 21:51
Сообщение #1


Участник
**

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

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




Репутация:   0  


Вот кусок кода,

    ....

    fpDB = new fpDataBase(this);    // MYSQL

    if (!fpDB->open())
     qDebug() << "Not Open DB";

    mainForma = new fpForma(fobj, this);
    mainForma->initForm(idt);      // actiontype - Select, Edit etc
    mainForma->exec();

    fpDB->close();
    delete fpDB;


... в котором после 2-го исполнения в консоль начинают сыпаться сообщения

QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.
QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.
QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.
...

Мелочь, а неприятно. :-) Подскажите как побороть ...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 12.1.2017, 6:27
Сообщение #2


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

Группа: Модератор
Сообщений: 1636
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

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




Репутация:   12  


гугл нашёл:

http://stackoverflow.com/questions/2548321...ase-connections

по идее, тебе не нужно каждый раз создавать базу, а нужно использовать именованный коннкект. если же ты не указываещь имя, то используется дефолтный, который и переоткрывается каждый раз.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
JohnZ
  опции профиля:
сообщение 12.1.2017, 13:46
Сообщение #3


Участник
**

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

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




Репутация:   0  


Дык у гугла я тоже спрашивал, и согласно его рекомендаций добавил в fpDB->close() строку
    db.removeDatabase(baseName);

Функция сейчас стала выглядеть так
void fpDataBase::close()
{
    if (db.isOpen())
        db.close();
    db.removeDatabase(baseName);
}

Всё равно не помогло.
Я полагал, что если закрываю БД и полностью удаляю объект (delete fpDB; ) должен "пропасть" и дефолтный ...

Тогда вопрос звучит так, как грохнуть дефолтный конект ?

... потому как организовать в данной задаче глобальный объект и подключиться к БД единожды, не совсем возможно ...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 12.1.2017, 14:26
Сообщение #4


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

Группа: Участник
Сообщений: 2911
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


JohnZ,

первый вызов

QSqlDatabase::addDatabase("QMYSQL","моябаза");//thread-safe


регистрирует соединение с именем "моябаза", и до вызова
QSqlDatabase::removeDatabase("моябаза");//thread-safe


это соединение никуда не девается. Обычно и не требуется вызывать removeDatabase до завершения приложения, а доступ к соединению осуществляется вызовом

void SomeFunc()
{
   QSqlDatabase db=QSqlDatabase::database("моябаза");//thread-safe
   db. ...;
}


А вот если при существующем соединении заново вызвать addDatabase, то выскочит вышеупомянутое предупреждение
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
JohnZ
  опции профиля:
сообщение 13.1.2017, 12:47
Сообщение #5


Участник
**

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

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




Репутация:   0  


Да, в if (!fpDB->open()) есть вызов addDatabase .
Т е других вариантов, кроме как глобальный объект БД НЕТ ?
Возможно-ли закрыть соединение принудительно ?
Ведь объект удаляется, где оно "висит" ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 13.1.2017, 13:48
Сообщение #6


Старейший участник
****

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

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




Репутация:   8  


В addDatabase тоже должно быть baseName и в каждом обращении к database.
Дефолтный коннект существует независимо, но если ты не делал addDatabase без имени базы, то он кушать не просит :lol:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
JohnZ
  опции профиля:
сообщение 16.1.2017, 11:04
Сообщение #7


Участник
**

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

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




Репутация:   0  


В том-то и дело, что addDatabase в объекте fpDB вызывается только с именем БД.
... и её-же закрываю в close :-(
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 17.1.2017, 9:18
Сообщение #8


Старейший участник
****

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

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




Репутация:   8  


Значит где то еще вызываешь без параметров, чудес то не бывает ;)
https://github.com/qt/qtbase/blob/dev/src/s...atabase.cpp#L65
https://github.com/qt/qtbase/blob/dev/src/s...tabase.cpp#L216
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 26.2.2017, 3:56