crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> QSqlQuery,QString, непонятное поведение
reich
  опции профиля:
сообщение 21.8.2009, 10:43
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 10
Регистрация: 31.7.2009
Пользователь №: 966

Спасибо сказали: 1 раз(а)




Репутация:   0  


БД: 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.
Если не экранировать, то в цыкле получения данных происходит только первая итерация и затем выход из цыкла.
В чем тут может быть проблема?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
reich
  опции профиля:
сообщение 21.8.2009, 11:19
Сообщение #2


Студент
*

Группа: Новичок
Сообщений: 10
Регистрация: 31.7.2009
Пользователь №: 966

Спасибо сказали: 1 раз(а)




Репутация:   0  


Если взять вот такой вот код(выборка та же, что и в предыдущем посте), то корректно работает только до
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();
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MoPDoBoPoT
  опции профиля:
сообщение 21.8.2009, 13:11
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 172
Регистрация: 7.5.2009
Из: Москва
Пользователь №: 738

Спасибо сказали: 44 раз(а)




Репутация:   9  


Так столбцов все-таки 13 или 12? Если 12, то ты обращаешься к несуществующему (нумерация с 0 же). Что выдаст это:
qDebug() << dbq.record().count();


И на будущее. Не пользуйся такими конструкциями:
Цитата(reich @ 21.8.2009, 12:19) *
for ( int i = 0; i < dbq.numRowsAffected(); i++ )

Здесь функция numRowsAffected() будет вычисляться при каждой итерации. Именно в этой ситуации либо инициализируй переменную до цикла, либо используй while(dbq.next()).
Во-вторых функция numRowsAffected() не для SELECT-Statement, а для UPDATE, DELETE... Для SELECT есть size(), если драйвером поддерживается
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
reich
  опции профиля:
сообщение 21.8.2009, 13:19
Сообщение #4


Студент
*

Группа: Новичок
Сообщений: 10
Регистрация: 31.7.2009
Пользователь №: 966

Спасибо сказали: 1 раз(а)




Репутация:   0  


Цитата(MoPDoBoPoT @ 21.8.2009, 13:02) *
Так столбцов все-таки 13 или 12? Если 12, то ты обращаешься к несуществующему (нумерация с 0 же). Что выдаст это:
qDebug() << dbq.record().count();

столбцов всего 29. Но после обращения к 12-му все идет коту под хвост

Цитата(MoPDoBoPoT @ 21.8.2009, 13:11) *
И на будущее. Не пользуйся такими конструкциями:
Цитата(reich @ 21.8.2009, 12:19) *
for ( int i = 0; i < dbq.numRowsAffected(); i++ )

Здесь функция numRowsAffected() будет вычисляться при каждой итерации. Именно в этой ситуации либо инициализируй переменную до цикла, либо используй while(dbq.next()).
Во-вторых функция numRowsAffected() не для SELECT-Statement, а для UPDATE, DELETE... Для SELECT есть size(), если драйвером поддерживается

При моем запросе size() возвращает -1

MoPDoBoPoT, изменил конструкцию с
    for ( int i = 0; i < dbq.numRowsAffected(); i++ ){

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

все заработало. Спасибо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.3.2024, 23:10