Название: Нубский вопрос по глобальным переменным Отправлено: Zebar от Июль 21, 2010, 22:57 Народ, ногами не пинайте - C/C++ учил 14 лет назад еще в институте. Сейчас решил для себя повспоминать, попробовать освоить Qt. Но в 3 соснах заблудился.
Вопрос: Для программы нужно постоянное обращение к базе данных SQLite. Чтобы его каждый раз не создавать - хочу при запуске программы проинициализировать, открыть базу, при необходимости - создать ее со всей структурой, заполнить данными по умолчанию и т.д. А дальше - чтобы все остальные могли к базе обращаться и делать нужные действия. Для этого создал класс со своими методами: Код: #ifndef SQLDATA_H Как я понимаю, мне нужно объявить глобальную переменную типа класса в одном cpp модуле, а в других - указать, что эта переменная - extern. Но что-то у меня ни фига не выходит. В модуле sqldata.cpp пишу Код: SqlData DataBase; Код: extern SqlData DataBase; Код: DataBase.Init(); А вот в модуле другого окна пишу: Код: extern SqlData DataBase; Мне в логи мусорит QSqlQuery::exec: database not open Причем, по логам же, после инициализации. Где я напортачил? Название: Re: Нубский вопрос по глобальным переменным Отправлено: Авварон от Июль 22, 2010, 03:20 в статик переменной. Для коннекта к БД (насколько я знаю) используются плагины, которые еще не загружены на момент инициализации глобальной переменной (тк QApplication еще не создан)
Да, и при объявлении статик переменных extern не надо Название: Re: Нубский вопрос по глобальным переменным Отправлено: Zebar от Июль 22, 2010, 09:31 в статик переменной. <...> Да, и при объявлении статик переменных extern не надо То есть вместо extern написать static?Для коннекта к БД (насколько я знаю) используются плагины, которые еще не загружены на момент инициализации глобальной переменной (тк QApplication еще не создан) Нет, это не то. Смотрю через qDebug - сначала выполняется функция Init(), которая успешно отрабатывает, а затем уже в конструкторе BreedDialog выполняется запрос к уже открытой базе, на который я получаю ответ, что база не открыта.Может быть, я первоначально неправильно делаю? Какова типовая практика для таких случаев? Название: Re: Нубский вопрос по глобальным переменным Отправлено: crossly от Июль 22, 2010, 09:54 возможно вы не весь код показали... но я не вижу где же собственно происходит открытие БД... ??
Название: Re: Нубский вопрос по глобальным переменным Отправлено: Igors от Июль 22, 2010, 16:56 Да вроде все Вы правильно делаете. Попробуйте обратиться к базе после Init в том же файле, может extern здесь ни при чем
Название: Re: Нубский вопрос по глобальным переменным Отправлено: BRE от Июль 22, 2010, 17:21 Совсем все не правильно.
На момент создания объекта query, база данных должна быть уже открыта, т.к. используется конструктор: QSqlQuery::QSqlQuery ( const QString & query = QString(), QSqlDatabase db = QSqlDatabase() ) в котором используется соединение с БД по умолчанию. Класс QSqlDatabase специально создан таким образом, что бы в любом месте программы можно было получить соединение с БД. Код
Поэтому, нет необходимости (и даже вредно) делать запросы и подключения глобальными. Вредно потому, что в дальнейшем будет не возможно удалить соединение, т.к. будет постоянно существовать объект класса QSqlQuery, который им пользуется. Название: Re: Нубский вопрос по глобальным переменным Отправлено: Zebar от Июль 22, 2010, 21:09 Цитировать Совсем все не правильно. в общем, это все так и все понятно.На момент создания объекта query, база данных должна быть уже открыта, т.к. используется конструктор: QSqlQuery::QSqlQuery ( const QString & query = QString(), QSqlDatabase db = QSqlDatabase() ) в котором используется соединение с БД по умолчанию. Просто у меня есть QApplication a MainWindow w; И есть еще класс BreedDialog и я 1. Никак не соображу, где и когда создается объект класса BreedDialog (то есть еще окошко) 2. Во всех этих разных классах, да и еще в десятко еще не созданных форм, придется создавать запросы к базе. Поэтому, как я понимаю, так как у них нет ничего, общего, надо все-таки создать QSqlQuery, чтобы все им пользовались. Название: Re: Нубский вопрос по глобальным переменным Отправлено: Zebar от Июль 22, 2010, 21:19 Мне кажется, я разобрался.
Надо в любом месте создать QSqlDatabase по умолчанию и открыть его А потом из любого места QSqlQuery будет обращаться именно к нему. Название: Re: Нубский вопрос по глобальным переменным Отправлено: BRE от Июль 22, 2010, 21:26 Мне кажется, я разобрался. Не обязательно получать соединение по умолчанию с помощью метода QSqlDatabase::database, можно просто создавать объект QSqlQuery в нужном месте не указывая параметр db, тогда будет автоматически использоваться соединение по умолчанию. Главное, что бы это соединение уже было создано и база открыта.Надо в любом месте создать QSqlDatabase по умолчанию и открыть его А потом из любого места QSqlQuery будет обращаться именно к нему. Название: Re: Нубский вопрос по глобальным переменным Отправлено: lit-uriy от Июль 22, 2010, 21:26 Надо в любом месте создать QSqlDatabase по умолчанию и открыть его совершенно верноА потом из любого места QSqlQuery будет обращаться именно к нему. |