Russian Qt Forum

Qt => Базы данных => Тема начата: TheMixa от Июнь 16, 2010, 12:55



Название: множетсво подключений к разным БД [SOLVED]
Отправлено: TheMixa от Июнь 16, 2010, 12:55
Здравствуйте.

не могу закрыть БД при таком варианте, воспрос с открытием снят.

Помогите разобраться. Необходимо чтобы приложение поддерживало множество БД SQLITE. Хочу создать хеш(или есть более удачный вариант?), где каждому подключению QSqlDatabase будет соответствовать id. Однако не получается, при попытке открыть вторую БД вижу что в консоль сыпется сообщение о том что подключение с таким именем уже есть и будет замещено новым.

Вот написал тестовый код чтобы понять:
Код:
#ifndef DATABASEMANAGER_H

#define DATABASEMANAGER_H



#include <QObject>

#include <QSqlDatabase>

#include <QSqlError>

#include <QFile>

#include <QHash>



class DatabaseManager : public QObject

{

Q_OBJECT

public:

    explicit DatabaseManager(QObject *parent = 0);



public:

    bool openDB(int dbid, QString dbname);

    void closeDB(int dbid);

    QSqlError lastError(int dbid);

    QHash <int, QSqlDatabase*> dblist;

};

#endif // DATABASEMANAGER_H

Код:
#include "databasemanager.h"



DatabaseManager::DatabaseManager(QObject *parent) :

    QObject(parent)

{



}



bool DatabaseManager::openDB(int dbid, QString dbname)

{    

    dblist[dbid] = &QSqlDatabase::addDatabase("QSQLITE");

    dblist.value(dbid)->setDatabaseName(dbname);

    return dblist.value(dbid)->open();

}



QSqlError DatabaseManager::lastError(int dbid)

{

    return dblist.value(dbid)->lastError();

}



void DatabaseManager::closeDB(int dbid)

{

    //dblist.value(dbid)->close();

    dblist.remove(dbid);

}


Код:
void MyProgram::on_testmenu_triggered()

{

    qDebug() << "Menu clicked";

    

    DatabaseManager dbm;



    if (dbm.openDB(1,"dbtest1"))

    {

        qDebug() << "DB1 opened";

    }





    if (dbm.openDB(2,"dbtest2"))

    {

        qDebug() << "DB2 opened";

    }

    //qDebug() << "DB1 closing";

    //dbm.closeDB(1);

    //qDebug() << "DB1 closed";

    //dbm.closeDB(2);

}



Название: Re: множетсво подключений к разным БД
Отправлено: Amigo_sa от Июнь 16, 2010, 13:47
Заинтересовался и почитал Assistant:
Цитировать
Create a connection (i.e., an instance of QSqlDatabase) by calling one of the static addDatabase() functions, where you specify the driver or type of driver to use (i.e., what kind of database will you access?) and a connection name. A connection is known by its own name, not by the name of the database it connects to. You can have multiple connections to one database. QSqlDatabase also supports the concept of a default connection, which is the unnamed connection. To create the default connection, don't pass the connection name argument when you call addDatabase(). Subsequently, when you call any static member function that takes the connection name argument, if you don't pass the connection name argument, the default connection is assumed.
Утверждается что каждому соединению УЖЕ устанавливается идентификатор (возможно, ваш id не понадобится). Просто при addDatabase() этот параметр имеет значение по умолчанию.
Код:
QSqlDatabase QSqlDatabase::addDatabase ( QSqlDriver * driver, const QString & connectionName = QLatin1String( defaultConnection ) )   [static]


Название: Re: множетсво подключений к разным БД
Отправлено: crossly от Июнь 16, 2010, 14:40
добавить имя соединения в addDatabase.... понятное дело что для каждого соединения свое.... иначе используется имя по умолчанию.... при создании соединения с таким же именем предыдущее удаляется...


Название: Re: множетсво подключений к разным БД
Отправлено: TheMixa от Июнь 17, 2010, 11:29
спасибо с этим разобрался. dbid сделал QString и добавляю его в addConnection.

осталась нерешенная проблема с закрытием базы. На close оно валится с предложением отправить отчет в микрософт. sqlite в системе присутсвует, пустые файлы при open создаются.
Код:
void DatabaseManager::closeDB(QString dbid)

{

    dblist.value(dbid)->close();

    dblist.remove(dbid);

    QSqlDatabase::removeDatabase(dbid);

}


Название: Re: множетсво подключений к разным БД
Отправлено: crossly от Июнь 17, 2010, 11:31
а на кой "хрен", простите за выражение, хранить все это в хэше??


Название: Re: множетсво подключений к разным БД
Отправлено: TheMixa от Июнь 17, 2010, 11:33
Какой есть еще вариант когда известен id базы обратиться к этой самой базе не закрывая других при условии что баз может быть от 1 до n ?


Название: Re: множетсво подключений к разным БД
Отправлено: Kolobok от Июнь 17, 2010, 12:20
id базы это connectionName? тогда так
Код:
void DatabaseManager::closeDB(QString dbid)
{
    QSqlDatabase::database( dbid ).close();
    QSqlDatabase::removeDatabase(dbid);
}


Название: Re: множетсво подключений к разным БД
Отправлено: crossly от Июнь 17, 2010, 12:24
+100


Название: Re: множетсво подключений к разным БД
Отправлено: TheMixa от Июнь 17, 2010, 12:28
Вот спасибо. Пока Qt для меня чудный мир, изучаю на ходу.


Название: Re: множетсво подключений к разным БД
Отправлено: TheMixa от Июнь 17, 2010, 12:51
Но от хешей это не избавляет. Объекты QSqlDatabase надо где-то хранить.


Название: Re: множетсво подключений к разным БД
Отправлено: lit-uriy от Июнь 17, 2010, 12:54
>>Но от хешей это не избавляет. Объекты QSqlDatabase надо где-то хранить.
как ты намерен это использовать в коде?


Название: Re: множетсво подключений к разным БД
Отправлено: TheMixa от Июнь 17, 2010, 13:10
Ну я же говорил:  задача в том чтобы подключать разные базы sqlite. Я же к одному QSqlDatabase не подключу одновременно несколько баз? Если нет то на каждую базу надо хранить отдельный QSqlDatabase, а где его хранить?, например можно в хеше.


Название: Re: множетсво подключений к разным БД
Отправлено: Kolobok от Июнь 17, 2010, 13:16
Как ты думаешь, что делает метод QSqlDatabase::database(...)?


Название: Re: множетсво подключений к разным БД
Отправлено: lit-uriy от Июнь 17, 2010, 16:05
>>а где его хранить?
а это смотря, как ты его собираешься использовать.

Если конкретную БД должен будет выбирать пользователь, например из выпадающего списка, там и храни, только не объект QSqlDatabase, а имя соединения (см. сообщение от Колобка)


Название: Re: множетсво подключений к разным БД
Отправлено: TheMixa от Июнь 22, 2010, 08:19
вернулся к этому вопросу и понял где ошибался.
Вот так работает как вы говорили. Всем спасибо
Код:
bool DatabaseManager::openDB(QString dbid, QString dbname)

{   
    QSqlDatabase db;

    db = QSqlDatabase::addDatabase("QSQLITE",dbid);

    db.setDatabaseName(dbname);

    return QSqlDatabase::database(dbid).open();

}