ДК
23 апреля 2020 г. 15:11

SQL take a value

SQLite

Привет. Не получается забрать значение с query.
Вот такой метод отрабатывает верно, то есть, если у меня поле weight = 3, то 3 и вернет

  1. int ReportDataBase::getWeight(const int reportID) const
  2. {
  3. int weight = 0;
  4. QSqlQuery query(db);
  5. QString queryString = QString("SELECT weight FROM reports WHERE id=")+QString::number(reportID);
  6. query.prepare(queryString);
  7. query.exec(queryString);
  8. if(query.isActive()) {
  9. if(query.next()) {
  10. const QSqlRecord record = query.record();
  11. weight = query.value(record.indexOf("weight")).toInt();
  12. }
  13. }
  14. return weight;
  15. }

но вот аналогичный метод, уже пишет ошибку
QSqlQuery::value: not positioned on a valid record
в строке
query.value(record.indexOf("weight")).toInt()

  1. int ReportDataBase::getLowerWeight() const
  2. {
  3. int weight = 0;
  4. QSqlQuery query(db);
  5. QString queryString = QString("SELECT MAX(weight) FROM reports");
  6. query.prepare(queryString);
  7. query.exec(queryString);
  8. if(query.isActive()) {
  9. if(query.next()) {
  10. const QSqlRecord record = query.record();
  11. weight = query.value(record.indexOf("weight")).toInt();
  12. }
  13. }
  14. return weight;
  15. }

при чем, в отладчике я вижу нужное мне значение, вот оно

но всё-равно ставит weight = 0, как так-то? код же аналогичный! скрипт рабочий! я в SQLite проверял этот запрос.

3

Вам это нравится? Поделитесь в социальных сетях!

5
Evgenii Legotckoi
  • 23 апреля 2020 г. 15:21
  • Ответ был помечен как решение.

Добрый день

Есть мысль, что там нужно имя задать для результата. Скорее всего возвращается результат выполнения с именем, отличным от weight

Напишите так

  1. int ReportDataBase::getLowerWeight() const
  2. {
  3. int weight = 0;
  4. QSqlQuery query(db);
  5. QString queryString = QString("SELECT MAX(weight) AS weight_result FROM reports");
  6. query.prepare(queryString);
  7. query.exec(queryString);
  8. if(query.isActive()) {
  9. if(query.next()) {
  10. const QSqlRecord record = query.record();
  11. weight = query.value(record.indexOf("weight_result")).toInt();
  12. }
  13. }
  14. return weight;
  15. }
    ДК
    • 23 апреля 2020 г. 15:27

    огромное вам спасибо! я вчера сидел с этой фигней часов до 11 вечера и потом в отлачике нашел ошибку, ну думаю, делов на 5 минут, решил лечь спать и проснуться сегодня пораньше и доделать успеть. В итоге, с 7 утра уже часов 5, как слепой котенок наугад, идеи все кончились и гугл тоже) А так работает! Еще раз спасибо!

      Evgenii Legotckoi
      • 23 апреля 2020 г. 15:31

      Внутренние функции SQL типо max, min генерируют имена для колонок наподобие max_weight.
      Уверен, что если написать так, то тоже заработает

      1. int ReportDataBase::getLowerWeight() const
      2. {
      3. int weight = 0;
      4. QSqlQuery query(db);
      5. QString queryString = QString("SELECT MAX(weight) FROM reports");
      6. query.prepare(queryString);
      7. query.exec(queryString);
      8. if(query.isActive()) {
      9. if(query.next()) {
      10. const QSqlRecord record = query.record();
      11. weight = query.value(record.indexOf("max_weight")).toInt();
      12. }
      13. }
      14. return weight;
      15. }

      Ваш запрос генерирует новую таблицу, а не просто забирает пачку записей из существующих, поэтому нужно либо явно задавать имя колонки, либо понимать логику генерирования имён новых колонок в зависимости от внутренних функций SQL

        ДК
        • 23 апреля 2020 г. 15:37

        спасибо за пояснения!

          ИП
          • 23 апреля 2020 г. 15:52
          1. int ReportDataBase::getLowerWeight() const
          2. {
          3. //int weight = 0;
          4. QSqlQuery query(db);
          5. QString queryString = QString("SELECT MAX(weight) AS max_weight FROM reports");
          6. //query.prepare(queryString);//подготовленный запрос здесь не нужен
          7. //query.exec(queryString);
          8. if(query.exec(queryString))
          9. {
          10. if(query.first()) //если в результате только одна строка
          11. {
          12. //const QSqlRecord record = query.record();
          13. return query.value("max_weight").toInt();
          14. }
          15. else
          16. {}//здесь можно обработать ситуацию когда таблица пустая или запрос сработал и вернул пустую строку
          17. }
          18. else
          19. {} //здесь можно обработать ошибку запроса
          20. return -1;
          21. }

            Комментарии

            Только авторизованные пользователи могут публиковать комментарии.
            Пожалуйста, авторизуйтесь или зарегистрируйтесь
            • Последние комментарии
            • Evgenii Legotckoi
              16 апреля 2025 г. 17:08
              Благодарю за отзыв. И вам желаю всяческих успехов!
            • IscanderChe
              12 апреля 2025 г. 17:12
              Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
            • AK
              1 апреля 2025 г. 11:41
              Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
            • Evgenii Legotckoi
              9 марта 2025 г. 21:02
              К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
            • VP
              9 марта 2025 г. 16:14
              Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…