Russian Qt Forum
Ноябрь 25, 2024, 16:51 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: query.next()  (Прочитано 10098 раз)
olejOK17
Гость
« Ответ #15 : Март 09, 2015, 14:34 »

Может нет данных в таблице?
Не... query.exec(...) не true однако, то есть до выборки еще не добрались
.open() забыл. Теперь проблема в том что if (query.next()) только первый раз true. Только первая ячейка в таблице заполняется, а до остальных не доходит дело...
Записан
olejOK17
Гость
« Ответ #16 : Март 09, 2015, 16:08 »

По какой причине может не переходить ко второй записи?
Записан
PinkPanther
Самовар
**
Offline Offline

Сообщений: 169



Просмотр профиля
« Ответ #17 : Март 09, 2015, 16:51 »

По какой причине может не переходить ко второй записи?

А кто сказал, что query.next() == false? Веселый

Код оформлен так, что ошибка может возникнуть в любом месте, а предсказать его работу сможет лишь телепат. Думаю, query.next() исправно выдает true, а ячейки не заполняются по другой причине.

Лично мне в коде бросается в глаза две вещи:
1) Запрос к базе "SELECT *", а читается value(0). Отличный повод для сбоя - читаем нулевой столбец, как будто на 100% знаем, какой столбец в таблице нулевой. Если выбирается вся строка, делается запрос к ячейке по имени, value("имя_столбца"), а если нужен конкретный столбец, следует выбирать "SELECT имя_столбца" (и читать потом хоть по имени, хоть value(0));
2) QStandartItem *item объявляется до цикла, а в цикле переменной присваиваются все новые и новые значения, которые потом отдаются наружу... А если указатель передается по ссылке, если функция работает не с содержимым указателя, а с самим указателем? Зачем вообще нужна эта переменная? Следует либо каждый раз объявлять новый указатель внутри тела цикла, QStandartItem *item = new ... , либо вызывать model->setItem(i, j, new QStandartItem(text));
« Последнее редактирование: Март 09, 2015, 16:54 от PinkPanther » Записан

Эвтаназия - наше хобби!
olejOK17
Гость
« Ответ #18 : Март 09, 2015, 21:24 »

По какой причине может не переходить ко второй записи?

А кто сказал, что query.next() == false? Веселый

Код оформлен так, что ошибка может возникнуть в любом месте, а предсказать его работу сможет лишь телепат. Думаю, query.next() исправно выдает true, а ячейки не заполняются по другой причине.

Лично мне в коде бросается в глаза две вещи:
1) Запрос к базе "SELECT *", а читается value(0). Отличный повод для сбоя - читаем нулевой столбец, как будто на 100% знаем, какой столбец в таблице нулевой. Если выбирается вся строка, делается запрос к ячейке по имени, value("имя_столбца"), а если нужен конкретный столбец, следует выбирать "SELECT имя_столбца" (и читать потом хоть по имени, хоть value(0));
2) QStandartItem *item объявляется до цикла, а в цикле переменной присваиваются все новые и новые значения, которые потом отдаются наружу... А если указатель передается по ссылке, если функция работает не с содержимым указателя, а с самим указателем? Зачем вообще нужна эта переменная? Следует либо каждый раз объявлять новый указатель внутри тела цикла, QStandartItem *item = new ... , либо вызывать model->setItem(i, j, new QStandartItem(text));

Код:
for(int i=0; i<3; i++) {
      if (query.next()) {
        QString name = query.value("ThemeID").toString();
        model->setItem(i, 0, new QStandardItem(name));
        name = query.value("Name").toString();
        model->setItem(i, 1, new QStandardItem(name));
      }
    }
  Теперь так. Но почему же все-таки я не могу перейти к следующей записи после первой?
Записан
PinkPanther
Самовар
**
Offline Offline

Сообщений: 169



Просмотр профиля
« Ответ #19 : Март 09, 2015, 22:00 »

В таблице точно больше одной строки? Проверьте количество записей в таблице

query.clear();
if(!query.exec("SELECT COUNT(*) FROM Theme"))
  qDebug() << "Ошибка запроса: " << query.lastError().text();
else
{
  query.next();
  qDebug() << "Число строк в таблице: " << query.value(0).toInt();
}

Если выдает верное число строк, тогда затрудняюсь ответить.
Если неверное, ошибка в подключении к БД.

PS "ThemeID" - это текст? Если все-таки INT, логичнее выглядит QString::number(query.value("ThemeID").toInt());
Записан

Эвтаназия - наше хобби!
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.262 секунд. Запросов: 23.