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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: множетсво подключений к разным БД [SOLVED]  (Прочитано 8601 раз)
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);

}

« Последнее редактирование: Июнь 22, 2010, 08:20 от TheMixa » Записан
Amigo_sa
Гость
« Ответ #1 : Июнь 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]
Записан
crossly
Гость
« Ответ #2 : Июнь 16, 2010, 14:40 »

добавить имя соединения в addDatabase.... понятное дело что для каждого соединения свое.... иначе используется имя по умолчанию.... при создании соединения с таким же именем предыдущее удаляется...
Записан
TheMixa
Гость
« Ответ #3 : Июнь 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);

}
Записан
crossly
Гость
« Ответ #4 : Июнь 17, 2010, 11:31 »

а на кой "хрен", простите за выражение, хранить все это в хэше??
Записан
TheMixa
Гость
« Ответ #5 : Июнь 17, 2010, 11:33 »

Какой есть еще вариант когда известен id базы обратиться к этой самой базе не закрывая других при условии что баз может быть от 1 до n ?
Записан
Kolobok
Гость
« Ответ #6 : Июнь 17, 2010, 12:20 »

id базы это connectionName? тогда так
Код:
void DatabaseManager::closeDB(QString dbid)
{
    QSqlDatabase::database( dbid ).close();
    QSqlDatabase::removeDatabase(dbid);
}
Записан
crossly
Гость
« Ответ #7 : Июнь 17, 2010, 12:24 »

+100
Записан
TheMixa
Гость
« Ответ #8 : Июнь 17, 2010, 12:28 »

Вот спасибо. Пока Qt для меня чудный мир, изучаю на ходу.
Записан
TheMixa
Гость
« Ответ #9 : Июнь 17, 2010, 12:51 »

Но от хешей это не избавляет. Объекты QSqlDatabase надо где-то хранить.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #10 : Июнь 17, 2010, 12:54 »

>>Но от хешей это не избавляет. Объекты QSqlDatabase надо где-то хранить.
как ты намерен это использовать в коде?
Записан

Юра.
TheMixa
Гость
« Ответ #11 : Июнь 17, 2010, 13:10 »

Ну я же говорил:  задача в том чтобы подключать разные базы sqlite. Я же к одному QSqlDatabase не подключу одновременно несколько баз? Если нет то на каждую базу надо хранить отдельный QSqlDatabase, а где его хранить?, например можно в хеше.
« Последнее редактирование: Июнь 17, 2010, 13:13 от TheMixa » Записан
Kolobok
Гость
« Ответ #12 : Июнь 17, 2010, 13:16 »

Как ты думаешь, что делает метод QSqlDatabase::database(...)?
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #13 : Июнь 17, 2010, 16:05 »

>>а где его хранить?
а это смотря, как ты его собираешься использовать.

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

Юра.
TheMixa
Гость
« Ответ #14 : Июнь 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();

}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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