Название: связь между 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 во все подформы а локально его создавать в каждой форме и где еще нужно!, и также передавать в запросы и модели! |