Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [QT4]QSqlQuery,QString, непонятное поведение 
V
    Опции темы
Acer
Дата 21.8.2009, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



БД: MSSQL
Qt 4.5.2
Windows XP sp2

Пытаюсь взять данные из MSSQL. Тип поля text.
Есть класс для работы с БД, который содержит метод для получения значения ячейки:
Код

QString RDatabase::value(int i, int r){
    if ( r != 0 ) dbq.next();
    return dbq.value( i ).toString();
}

dbq - QSqlQuery
Вызываю его таким образом:
Код

dt.resume_dmpt_long   = dbc.value( 12 );

12 - столбец в таблице БД.
dt - структура.
resume_dmpt_long - QString;
Запрос большой, все значения получаю нормально, а вот при получении этого значения(поле text) происходит непонятно что.
Например, запрос возвращает 2 строки. Все записывается в структуру нормально, если заэкранировать получение этого поля text.
Если не экранировать, то в цыкле получения данных происходит только первая итерация и затем выход из цыкла.
В чем тут может быть проблема?
PM MAIL   Вверх
Acer
Дата 21.8.2009, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Если взять вот такой вот код(выборка та же, что и в предыдущем посте), то корректно работает только до
        qDebug() << dbq.value( 11 );
QSqlQuery::numRowsAffected() возвращает 2
Если не получать 12-й элемент, то нормально проходит 2 итерации цыкла. А если с 12-м элементом, то только 1 итерация
Код

#include <QtCore/QCoreApplication>
#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlQuery>
#include <QtCore/QVariant>
#include <QtCore/QDebug>

int main( int argc, char *argv[] ){
    QCoreApplication app( argc, argv );
    QSqlDatabase dbs = QSqlDatabase::addDatabase( "QODBC", "test" );
    dbs.setDatabaseName( "DRIVER={SQL Server};Server=NEPTUNE;Database=Stat;Trusted_Connection=yes" );
    if ( dbs.open() ) qDebug() << "Connected";
    else qDebug() << "Connection fail";

    QSqlQuery dbq = dbs.exec( "SELECT * FROM Nedostachi WHERE Terminal LIKE('%3826%')" );
    for ( int i = 0; i < dbq.numRowsAffected(); i++ ){
        dbq.next();
        qDebug() << "-------------------: " << i;
        qDebug() << dbq.value( 0 );
        qDebug() << dbq.value( 1 );
        qDebug() << dbq.value( 2 );
        qDebug() << dbq.value( 3 );
        qDebug() << dbq.value( 4 );
        qDebug() << dbq.value( 5 );
        qDebug() << dbq.value( 6 );
        qDebug() << dbq.value( 7 );
        qDebug() << dbq.value( 8 );
        qDebug() << dbq.value( 9 );
        qDebug() << dbq.value( 10 );
        qDebug() << dbq.value( 11 );
        qDebug() << dbq.value( 12 );
    }

    dbs.close();
    //return app.exec();
}

PM MAIL   Вверх
korbian
Дата 21.8.2009, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Acer, вы уверены, что 12 элемент (естественно QSqlQuery нумерует элементы от 0) вообще существует?
Цитата(Acer @  21.8.2009,  12:19 Найти цитируемый пост)
 qDebug() << dbq.value( 12 );

к примеру, при несуществующем столбце такой вызов делает inactive сам запрос и следующий вызов  dbq.numRowsAffected() вернет -1 и цикл завершится.


--------------------
korbian ©
PM   Вверх
Acer
Дата 21.8.2009, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(korbian @ 21.8.2009,  12:15)
Acer, вы уверены, что 12 элемент (естественно QSqlQuery нумерует элементы от 0) вообще существует?
Цитата(Acer @  21.8.2009,  12:19 Найти цитируемый пост)
 qDebug() << dbq.value( 12 );

к примеру, при несуществующем столбце такой вызов делает inactive сам запрос и следующий вызов  dbq.numRowsAffected() вернет -1 и цикл завершится.

Столбцов всего 29. Конечно же 12-й существует.
Я уже решил проблему следующим образом:
Заменил конструкцию
Код

for ( int i = 0; i < dbq.numRowsAffected(); i++ ){
.....
}

на
Код

    int c = dbq.numRowsAffected();
    for ( int i = 0; i < c; i++ ){
    .........
    }

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

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

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


 




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


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

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