Russian Qt Forum

Qt => Базы данных => Тема начата: Jager-ntr от Апрель 07, 2008, 11:07



Название: [Qt 4.1.4]Соединение с БД
Отправлено: Jager-ntr от Апрель 07, 2008, 11:07
Здравствуйте. При соединении с БД у меня возникла следущая проблема:
соединение открывается, структура полей таблицы возвращается правильной,но ни одной строки результата запроса нет,т.е. query.exec(strQuery) возвращает -1 все время. В таблице данные содержатся точно,на другом языке программирования код с той же самой логикой возвращает результат как надо.
Код:
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
    db.setDatabaseName("mydb");
    db.setUserName("uid");
    db.setPassword("pwd");
    bool connected = db.open();
    if (!connected)
    {
        QMessageBox::critical(0, QObject::tr("Database Error"), db.lastError().text());
        return false;
    }
    QSqlQuery query;
    QString strQuery = "select * from mytable";
    if(!query.exec(strQuery))
        QMessageBox::critical(0, "Error", "Loading data failed", QMessageBox::Ok|QMessageBox::Default|QMessageBox::Escape, 0, 0);
    else
    {
        while(query.next())
        {
            // код....
        }
    }
ОС Windows XP
СУБД IBM Informix 9.4
Драйвер IBM Informix 3.82


Название: Re: [Qt 4.1.4]Соединение с БД
Отправлено: Mikhail от Апрель 07, 2008, 19:05
Здравствуйте. При соединении с БД у меня возникла следущая проблема:
соединение открывается, структура полей таблицы возвращается правильной,но ни одной строки результата запроса нет,т.е. query.exec(strQuery) возвращает -1 все время. В таблице данные содержатся точно,на другом языке программирования код с той же самой логикой возвращает результат как надо.
Код:
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
    db.setDatabaseName("mydb");
    db.setUserName("uid");
    db.setPassword("pwd");
    bool connected = db.open();
    if (!connected)
    {
        QMessageBox::critical(0, QObject::tr("Database Error"), db.lastError().text());
        return false;
    }
    QSqlQuery query;
    QString strQuery = "select * from mytable";
    if(!query.exec(strQuery))
        QMessageBox::critical(0, "Error", "Loading data failed", QMessageBox::Ok|QMessageBox::Default|QMessageBox::Escape, 0, 0);
    else
    {
        while(query.next())
        {
            // код....
        }
    }
ОС Windows XP
СУБД IBM Informix 9.4
Драйвер IBM Informix 3.82

В $(QTDIR)/demos/sqlbrowser есть полностью рабочий пример.
Подключись с его помощью к твоей базе и выдай запрос.
Либо получишь ответ: содержимое таблицы, либо получишь сообщение об ошибке.
От него и пляши.
В примере можно посмотреть структуру базы и содержимое таблиц.


Название: Re: [Qt 4.1.4]Соединение с БД
Отправлено: Примерный ученик от Апрель 08, 2008, 06:56
Если не ошибаюсь, то в

QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");

нужно писать

QSqlDatabase db = QSqlDatabase::addDatabase("QODBC3");


Название: Re: [Qt 4.1.4]Соединение с БД
Отправлено: Deiv от Апрель 11, 2008, 07:23
Здравствуйте. При соединении с БД у меня возникла следущая проблема:
соединение открывается, структура полей таблицы возвращается правильной,но ни одной строки результата запроса нет,т.е. query.exec(strQuery) возвращает -1 все время. В таблице данные содержатся точно,на другом языке программирования код с той же самой логикой возвращает результат как надо.
...
ОС Windows XP
СУБД IBM Informix 9.4
Драйвер IBM Informix 3.82

При создании источника данных ODBC используя драйвер информикс необходимо знать - что по дефолту драйвер будет предоставлять только однонаправленные курсоры. Которые QT не переваривает. В настройках источника в закладке Адвансед нужно поставить галку для Scrollable Cursor.


Название: Re: [Qt 4.1.4]Соединение с БД
Отправлено: pastor от Апрель 11, 2008, 12:20
Если не ошибаюсь, то в

QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");

нужно писать

QSqlDatabase db = QSqlDatabase::addDatabase("QODBC3");


откуда ветер?


Название: Re: [Qt 4.1.4]Соединение с БД
Отправлено: Примерный ученик от Апрель 11, 2008, 21:18
QODBC3

так драйвер называется...

Коммерческая версия Qt включает в себя следующий набор драйверов: QODBC3 (ODBC), QOCI8 (Oracle), QTDS7 (Sybase Adaptive Server), QPSQL7 (PostgreSQL), QMYSQL3 (MySQL), and QDB2 (IBM DB2).


Название: Re: [Qt 4.1.4]Соединение с БД
Отправлено: pastor от Апрель 11, 2008, 21:40
QODBC3

так драйвер называется...

Коммерческая версия Qt включает в себя следующий набор драйверов: QODBC3 (ODBC), QOCI8 (Oracle), QTDS7 (Sybase Adaptive Server), QPSQL7 (PostgreSQL), QMYSQL3 (MySQL), and QDB2 (IBM DB2).

Эти имена драйверов БД справедливы для Qt 3

http://doc.trolltech.com/3.3/qsqldatabase.html

а у автора темы Qt 4.1.4

http://doc.trolltech.com/4.1/qsqldatabase.html


Название: Re: [Qt 4.1.4]Соединение с БД
Отправлено: Примерный ученик от Апрель 11, 2008, 21:46
Извиняюсь, пока работаю только с QT 3

Хотя, хоть убейте, не понимаю, зачем было менять названия?
Что бы запутать при переходе на новую версию?


Название: Re: [Qt 4.1.4]Соединение с БД
Отправлено: s.c.o.r.p.i.o.n. от Ноябрь 12, 2009, 14:18
Хочу вывести ошибку при неудачном соединении к БД, делаю это таким образом
Код
C++ (Qt)
   bool connected = db.open();
   if(!connected) {
       QMessageBox::Critical(
           0,                      
           QObject::tr("Database Error"),  
           db.lastError().text());
       return false;
   }
 

При компиляции выдат ошибку error: ‘(QMessageBox::Icon)3u’ cannot be used as a function.


Название: Re: [Qt 4.1.4]Соединение с БД
Отправлено: BaltikS от Ноябрь 12, 2009, 14:50
QMessageBox::Critical пишется так QMessageBox::сritical


Название: Re: [Qt 4.1.4]Соединение с БД
Отправлено: s.c.o.r.p.i.o.n. от Ноябрь 12, 2009, 14:55
спасибо  :)