Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt4] Корректный выход из базы данных 
:(
    Опции темы
kapbepucm
Дата 26.7.2010, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 993
Регистрация: 14.6.2007
Где: Латвия

Репутация: нет
Всего: 12



Есть две машины и 2 сервера MS SQL Server c разными базами. Мне надо прочитать данные с разных баз и разных серверов.
Для подключения/чтения использую данный код:
Код
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
db.setDatabaseName("Driver={SQL Server};Server=server;Database=database;Trusted_Connection=no;");
if (!db.open())
{
  qDebug() << QString("Error: ") << db.lastError().text();
  return;
}
QSqlQuery SearchQuery(db);
SearchQuery.exec(QString("SELECT ...;"));
if (!SearchQuery.isActive())
{
  qDebug() << SearchQuery.lastError().text();
  return;
}
while (SearchQuery.next())
{
  qDebug() << SearchQuery.value(0).toString();
}
SearchQuery.clear();
db.close();
Всё вроде работает, но после повторного вызова вылезает предупреждение: "QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed."
Как закрыть/завершить, чтобы небыло предупреждений?


--------------------
(С) kapbepucm
PM MAIL Skype   Вверх
chaos
Дата 26.7.2010, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 5
Всего: 44



перед тем как вызывать
Код

SqlDatabase db = QSqlDatabase::addDatabase("QODBC");


вызывать 
Код

QSqlDatabase::database("QODBC");


смысл сего действа думаю понятен - если добавили базу, то повторно ничего не надо добавлять

Это сообщение отредактировал(а) chaos - 26.7.2010, 12:19
PM WWW   Вверх
kapbepucm
Дата 26.7.2010, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 993
Регистрация: 14.6.2007
Где: Латвия

Репутация: нет
Всего: 12



Это сообщение всё равно осталось
Код
QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.



--------------------
(С) kapbepucm
PM MAIL Skype   Вверх
borisbn
Дата 26.7.2010, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Сталкивался с таким...
В addDatabase 2 параметра:
Цитата

QSqlDatabase QSqlDatabase::addDatabase ( const QString & type, const QString & connectionName = QLatin1String( defaultConnection ) ) 

второй параметр - имя соединения ( транзакции ), оно должно быть уникальным для каждого подключения. сгенери случайное имя, или подставь имя exe-шника.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
kapbepucm
Дата 26.7.2010, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 993
Регистрация: 14.6.2007
Где: Латвия

Репутация: нет
Всего: 12



Подставил. В конце дописал:
Код
QSqlDatabase::removeDatabase("my_connection");
Теперь предупреждает:
Код
QSqlDatabasePrivate::removeDatabase: connection 'my_connection' is still in use, a
ll queries will cease to work.
Я же эти объекты закрыл, почему он говорит, что нет?

Пытался внаглую заменить
Код
SearchQuery.clear();
db.close();
на
Код
SearchQuery.~QSqlQuery();
db.~QSqlDatabase();
Сообщений больше не выдает, но программа на выходе, когда происходит деструкция главного окна, вылетает в ошибку smile

Это сообщение отредактировал(а) kapbepucm - 26.7.2010, 13:49


--------------------
(С) kapbepucm
PM MAIL Skype   Вверх
djamshud
Дата 26.7.2010, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 5
Всего: 39



Почему бы просто не установить соединение с базой единожды?

...

Про удаление базы в ассиестенте, как сейчас помню, отлично написано. "Удалять" базу можно после того, как отгремит ее деструктор (потому у вас и пропали ворнинги, но все крэшнулось, ибо сделали все через одно место:) ).

Код

{
QSqlDatabase db=QSqlDatabase::database("foo");
...
}
QSqlDataBase::removeDatabase("foo");


Это сообщение отредактировал(а) djamshud - 26.7.2010, 14:03


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
kapbepucm
Дата 26.7.2010, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 993
Регистрация: 14.6.2007
Где: Латвия

Репутация: нет
Всего: 12



Цитата(djamshud @  26.7.2010,  14:03 Найти цитируемый пост)
Почему бы просто не установить соединение с базой единожды?
Это я и сам понимаю, что предупреждений не будетsmile
Тут ситуация такая- куча баз данных, пользователь сам выбирает с какой соединяться. Мне что- один раз открывать сразу все, если пользователю понадобиться одна циферка?

Добавлено через 2 минуты и 20 секунд
Я как-бы и не знаю, сколько у них там баз данных- это величина "плавающая", знаю, что они однотипные.


--------------------
(С) kapbepucm
PM MAIL Skype   Вверх
djamshud
Дата 26.7.2010, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 5
Всего: 39



kapbepucm, дело не в ворнингах, просто так логичнее, чем на каждый чих переоткрывать соединение. Еще можно делать так: необходимо что-то взять из базы - смотрите, открыто ли уже соединение; если нет - открываете. Кажется это называется паттерном фабрика...


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
kapbepucm
Дата 26.7.2010, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 993
Регистрация: 14.6.2007
Где: Латвия

Репутация: нет
Всего: 12



Цитата(djamshud @  26.7.2010,  14:03 Найти цитируемый пост)
"Удалять" базу можно после того, как отгремит ее деструктор
А это не правильно?:
Цитата(kapbepucm @  26.7.2010,  11:45 Найти цитируемый пост)
db.close();




--------------------
(С) kapbepucm
PM MAIL Skype   Вверх
djamshud
Дата 26.7.2010, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 5
Всего: 39



kapbepucm, у них там хитро как-то. Просто close не прокатывает. Нужно, чтобы сам объект базы убился.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
kapbepucm
Дата 26.7.2010, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 993
Регистрация: 14.6.2007
Где: Латвия

Репутация: нет
Всего: 12



Цитата(djamshud @  26.7.2010,  14:33 Найти цитируемый пост)
смотрите, открыто ли уже соединение; если нет - открываете
Наверно, это выход.



--------------------
(С) kapbepucm
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0522 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.