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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Не выполняется запрос QSqlQueryModel  (Прочитано 6232 раз)
Widget
Гость
« : Апрель 25, 2009, 22:17 »

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

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

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

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

Код:
#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();
}


Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Апрель 25, 2009, 22:24 »

версию Qt и СУБД, напиши.
Записан

Юра.
Widget
Гость
« Ответ #2 : Апрель 25, 2009, 22:39 »

Qt-4.3.2, MySQL-5.0.45, ASPLinux-12

версию Qt и СУБД, напиши.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Апрель 26, 2009, 10:25 »

Если собираешься делать одно подключение, псевдоним не нужно использовать. Сам на это попадал, но почему так не знаю.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #4 : Апрель 26, 2009, 16:43 »

>>Если собираешься делать одно подключение, псевдоним не нужно использовать.
Пантер, я с только Огнптицем работаю, но такого не наблюдал. У меня в нескольких программах используется по одному соединению, и оно именованое.
может это косячёк драйвера QMYSQL?
Записан

Юра.
Widget
Гость
« Ответ #5 : Апрель 26, 2009, 18:20 »

Проблема в том, что подключений должно быть несколько  Плачущий.

Если собираешься делать одно подключение, псевдоним не нужно использовать. Сам на это попадал, но почему так не знаю.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #6 : Апрель 26, 2009, 20:59 »

У меня косяк был с QSLite, делая один именованный коннект я получал облом, если два, то все нормально. Хотя, это было давно, может что-то изменилось, но с тех пор один коннект не именую.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
ритт
Гость
« Ответ #7 : Апрель 28, 2009, 09:39 »

мужики, вы чего? какая связь между именем соединения и работоспособностью запроса? скажу по секрету, имя используется только для поиска соединения в хэше.

Код:
#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);

QSqlQueryModel model;
/*
    if (!createConnection_1()) {
        return -1;
    }
    else
    {
        model.setQuery("SHOW DATABASES;");
    }

*/
    if (!createConnection_2()) {
        return -1;
    }
    else
    {
        model.setQuery("SHOW DATABASES;", QSqlDatabase::database("test"));
    }

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

   
    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();
}
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #8 : Апрель 28, 2009, 17:11 »

2 Константин, тыб всё таки по явнее (есть такое слово или нет?) писал бы. Я вот даже сходу и не понял разницы. Хотя она вобщем-то должна быть очевидна:
Если используется соединение по умолчанию, то запрос устанавливается так:
Код:
model.setQuery("SHOW DATABASES;");
Если используется именованное соединение, то  запрос устанавливается так:
Код:
model.setQuery("SHOW DATABASES;", QSqlDatabase::database("test"));
т.е. указывается имя соединения.
Записан

Юра.
ритт
Гость
« Ответ #9 : Апрель 28, 2009, 17:38 »

для ясности - все соединения поименованные. соединение по умолчанию имеет захардкоденное имя, которое обычно опускается.
запросы (и модели на их основе) по умолчанию используют QSqlDatabase с именем по умолчанию.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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