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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите организовать подключение двух классов к одной базе  (Прочитано 3912 раз)
Evgeniya
Гость
« : Март 23, 2009, 08:45 »

Доброго времени суток всем!!!
У меня есть два класса...один отображает все данные о предприятии, а другой их редактирует..т.е.они подключаются к одной базе.
И вот,подскажите пожалуйста как мне организовать это подключение к базе...если каждый класс отдельно подключается к базе, то возникает системная ошибка при вызове второго класса....попробовала сделать класс подключения:

Код
C++ (Qt)
#ifndef CONNECTION_H
#define CONNECTION_H
 
#include <QtGui/QMainWindow>
#include <QSqlDatabase>
#include <QSqlError>
#include <QMessageBox>
 
class connection{
public:
connection(){
         d=QSqlDatabase::addDatabase("QODBC");
 d.setDatabaseName("dd_org.dsn");
 if(!d.open())
 QMessageBox::critical(0,"Ошибка подключения",d.lastError().text());
       }
~connection();
QSqlDatabase d;
};
#endif

а в классах я эти подключения определяю примерно так:

Код
C++ (Qt)
connection dbase;
QSqlDatabase dat;
db=dbas.d;

Конечно системных ошибок не выдает как в прошлый раз, но работает некорректно...подскажите пожалуйста, можт как-нить по другоу это стоит организовать
« Последнее редактирование: Апрель 27, 2009, 16:07 от pastor » Записан
BRE
Гость
« Ответ #1 : Март 23, 2009, 08:58 »

Доброго времени суток всем!!!
У меня есть два класса...один отображает все данные о предприятии, а другой их редактирует..т.е.они подключаются к одной базе.
Ты один раз должна открыть базу данных, дальше все запросы будут идти через это соединение.
Вот как определена функция:
Код
C++ (Qt)
QSqlDatabase addDatabase ( const QString & type, const QString & connectionName = QLatin1String( defaultConnection ) )
Т.е. вся работа идет через подключение с именем defaultConnection.

Если нужно получить подключение с указанным именем, можно воспользоваться функцией:
Код
C++ (Qt)
QSqlDatabase database ( const QString & connectionName = QLatin1String( defaultConnection ), bool open = true )
 

Если используются несколько подключений, то их нужно именовать самому:
Код
C++ (Qt)
QSqlDatabase db1 = QSqlDatabase::addDatabase( "QODBC", "MyConnectODBC" );
QSqlDatabase db2 = QSqlDatabase::addDatabase( "QMYSQL", "MyConnectMySql" );
 
void func()
{
   QSqlDatabase db = QSqlDatabase::database( "MyConnectMySql" );
   QSqlQuery query( db );
   query.exec(...)
}
 
Записан
Evgeniya
Гость
« Ответ #2 : Март 23, 2009, 09:34 »

т.е. мне не нужно создавать класс??
Я общий смысл конечно понимаю..но все-равно не до конца...
У меня есть класс

Код
C++ (Qt)
class ViewForm{
public:
   QSqlDatabase dat;
   ViewForm(QWidget *parent = 0);
   ~ViewForm();
}
 
и есть другой класс
class OrgForm{
public:
   QSqlDatabase db;
   QSqlDatabase dbase;
   OrgForm(QWidget *parent = 0);
   OrgForm(QWidget *parent, int ORGID);
   ~OrgForm();
}

и причем подключения dat класса ViewForm и db класса OrgForm подключаются к одной и той-же базе...
Мне нужно из класса ViewForm вызвать класс OrgForm. И как мне нужно сделать...
я так понимаю, что мне нужно подключиться в классе ViewForm

Код
C++ (Qt)
dat = QSqlDatabase::addDatabase("QODBC");
dat.setDatabaseName("dd_org.dsn");

А в классе OrgForm нужно сделать

Код
C++ (Qt)
db= QSqlDatabase::database();
 

Я правильно понимаю????только так не хочет работать  Злой
« Последнее редактирование: Апрель 27, 2009, 16:08 от pastor » Записан
spirit
Гость
« Ответ #3 : Март 23, 2009, 09:52 »

вот так попробуйте
Код
C++ (Qt)
...
db= QSqlDatabase::database("dd_org.dsn");
...
 
и необязательно использовать эти члены класса
QSqlDatabase db;
QSqlDatabase dbase;

лишние зависимости в ашник добавляете.
PS. пользуйтесь тегом CODE, неудобно ведь код читать когда он не оформлен толком.
Записан
Evgeniya
Гость
« Ответ #4 : Март 23, 2009, 10:21 »

Хорошо,буду испрвляться... Улыбающийся
Спасибочки, вроде разобралась с подключениями...

и необязательно использовать эти члены класса
QSqlDatabase db;
QSqlDatabase dbase;

лишние зависимости в ашник добавляете.

dbase - это уже подключение к другой базе, только для этого класса, т.е. это не лишнее
А QSqlDatabase db; можно и не использовать тогда???
Записан
spirit
Гость
« Ответ #5 : Март 23, 2009, 10:26 »

dbase - это уже подключение к другой базе, только для этого класса, т.е. это не лишнее
А QSqlDatabase db; можно и не использовать тогда???
если уж так хочется хранить как член класса, то воспользуйтесь Pimpl.
(т.е. запихнуть все члены данные в приватный класс, а его реализацию сделать в cpp).
я бы поступил именно так.  Улыбающийся
Записан
Evgeniya
Гость
« Ответ #6 : Март 23, 2009, 10:46 »

Спасибочки за такие замечания и советы...просто я только учусь и мне кажется, что все должно быть именно так  Смеющийся
« Последнее редактирование: Апрель 27, 2009, 16:09 от pastor » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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