Russian Qt Forum

Qt => Базы данных => Тема начата: iks от Январь 26, 2011, 13:19



Название: Как отключить connect
Отправлено: iks от Январь 26, 2011, 13:19
Используя QTabWidget, когда закрываю вкладку и потом открываю ее по новой то выдает предупреждение
QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.
как отключить преведущий конект и подключить по новой, или не подключатся по новой, а использовать уже имеющийся конект

Код:
// подключим mySQL
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
    db.setConnectOptions("CLIENT_SSL;CLIENT_COMPRESS"); // ssl соединение и компрессия
    db.setHostName(serverSite);
    db.setDatabaseName(databaseName);
    db.setUserName(userName);
    db.setPassword(userPassword);
    if (db.open()) {
        QSqlQuery sql("SELECT * FROM " + tabName);
        if (sql.isActive()){
            QString str = "";
            while ( sql.next() ) {
                str = str + "<b><i><u><font color=blue>"
                      + sql.value(1).toString() + "</font></u></i></b><br>"
                      + sql.value(2).toString() + "<hr>";
            }
            this->setText(str);
        }
    } else
        QMessageBox::information(this, trUtf8("Новости"), trUtf8("Не получилось открыть базу данных"));
    db.close();


Название: Re: Как отключить connect
Отправлено: BRE от Январь 26, 2011, 13:26
Перенести код подключения к БД в другое место, например, в main()?


Название: Re: Как отключить connect
Отправлено: iks от Январь 26, 2011, 13:29
Перенести код подключения к БД в другое место, например, в main()?
То есть тогда
QSqlDatabase db;
 обьявлять глобально получается или цеплять по всему пути класcов.


Название: Re: Как отключить connect
Отправлено: BRE от Январь 26, 2011, 13:36
То есть тогда
QSqlDatabase db;
 обьявлять глобально получается или цеплять по всему пути класcов.
Зачем?
Соединение всегда и везде можно получить через:
QSqlDatabase QSqlDatabase::database ( const QString & connectionName = QLatin1String( defaultConnection ), bool open = true ) [static]


Название: Re: Как отключить connect
Отправлено: iks от Январь 26, 2011, 13:38
Спасиб буду экспереминтировать, если что не получится напишу, а заработает тоже напишу полный код  ;)


Название: Re: Как отключить connect
Отправлено: iks от Январь 26, 2011, 13:57
Не мне скорее всего это не подойдет, для одной БД нормально, но все равно ругается если подключение идет к другой БД, надо или connect к серверу ловить и отдельно по БД разгонять, или отключатся и подключатся по новой.


Название: Re: Как отключить connect
Отправлено: BRE от Январь 26, 2011, 14:02
Не мне скорее всего это не подойдет, для одной БД нормально, но все равно ругается если подключение идет к другой БД, надо или connect к серверу ловить и отдельно по БД разгонять, или отключатся и подключатся по новой.
Разберись, для чего используется connectionName в этих методах:
QSqlDatabase QSqlDatabase::addDatabase ( const QString & type, const QString & connectionName = QLatin1String( defaultConnection ) ) [static]
QSqlDatabase QSqlDatabase::database ( const QString & connectionName = QLatin1String( defaultConnection ), bool open = true ) [static]

Для того, что бы разобраться как удалять соединения, воспользуйся поиском по форуму на тему removeDatabase.


Название: Re: Как отключить connect
Отправлено: iks от Январь 26, 2011, 15:26
Временно применил простое решение, ругатся перестало, в
main.cpp

Код:
#include <QtGui/QApplication>
#include "MainWindow.h"

#include <QtSql>
QSqlDatabase db;

int main(int argc, char *argv[])
{
    // подключим mySQL
    db = QSqlDatabase::addDatabase("QMYSQL");
    db.setConnectOptions("CLIENT_SSL;CLIENT_COMPRESS"); // ssl соединение и компресия
    db.setHostName("xxxx.ru");
    db.setUserName("UserName");
    db.setPassword("Password");

    MainWindow mainWin;
    mainWin.show();

     return app.exec();
}

news.h
Код:
extern QSqlDatabase db;

news.cpp
Код:
void newsClass::openTabMySql(QString dbName, QString tabName){
    db.setDatabaseName(dbName);
    if (db.open()) {
        QSqlQuery sql;
        sql.exec("SELECT * FROM " + tabName);
        if (sql.isActive()){
            QString str = "";
            while (sql.next()) {
                str = str + "<b><i><u><font color=blue>"
                      + sql.value(1).toString() + "</font></u></i></b><br>"
                      + sql.value(2).toString() + "<hr>";
            }
            this->setText(str);
        }
    } else
        QMessageBox::information(this, trUtf8("Новости"), trUtf8("Не получилось открыть базу данных"));

    db.close();
}

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