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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: связь между QSqlDatabase и QSqlQuery  (Прочитано 6692 раз)
Jo
Гость
« : Март 28, 2010, 21:03 »

Ребят не подскажете как устанавливается связь между соеденением и запросом?

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(":memory:");
db.open();

QSqlQuery query;   
query.exec("SELECT * FROM table");

т.е. создаю соеденения и запрос устанавливается для этого соеденения, при том никаких ссылок и т.д. Как это?
Просто никогда не сталкевался с подобным, может есть где почитать, т.с. заполнить пробелы.

Понял что если я создам объект query выше по коду чем открою соед. то он не заработает.
Вообщем, если не сложно помогите. Как объект query узнает о объекте?
Записан
BRE
Гость
« Ответ #1 : Март 28, 2010, 21:08 »

Когда создается подключение методом:
QSqlDatabase QSqlDatabase::addDatabase ( const QString & type, const QString & connectionName = QLatin1String( defaultConnection ) )   [static]
вторым параметром идет имя этого соединения. У этого параметра указано имя по умолчанию.

Когда создается объект QSqlQuery без указания соединения, то этот объект использует соединение с именем по умолчанию.
Записан
Jo
Гость
« Ответ #2 : Март 28, 2010, 23:24 »

Стало чуть понятней, спасибо. Но все же хотелось бы узнать, как объект класса QSqlQuery обращается к объекту класса QSqlDatabase, вот как QSqlQuery получает соединение с именем по умолчанию. Непонимаю как объект одного класса может пользовать методы другого класса не имея ни ссылки не указателя на этот класс. Ну может QSqlQuery и имеет указатель или ссылку на объект класса QSqlDatabase, но просто не понимаю как это происходит. (в случае соединения по умолчанию)
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Март 29, 2010, 01:56 »

>>вот как QSqlQuery получает соединение с именем по умолчанию
так же как и ты, если бы тебе это понадобилось.
Смотри статический член QSqlDatabase::database()

П.С. да и вообще посмотри описание класса QSqlDatabase

П.П.С. Обрати внимание на свой же код, ты пользуешься статическим членом
QSqlDatabase::addDatabase("QSQLITE");
только он может создать действительный экземпляр класса. Этот класс ведёт себя, как "Именованный одиночка (Singleton)"
« Последнее редактирование: Март 29, 2010, 02:03 от lit-uriy » Записан

Юра.
Dr.Vlad
Гость
« Ответ #4 : Апрель 05, 2010, 22:22 »

Как много слов:

QSqlQuery *newquery = new QSqlQuery(db)

или так при запросе setQuery для QSqlQueryModel:

model->setQuery("bla-bla-bla", db);

Только постарайтесь, чтобы вашу db было видно со всех childForm.
Cоздавать по сотню раз коннект с одной и той же базой бессмысленно и чревато наложениями коннектов и создаваемых под них моделей.
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #5 : Апрель 05, 2010, 23:07 »

Цитировать
Только постарайтесь, чтобы вашу db было видно со всех childForm.
Как раз не нужно стараться этого делать! Если не указывать явно жкземпляр класса представляющий соединение с БД, то будет использовано соединение с БД по умолчанию. Т.е. 1 раз создаем соединение - а во всех последующих Query и SQL моделях ничего не указываем - и соединение с БД по умолчанию берется само! Не нужн озаботиться о том чтобы класс представляющий соединение с БД был доступен где-то! Как правильно указали выше - экземпляр такого класса всегда можно получить по имени соединения! И соединение по умолчанию тоже имеет определенное имя!

Цитировать
Cоздавать по сотню раз коннект с одной и той же базой бессмысленно и чревато наложениями коннектов и создаваемых под них моделей.
Вообще не понятно о чем речь! Что за наложения? Если вы боитесь создавать экземпляры класса QSqlDatabase то это напрасно т.к. этот класс управляет соединением с БД а не является им! Кроме того если создать 10 таких классов передавая при создании 1 имя соединения - то все эти экземпляры QSqlDatabase будут управлять одним соединением и иметь верную информацию о нем!

QSqlDatabase это value - based класс он специально сделан чтобы не протаскивать указатель на DB во все подформы а локально его создавать в каждой форме и где еще нужно!, и также передавать в запросы и модели!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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