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


Участник
**

Группа: Участник
Сообщений: 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
Сообщение #3


Студент
*

Группа: Новичок
Сообщений: 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.4.2024, 13:25