Russian Qt Forum

Qt => Базы данных => Тема начата: Jo от Март 28, 2010, 21:03



Название: связь между QSqlDatabase и QSqlQuery
Отправлено: Jo от Март 28, 2010, 21:03
Ребят не подскажете как устанавливается связь между соеденением и запросом?

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

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

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

Понял что если я создам объект query выше по коду чем открою соед. то он не заработает.
Вообщем, если не сложно помогите. Как объект query узнает о объекте?


Название: Re: связь между QSqlDatabase и QSqlQuery
Отправлено: BRE от Март 28, 2010, 21:08
Когда создается подключение методом:
QSqlDatabase QSqlDatabase::addDatabase ( const QString & type, const QString & connectionName = QLatin1String( defaultConnection ) )   [static]
вторым параметром идет имя этого соединения. У этого параметра указано имя по умолчанию.

Когда создается объект QSqlQuery без указания соединения, то этот объект использует соединение с именем по умолчанию.


Название: Re: связь между QSqlDatabase и QSqlQuery
Отправлено: Jo от Март 28, 2010, 23:24
Стало чуть понятней, спасибо. Но все же хотелось бы узнать, как объект класса QSqlQuery обращается к объекту класса QSqlDatabase, вот как QSqlQuery получает соединение с именем по умолчанию. Непонимаю как объект одного класса может пользовать методы другого класса не имея ни ссылки не указателя на этот класс. Ну может QSqlQuery и имеет указатель или ссылку на объект класса QSqlDatabase, но просто не понимаю как это происходит. (в случае соединения по умолчанию)


Название: Re: связь между QSqlDatabase и QSqlQuery
Отправлено: lit-uriy от Март 29, 2010, 01:56
>>вот как QSqlQuery получает соединение с именем по умолчанию
так же как и ты, если бы тебе это понадобилось.
Смотри статический член QSqlDatabase::database()

П.С. да и вообще посмотри описание класса QSqlDatabase (http://doc.crossplatform.ru/qt/4.4.3/qsqldatabase.html#details)

П.П.С. Обрати внимание на свой же код, ты пользуешься статическим членом
QSqlDatabase::addDatabase("QSQLITE");
только он может создать действительный экземпляр класса. Этот класс ведёт себя, как "Именованный одиночка (Singleton)"


Название: Re: связь между QSqlDatabase и QSqlQuery
Отправлено: Dr.Vlad от Апрель 05, 2010, 22:22
Как много слов:

QSqlQuery *newquery = new QSqlQuery(db)

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

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

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


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

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

QSqlDatabase это value - based класс он специально сделан чтобы не протаскивать указатель на DB во все подформы а локально его создавать в каждой форме и где еще нужно!, и также передавать в запросы и модели!