Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Разработка баз данных _ не могу понять принципа работы

Автор: FantasyOr 16.3.2011, 15:34

Здравствуйте. Начал работать с базами данных.
Пример в книге гласит - создайте подключение к базе в отдельной функции в main.cpp, а потом можете по всему приложению где угодно выполнять запросы, заполнять модели и прочее.

Не понятен собственно момент подключения QSqlQuery к QSqlDatabase, сначала думал что в QApplication хранится соединение и оттуда подключается, но его там нет. А вопрос возник в следствии надобности делать коммиты и роллбеки, а эти функции запускаются у конкретных экземпляров QSqlDatabase.

Подскажите пожалуйста: где брать объект QSqlDatabase в описанной выше схеме, для вызова у него функций commitTransaction ...

Автор: Kagami 16.3.2011, 21:03

После того как ты создаешь объект QSqlDatabase с помощью функции QSqlDatabase::addDatabase(), он сохраняется где-то в памяти компьютера. Чтобы снова получить его не создавая новое соединение нужно использовать QSqlDatabase::database().
Например, в main создаем подключение:

     QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");
     db.setHostName("acidalia");
     db.setDatabaseName("customdb");
     db.setUserName("mojito");
     db.setPassword("J0a1m8");
     bool ok = db.open();

А затем где нам нужно получаем его снова (в другой функции):
  QSqlDatabase db = QSqlDatabase::database();


Автор: FantasyOr 17.3.2011, 10:19

да, красиво.

QSqlDatabase::database().driver()->beginTransaction();

Автор: Litkevich Yuriy 18.3.2011, 22:50

Цитата(Kagami @ 16.3.2011, 23:03) *
он сохраняется где-то в памяти компьютера
:)
класс QSqlDatabase - именованный одиночка (в оригинале - "Value class"). поэтому соединение создаётся через статическую функцию-член, и получают соединение по имени также через статическиую функцию-член.

Автор: Kagami 18.3.2011, 23:31

Цитата(Litkevich Yuriy @ 18.3.2011, 22:50) *
Цитата(Kagami @ 16.3.2011, 23:03) *
он сохраняется где-то в памяти компьютера
:)
класс QSqlDatabase - именованный одиночка (в оригинале - "Value class"). поэтому соединение создаётся через статическую функцию-член, и получают соединение по имени также через статическиую функцию-член.

Это я чтобы попроще объяснить :) и не пугать страшными словами.

Автор: PAFOS 24.3.2011, 17:52

А еще можно держать подключения к нескольких серверам

QSqlDatabase::addDatabase("QSQLITE",QLatin1String("OneConnection"));
QSqlDatabase::addDatabase("QSQLITE",QLatin1String("TwoConnection"));

...
...

QSqlDatabase db1 = QSqlDatabase::database("OneConnection");
QSqlDatabase db2 = QSqlDatabase::database("TwoConnection");

если при QSqlDatabase::addDatabase мы не указываем имя соединения, то оно будет носить имя по умолчанию и соответствнно QSqlDatabase::database() вернет это самое подключение по умолчанию.

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)