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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Множественное подключение к БД  (Прочитано 9747 раз)
vladimirse
Гость
« : Январь 24, 2017, 08:49 »

Доброго времени суток, уважаемые!
Пишу программу, которая в своей работе использует базу данных.
Функционал обращения к БД я вынес в отдельный класс (функции чтения, записи и т.п.), подключение к БД осуществляется в конструкторе класса.
Программа состоит из нескольких форм и вопрос в том, как правильно реализовать работу с БД из каждой форму.
Каждый раз создавать новый объект или же лучше создать его один раз и передавать его каким то образом в остальные формы?
Так же множественное подключение к БД создает некие трудности.
Записан
PimenS
Крякер
****
Offline Offline

Сообщений: 371


Просмотр профиля
« Ответ #1 : Январь 24, 2017, 09:00 »

Какая база данных? Для чего вам нужно множественное подключение?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #2 : Январь 24, 2017, 09:02 »

QSqlDatabase является синглтоном, поэтому при правильном подходе у тебя будет одно пподключение.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
vladimirse
Гость
« Ответ #3 : Январь 24, 2017, 09:08 »

Какая база данных? Для чего вам нужно множественное подключение?

База SQLite. Множественное подключение может и не нужно, я вот для этого и спрашиваю, что бы выяснить как правильно сделать.
В разных формах производятся различные операции с БД, собственно для этого.
Записан
vladimirse
Гость
« Ответ #4 : Январь 24, 2017, 09:09 »

QSqlDatabase является синглтоном, поэтому при правильном подходе у тебя будет одно пподключение.
Поясните пожалуйста, если можно пример кода или дайте ссылку на мануал. Я много где натыкался на это но не встречал примера.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #5 : Январь 24, 2017, 09:12 »

Где-нибудь в main делаешь один раз

Код
C++ (Qt)
QSqlDatabase db = QSqlDatabase::addDatabase("ConnectionName", "QSQLITE");
....
db.open();
 

А в твоем классе делаешь так:

Код
C++ (Qt)
QSqlQuery query (QSqlDatabase::database("ConnectionName"));
 

И будет у тебя только одно подключение.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
vladimirse
Гость
« Ответ #6 : Январь 24, 2017, 09:40 »

Спасибо!
Попробую применить это к своему проекту.
Записан
vladimirse
Гость
« Ответ #7 : Январь 24, 2017, 09:53 »

Подскажите пожалуйста, а как в данном случае проверить наличие подключения?
Раньше я делал просто:
Код:
if(!db.open())
...

или

Код:
if(!db.isOpen())
...
Но db был в зоне видимости класса, а как сейчас поступать?
« Последнее редактирование: Январь 24, 2017, 09:55 от vladimirse » Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #8 : Январь 24, 2017, 10:09 »

RTFM
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #9 : Январь 24, 2017, 10:13 »

Подскажите пожалуйста, а как в данном случае проверить наличие подключения?
Раньше я делал просто:
Код:
if(!db.open())
...

или

Код:
if(!db.isOpen())
...
Но db был в зоне видимости класса, а как сейчас поступать?

Включаем мозг

Код
C++ (Qt)
if (!QSqlDatabase::database("ConnectionName").isOpen())
 
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
vladimirse
Гость
« Ответ #10 : Январь 24, 2017, 10:14 »

А вот так не лучше
Код:
if (QSqlDatabase::contains("DBCONN"))
...

?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #11 : Январь 24, 2017, 10:22 »

А вот так не лучше
Код:
if (QSqlDatabase::contains("DBCONN"))
...

?

Так ты узнаешь, что подключение есть, но не то, что оно открыто.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
vladimirse
Гость
« Ответ #12 : Январь 24, 2017, 10:25 »

Так ты узнаешь, что подключение есть, но не то, что оно открыто.

Поясните пожалуйста в чем разница между существующим подключением и открытым?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #13 : Январь 24, 2017, 10:36 »

Так ты узнаешь, что подключение есть, но не то, что оно открыто.

Поясните пожалуйста в чем разница между существующим подключением и открытым?

Код
C++ (Qt)
QSqlDatabase db = QSqlDatabase::addDatabase("ConnectionName", "DriverName");
qDebug () << QSqlDatabase::contains("ConnectionName") << QSqlDatabase::database("ConnectionName").isOpen();
db.open();
qDebug () << QSqlDatabase::contains("ConnectionName") << QSqlDatabase::database("ConnectionName").isOpen();
 

Скажи, что выведет в консоль и сам поймешь ответ на свой вопрос.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
vladimirse
Гость
« Ответ #14 : Январь 24, 2017, 10:41 »

Я понял.
Большое спасибо за помощь, Вы мне очень помогли!
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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