Russian Qt Forum

Qt => Базы данных => Тема начата: Urvin от Февраль 01, 2010, 20:11



Название: Подключить существующую БД к внешнему виджету
Отправлено: 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-окошке.

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


Название: Re: Подключить существующую БД к внешнему виджету
Отправлено: ecspertiza от Февраль 01, 2010, 20:48
Попробуй в своем виджете не создавать QSqlDatabase* database; А просто где нибудь в майн.цпп создай подключение к БД, а в своем виджете просто в QSqlQuery выполняй запрос.

Да и кстати таким образом void wgtManager::prepareDatabase(QSqlDatabase* db) ты не передаешь объект по ссылке ,а копируешь его, если я не ошибаюсь, соответственно и получается в новом виджете новый QSqlDatabase который неподключен к БД :)


Название: Re: Подключить существующую БД к внешнему виджету
Отправлено: Urvin от Февраль 01, 2010, 21:04
майнцпп... понимаю, что правильнее.. но QSqlQuery все равно придется подключать, боюсь, будут те же грабли. не?

В prepareDatabase передаю указатель на вполне себе существующий объект managerDatabase.. По всем канонам, должно было проканать :)


Название: Re: Подключить существующую БД к внешнему виджету
Отправлено: ecspertiza от Февраль 01, 2010, 22:02
если в майн.цпп создашь подключение к БД то потом в любом месте программы использовать QSqlQuery можешь так
Код:
QSqlQuery query;

if(!query.exec("Запрс"))
{
     qDebug() << "query error" << query.lastQuery() << query.lastError();
}


Название: Re: Подключить существующую БД к внешнему виджету
Отправлено: BRE от Февраль 01, 2010, 22:21
Нет необходимости вообще хранить какую либо ссылку на QSqlDatabase.
После вызова метода QSqlDatabase::addDatabase соединение помещается во внутренний кеш и может быть получено в любой момент через статический метод QSqlDatabase::database().
Создание рабочего экземпляра QSqlQuery возможно только после открытия базы данных.



Название: Re: Подключить существующую БД к внешнему виджету
Отправлено: CroCIV от Февраль 03, 2010, 14:11
Нет необходимости вообще хранить какую либо ссылку на QSqlDatabase.
После вызова метода QSqlDatabase::addDatabase соединение помещается во внутренний кеш и может быть получено в любой момент через статический метод QSqlDatabase::database().

Хо! А я индусский код пишу ))))


Название: Re: Подключить существующую БД к внешнему виджету
Отправлено: foxexe от Февраль 04, 2010, 11:08
но такие QSqlQuery у вас всё-таки не общий)
я думаю можно было бы просто запрос передать по ссылке и не мотаться с бд, если вы уж так хотите.
а по поводу бд во внутреннем кеше это правда , после addDatabase() можно создавать qSqlQuery просто вот так
Код
C++ (Qt)
QSqlQuery* q=new QSqlQuery();
ну если у вас только одна БД канеш