Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt4] Не выполняется запрос QSqlQueryModel, Если подключение с именем соединения 
:(
    Опции темы
cmi
  Дата 25.4.2009, 23:10 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 2.11.2008

Репутация: нет
Всего: нет



Проблема.
Не выполняется запрос QSqlQueryModel, если подключение происходит с именем соединения, функция createConnection_2().

В итоге идет ошибка:
QSqlQuery::exec: database not open

Если использую функцию createConnection_1(), запрос выполняется, ошибки нет.

Версии:
Qt-4.3.2, MySQL-5.0.45, ASPLinux-12

_______________________________________________________
Заранее благодарю, за конструктивные ответы.

Код

#include <QtGui>
#include <QtSql>

// ----------------------------------------------------------------------
bool createConnection_1()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName("localhost");
    db.setDatabaseName("");    
    db.setUserName("");
    db.setPassword("");

     if (!db.open()) {
          qDebug() << "Cannot open database:" << db.lastError();
          return false;
     }
     return true;
}

// ----------------------------------------------------------------------
bool createConnection_2()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL", "test");
    db.setHostName("localhost");
    db.setDatabaseName("");    
    db.setUserName("");
    db.setPassword("");

     if (!db.open()) {
          qDebug() << "Cannot open database:" << db.lastError();
          return false;
     }
     return true;
}

// ----------------------------------------------------------------------
int main(int argc, char** argv)
{
     QApplication app(argc, argv);

/*
     if (!createConnection_1()) {
        return -1;
     }
*/
     if (!createConnection_2()) {
        return -1;
     }

    QWidget Widget;
    QLabel* pLabel = new QLabel(&Widget);
    pLabel->move(10, 40);

     
    QSqlQueryModel model;
     model.setQuery("SHOW DATABASES;");

     if (model.lastError().isValid()) {
        qDebug() << model.lastError();
     }  

    QComboBox* pComboBox = new QComboBox(&Widget);
      pComboBox->setGeometry(10, 10, 280, 25);    
    pComboBox->setModel(&model); 

    int Count = pComboBox->count();
    QString String = "Count base(s) = " + QString::number(Count); 
    pLabel->setText(String);

    Widget.resize(300, 100);
     Widget.show();
    
     return app.exec();
}



PM MAIL   Вверх
zloyGamer
Дата 26.4.2009, 13:07 (ссылка) |   (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 24.2.2008
Где: аватар какает

Репутация: нет
Всего: нет



интересно...
bool createConnection_2()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL", "test"); 
    ...
} //я думаю что после этой строки деструктор QSqlDatabase уничтожает обьект db и соответственно все его соединения с бд

советую сохранить где нибудь эту переменную и выполнить запрос так:
model.setQuery("SHOW DATABASES;",db);

но как почти тож самое работает с createConnection_1 - я без понятия smile
PM MAIL   Вверх
cmi
Дата 26.4.2009, 14:54 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 2.11.2008

Репутация: нет
Всего: нет



zloyGamer
Сделал по Вашему совету, работает.

Но появилась проблема, при закрытии окна идёт сообщение:
QSqlDatabasePrivate::removeDatabase: connection 'test' is still in use, all queries will cease to work.


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

Код

QSqlDatabase db;

// ----------------------------------------------------------------------
bool createConnection_3()
{
    db = QSqlDatabase::addDatabase("QMYSQL", "test");
    ..................................................................
}

// ----------------------------------------------------------------------
int main(int argc, char** argv)
{
     QApplication app(argc, argv);

     if (!createConnection_3()) {
        return -1;
     }
    ..................................................................
     QSqlQueryModel model;
     model.setQuery("SHOW DATABASES;", db);
    ..................................................................

}



PM MAIL   Вверх
zloyGamer
Дата 26.4.2009, 19:02 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 24.2.2008
Где: аватар какает

Репутация: нет
Всего: нет



возможно тут:
QSqlQueryModel model;
...
QComboBox* pComboBox = new QComboBox(&Widget);
pComboBox->setModel(&model); 


QComboBox ты создаешь динамически, а QSqlQueryModel в стеке в мэйне, и привязываешь его к pComboBox который уничтожается приложением тока вместе с Widget.

а когда уничтожается model?
поидее должен после выхода из мэйна..., попробуй сделать это ЛИЧНО smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0819 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.