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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Подключить существующую БД к внешнему виджету  (Прочитано 3972 раз)
Urvin
Гость
« : Февраль 01, 2010, 20:11 »

Ситуация такая: в главной форме создается и используется объект базы данных:
Код
C++ (Qt)
QSqlDatabase managerDatabase;
Объекты запросов типа
Код
C++ (Qt)
QSqlQuery query(managerDatabase);
Нормально создаются и исполняются.

Теперь я хочу сделать собственный виджет, где бы использовалась уже подключенная БД.
Объект запросов QSqlQuery должен быть общим, чтобы постоянно память не гонять.
Соответственно, в описании класса имеем
Код
C++ (Qt)
private:
   QSqlDatabase* database;
   QSqlQuery* query;
Для передачи указателя на подключенную БД в новом виджете я создал следующую функцию:
Код
C++ (Qt)
void wgtManager::prepareDatabase(QSqlDatabase* db)
{
   database = db;
   query = new QSqlQuery(*db);
}
Эта функция вызывается из кода главной формы в конструкторе, но после создания пользовательского интерфейса (экземпляр пользовательского виджета добавлен в *.ui):
Код
C++ (Qt)
ui->setupUi(this);
ui->wgmManager->prepareDatabase(&managerDatabase);

При попытке использовать query в пользовательском виджете я получаю "QSqlQuery::exec: database not open" в debug-окошке.

Что я упустил? Ведь код выглядит вполне стандартно..
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #1 : Февраль 01, 2010, 20:48 »

Попробуй в своем виджете не создавать QSqlDatabase* database; А просто где нибудь в майн.цпп создай подключение к БД, а в своем виджете просто в QSqlQuery выполняй запрос.

Да и кстати таким образом void wgtManager::prepareDatabase(QSqlDatabase* db) ты не передаешь объект по ссылке ,а копируешь его, если я не ошибаюсь, соответственно и получается в новом виджете новый QSqlDatabase который неподключен к БД Улыбающийся
« Последнее редактирование: Февраль 01, 2010, 20:51 от ecspertiza » Записан
Urvin
Гость
« Ответ #2 : Февраль 01, 2010, 21:04 »

майнцпп... понимаю, что правильнее.. но QSqlQuery все равно придется подключать, боюсь, будут те же грабли. не?

В prepareDatabase передаю указатель на вполне себе существующий объект managerDatabase.. По всем канонам, должно было проканать Улыбающийся
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #3 : Февраль 01, 2010, 22:02 »

если в майн.цпп создашь подключение к БД то потом в любом месте программы использовать QSqlQuery можешь так
Код:
QSqlQuery query;

if(!query.exec("Запрс"))
{
     qDebug() << "query error" << query.lastQuery() << query.lastError();
}
Записан
BRE
Гость
« Ответ #4 : Февраль 01, 2010, 22:21 »

Нет необходимости вообще хранить какую либо ссылку на QSqlDatabase.
После вызова метода QSqlDatabase::addDatabase соединение помещается во внутренний кеш и может быть получено в любой момент через статический метод QSqlDatabase::database().
Создание рабочего экземпляра QSqlQuery возможно только после открытия базы данных.

Записан
CroCIV
Гость
« Ответ #5 : Февраль 03, 2010, 14:11 »

Нет необходимости вообще хранить какую либо ссылку на QSqlDatabase.
После вызова метода QSqlDatabase::addDatabase соединение помещается во внутренний кеш и может быть получено в любой момент через статический метод QSqlDatabase::database().

Хо! А я индусский код пишу ))))
Записан
foxexe
Гость
« Ответ #6 : Февраль 04, 2010, 11:08 »

но такие QSqlQuery у вас всё-таки не общий)
я думаю можно было бы просто запрос передать по ссылке и не мотаться с бд, если вы уж так хотите.
а по поводу бд во внутреннем кеше это правда , после addDatabase() можно создавать qSqlQuery просто вот так
Код
C++ (Qt)
QSqlQuery* q=new QSqlQuery();
ну если у вас только одна БД канеш
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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