Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Разработка баз данных _ QSqlQuery,QString

Автор: reich 21.8.2009, 10:43

БД: 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

Если взять вот такой вот код(выборка та же, что и в предыдущем посте), то корректно работает только до
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

Так столбцов все-таки 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

Цитата(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++ ){

все заработало. Спасибо.

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)