crossplatform.ru

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


  Ответ в QSqlQuery,QString
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
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++ ){

все заработало. Спасибо.
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, 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();
}
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.
Если не экранировать, то в цыкле получения данных происходит только первая итерация и затем выход из цыкла.
В чем тут может быть проблема?
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 28.3.2024, 15:17