Russian Qt Forum

Qt => Вопросы новичков => Тема начата: vladimirse от Январь 24, 2017, 08:49



Название: Множественное подключение к БД
Отправлено: vladimirse от Январь 24, 2017, 08:49
Доброго времени суток, уважаемые!
Пишу программу, которая в своей работе использует базу данных.
Функционал обращения к БД я вынес в отдельный класс (функции чтения, записи и т.п.), подключение к БД осуществляется в конструкторе класса.
Программа состоит из нескольких форм и вопрос в том, как правильно реализовать работу с БД из каждой форму.
Каждый раз создавать новый объект или же лучше создать его один раз и передавать его каким то образом в остальные формы?
Так же множественное подключение к БД создает некие трудности.


Название: Re: Множественное подключение к БД
Отправлено: PimenS от Январь 24, 2017, 09:00
Какая база данных? Для чего вам нужно множественное подключение?


Название: Re: Множественное подключение к БД
Отправлено: Пантер от Январь 24, 2017, 09:02
QSqlDatabase является синглтоном, поэтому при правильном подходе у тебя будет одно пподключение.


Название: Re: Множественное подключение к БД
Отправлено: vladimirse от Январь 24, 2017, 09:08
Какая база данных? Для чего вам нужно множественное подключение?

База SQLite. Множественное подключение может и не нужно, я вот для этого и спрашиваю, что бы выяснить как правильно сделать.
В разных формах производятся различные операции с БД, собственно для этого.


Название: Re: Множественное подключение к БД
Отправлено: vladimirse от Январь 24, 2017, 09:09
QSqlDatabase является синглтоном, поэтому при правильном подходе у тебя будет одно пподключение.
Поясните пожалуйста, если можно пример кода или дайте ссылку на мануал. Я много где натыкался на это но не встречал примера.


Название: Re: Множественное подключение к БД
Отправлено: Пантер от Январь 24, 2017, 09:12
Где-нибудь в main делаешь один раз

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

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

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

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


Название: Re: Множественное подключение к БД
Отправлено: vladimirse от Январь 24, 2017, 09:40
Спасибо!
Попробую применить это к своему проекту.


Название: Re: Множественное подключение к БД
Отправлено: vladimirse от Январь 24, 2017, 09:53
Подскажите пожалуйста, а как в данном случае проверить наличие подключения?
Раньше я делал просто:
Код:
if(!db.open())
...

или

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


Название: Re: Множественное подключение к БД
Отправлено: Hellraiser от Январь 24, 2017, 10:09
RTFM (http://doc.qt.io/qt-5.6/qsqldatabase.html#details)


Название: Re: Множественное подключение к БД
Отправлено: Пантер от Январь 24, 2017, 10:13
Подскажите пожалуйста, а как в данном случае проверить наличие подключения?
Раньше я делал просто:
Код:
if(!db.open())
...

или

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

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

Код
C++ (Qt)
if (!QSqlDatabase::database("ConnectionName").isOpen())
 


Название: Re: Множественное подключение к БД
Отправлено: vladimirse от Январь 24, 2017, 10:14
А вот так не лучше
Код:
if (QSqlDatabase::contains("DBCONN"))
...

?


Название: Re: Множественное подключение к БД
Отправлено: Пантер от Январь 24, 2017, 10:22
А вот так не лучше
Код:
if (QSqlDatabase::contains("DBCONN"))
...

?

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


Название: Re: Множественное подключение к БД
Отправлено: vladimirse от Январь 24, 2017, 10:25
Так ты узнаешь, что подключение есть, но не то, что оно открыто.

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


Название: Re: Множественное подключение к БД
Отправлено: Пантер от Январь 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();
 

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


Название: Re: Множественное подключение к БД
Отправлено: vladimirse от Январь 24, 2017, 10:41
Я понял.
Большое спасибо за помощь, Вы мне очень помогли!


Название: Re: Множественное подключение к БД
Отправлено: break от Февраль 01, 2017, 02:25
QSqlDatabase является синглтоном, поэтому при правильном подходе у тебя будет одно пподключение.

Справедливости ради - не является

Цитировать
QSqlDatabase is a value class. Changes made to a database connection via one instance of QSqlDatabase will affect other instances of QSqlDatabase that represent the same connection. Use cloneDatabase() to create an independent database connection based on an existing one.

То есть если нужен функционал QSqlDatabase можно его смело создавать в том месте где это надо и работать с ним, он лишь представляет переменную объект для работы с бд. Внутри ссылается на те же данные, что и другие QSqlDatabase с таким же именем подключения.

Для нескольких подключений (к разным бд например) соответственно просто используются разные имена подключений.