ДК
April 23, 2020, 3:11 p.m.

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
  • April 23, 2020, 3:21 p.m.
  • The answer was marked as a solution.

Добрый день

Есть мысль, что там нужно имя задать для результата. Скорее всего возвращается результат выполнения с именем, отличным от 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. }
    ДК
    • April 23, 2020, 3:27 p.m.

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

      Evgenii Legotckoi
      • April 23, 2020, 3:31 p.m.

      Внутренние функции 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

        ДК
        • April 23, 2020, 3:37 p.m.

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

          ИП
          • April 23, 2020, 3:52 p.m.
          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. }

            Comments

            Only authorized users can post comments.
            Please, Log in or Sign up
            • Last comments
            • Evgenii Legotckoi
              April 16, 2025, 5:08 p.m.
              Благодарю за отзыв. И вам желаю всяческих успехов!
            • IscanderChe
              April 12, 2025, 5:12 p.m.
              Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
            • AK
              April 1, 2025, 11:41 a.m.
              Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
            • Evgenii Legotckoi
              March 9, 2025, 9:02 p.m.
              К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
            • VP
              March 9, 2025, 4:14 p.m.
              Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…