Russian Qt Forum

Qt => Базы данных => Тема начата: Widget от Апрель 25, 2009, 22:17



Название: Не выполняется запрос QSqlQueryModel
Отправлено: 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();
}




Название: Re: Не выполняется запрос QSqlQueryModel
Отправлено: lit-uriy от Апрель 25, 2009, 22:24
версию Qt и СУБД, напиши.


Название: Re: Не выполняется запрос QSqlQueryModel
Отправлено: Widget от Апрель 25, 2009, 22:39
Qt-4.3.2, MySQL-5.0.45, ASPLinux-12

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


Название: Re: Не выполняется запрос QSqlQueryModel
Отправлено: Пантер от Апрель 26, 2009, 10:25
Если собираешься делать одно подключение, псевдоним не нужно использовать. Сам на это попадал, но почему так не знаю.


Название: Re: Не выполняется запрос QSqlQueryModel
Отправлено: lit-uriy от Апрель 26, 2009, 16:43
>>Если собираешься делать одно подключение, псевдоним не нужно использовать.
Пантер, я с только Огнптицем работаю, но такого не наблюдал. У меня в нескольких программах используется по одному соединению, и оно именованое.
может это косячёк драйвера QMYSQL?


Название: Re: Не выполняется запрос QSqlQueryModel
Отправлено: Widget от Апрель 26, 2009, 18:20
Проблема в том, что подключений должно быть несколько  :'(.

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


Название: Re: Не выполняется запрос QSqlQueryModel
Отправлено: Пантер от Апрель 26, 2009, 20:59
У меня косяк был с QSLite, делая один именованный коннект я получал облом, если два, то все нормально. Хотя, это было давно, может что-то изменилось, но с тех пор один коннект не именую.


Название: Re: Не выполняется запрос QSqlQueryModel
Отправлено: ритт от Апрель 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();
}


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


Название: Re: Не выполняется запрос QSqlQueryModel
Отправлено: ритт от Апрель 28, 2009, 17:38
для ясности - все соединения поименованные. соединение по умолчанию имеет захардкоденное имя, которое обычно опускается.
запросы (и модели на их основе) по умолчанию используют QSqlDatabase с именем по умолчанию.