crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> не могу понять принципа работы
FantasyOr
  опции профиля:
сообщение 16.3.2011, 15:34
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 75
Регистрация: 13.8.2010
Пользователь №: 1956

Спасибо сказали: 4 раз(а)




Репутация:   0  


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

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

Подскажите пожалуйста: где брать объект QSqlDatabase в описанной выше схеме, для вызова у него функций commitTransaction ...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Kagami
  опции профиля:
сообщение 16.3.2011, 21:03
Сообщение #2


Старейший участник
****

Группа: Участник
Сообщений: 601
Регистрация: 2.2.2009
Пользователь №: 523

Спасибо сказали: 101 раз(а)




Репутация:   9  


После того как ты создаешь объект 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
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 75
Регистрация: 13.8.2010
Пользователь №: 1956

Спасибо сказали: 4 раз(а)




Репутация:   0  


да, красиво.

QSqlDatabase::database().driver()->beginTransaction();
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 18.3.2011, 22:50
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


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


Старейший участник
****

Группа: Участник
Сообщений: 601
Регистрация: 2.2.2009
Пользователь №: 523

Спасибо сказали: 101 раз(а)




Репутация:   9  


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

Это я чтобы попроще объяснить :) и не пугать страшными словами.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
PAFOS
  опции профиля:
сообщение 24.3.2011, 17:52
Сообщение #6


Активный участник
***

Группа: Участник
Сообщений: 258
Регистрация: 27.12.2010
Из: Дмитров
Пользователь №: 2309

Спасибо сказали: 29 раз(а)




Репутация:   8  


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

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

...
...

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

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

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.3.2024, 17:36