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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Qt 4.1.4]Соединение с БД  (Прочитано 9226 раз)
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
Записан
Mikhail
Программист
*****
Offline Offline

Сообщений: 587


Просмотр профиля
« Ответ #1 : Апрель 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 есть полностью рабочий пример.
Подключись с его помощью к твоей базе и выдай запрос.
Либо получишь ответ: содержимое таблицы, либо получишь сообщение об ошибке.
От него и пляши.
В примере можно посмотреть структуру базы и содержимое таблиц.
Записан
Примерный ученик
Бывалый
*****
Offline Offline

Сообщений: 450


И это не всегда помогает


Просмотр профиля
« Ответ #2 : Апрель 08, 2008, 06:56 »

Если не ошибаюсь, то в

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

нужно писать

QSqlDatabase db = QSqlDatabase::addDatabase("QODBC3");
« Последнее редактирование: Апрель 08, 2008, 06:58 от tmikola » Записан

Как мало времени и как много нужно узнать
Deiv
Гость
« Ответ #3 : Апрель 11, 2008, 07:23 »

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

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

Сообщений: 2901



Просмотр профиля WWW
« Ответ #4 : Апрель 11, 2008, 12:20 »

Если не ошибаюсь, то в

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

нужно писать

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


откуда ветер?
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Примерный ученик
Бывалый
*****
Offline Offline

Сообщений: 450


И это не всегда помогает


Просмотр профиля
« Ответ #5 : Апрель 11, 2008, 21:18 »

QODBC3

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

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

Как мало времени и как много нужно узнать
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #6 : Апрель 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
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Примерный ученик
Бывалый
*****
Offline Offline

Сообщений: 450


И это не всегда помогает


Просмотр профиля
« Ответ #7 : Апрель 11, 2008, 21:46 »

Извиняюсь, пока работаю только с QT 3

Хотя, хоть убейте, не понимаю, зачем было менять названия?
Что бы запутать при переходе на новую версию?
« Последнее редактирование: Апрель 11, 2008, 21:49 от tmikola » Записан

Как мало времени и как много нужно узнать
s.c.o.r.p.i.o.n.
Гость
« Ответ #8 : Ноябрь 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.
Записан
BaltikS
Гость
« Ответ #9 : Ноябрь 12, 2009, 14:50 »

QMessageBox::Critical пишется так QMessageBox::сritical
Записан
s.c.o.r.p.i.o.n.
Гость
« Ответ #10 : Ноябрь 12, 2009, 14:55 »

спасибо  Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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