R
Rus6lan19 мая 2017 г. 0:54

UPDATE query in QSql

Запрос не выполняется. Ошибок нет. Как только не пробовал

QModelIndexList indexes = ui->tableView->selectionModel()->selectedRows();
    QVariantList data;
    data.append(dialog->getFirstName());
    data.append(dialog->getLastName());
    data.append(dialog->getPatronymic());
    if(dialog->getScholarship()) data.append("true");
    else data.append("false");
    data.append(dialog->getBirthdate());
QSqlQuery query;
    QString das = data[0].toString();
    query.prepare("UPDATE " TABLE " SET FirstName=(:FirstName) WHERE id=:id_");
    query.bindValue("(:FirstName)", das);
    query.bindValue("(:id_)", indexes[0].row());
        if(!query.exec()){
                qDebug() << "error update" << TABLE;
                qDebug() << query.lastError().text();
                return false;
            } else {
                dialog->close();
                sqlModel->select();
                return true;
            }
            return false;
Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

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

14
D
  • 19 мая 2017 г. 2:34

Я конечно не профессионал, но вы биндите

"(:id_)"


Когда в запросе пишите

:id_
    R
    • 19 мая 2017 г. 2:46

    Ну да, но я по-разному пробовал, это видимо одна из вариаций была. Никак не работает, ни со скобками ни без. Вообще по-моему запрос не формируется нормально. Вот скрин.

      Evgenii Legotckoi
      • 19 мая 2017 г. 12:37

      Вообще, вы делаете всё правильно. Но, возможно, это придурь парсера этих SQL запросов в QSqlQuery. Попробуйте записать запрос с биндами так:

      query.prepare("UPDATE " TABLE " SET FirstName = :firstname WHERE id = :ID;");
      query.bindValue(":firstname", das);
      query.bindValue(":ID", indexes[0].row());
      query.exec();

      У меня некоторые запросы не работали без наличия точки с запятой в конце, либо пока я не подготавливал запрос сначала в QString, а потом уже этот подготовленный QString отправлял в QSqlQuery.

        R
        • 19 мая 2017 г. 14:17

        Не работает. Я главное не очень понимаю, как отслеживать, где именно произошла ошибка, справа в дебаге в поле executedQuery вопросы вместе id, firstname. Значит ли это что он не связал значения? На скриншоте я уместил еще и весь код. мб там что-то не так?

          Ruslan Polupan
          • 19 мая 2017 г. 16:24

          Только что сталкивался с похожей ситуацией.

           q.prepare("INSERT INTO stamps (range, number, status) VALUES (:range, :number, 1)");
          Отказывалось работать.
          Зашел в визуальный редактор БД добавил запись получил код запроса.
          В результате код ниже работает.
          
           q.prepare("INSERT INTO `cso`.`stamps` (`range`,`number`, `status`) VALUES (:range, :number, 1)");
            R
            • 19 мая 2017 г. 23:29

            А что этот код делает? Ну у меня insert работает нормально

              Ruslan Polupan
              • 20 мая 2017 г. 0:57

              Я к тому что сделай запрос к БД на прямую, потом скопирй в Qt. Парсинг запросов меня в тупик часто ставит.

                R
                • 20 мая 2017 г. 2:36

                Напрямую, это в клиенте СУБД? У меня это Sqlitestudio.

                  Evgenii Legotckoi
                  • 20 мая 2017 г. 12:09

                  А что возвращает метод getFirstName()? Объект какого типа?

                  dialog->getFirstName()
                    R
                    • 20 мая 2017 г. 22:12

                    QString, getSholarship - bool, getBirthdate- QDate.

                      Evgenii Legotckoi
                      • 21 мая 2017 г. 9:42

                      Тогда, разве только расставить апострофы в запросе для экранирования. Как сделано в одном из сообщений выше. Ну и переписать обращение к индексу QModelIndexList.

                      indexes.at(0).row()

                      Кстати, а вы уверены, что когда забираете QModelIndexList, и обращаетесь к первому индексу, то номер его строки соответствует ID? Поскольку row() возвращает номер строки в таблице, к которой вы выделили эту строку. И если у Вас сделано автоинкрементирование ID, и база уже многократно подвергалась изменениям, то скорее всего row() будет возвращать номер, отличный от ID, записи. В данном случае нужно забирать данные, через метод data()

                      indexes.at(0).data()

                      Заметьте, что в данном случае QModelIndex, к которому обращаетесь должен обязательно соответствовать той колонке, в которой находится ID.

                        R
                        • 21 мая 2017 г. 16:04

                        А чем at() лучше []? То есть я должен указать, число означающее в какой колонке у меня в таблице нужно поле. Я правильно понял?

                          Evgenii Legotckoi
                          • 21 мая 2017 г. 16:20
                          • Ответ был помечен как решение.

                          В принципе, разницы нет между at() и [], оператор [] выполняет тот же функционал, но обычно используют at().

                          Что касается поля. То нужно взять по строке индекс с той колонкой, где находится ID записи. Эту колонку можно сделать скрытой, чтобы она глаза не мозолила в таблице.

                          Тогда, допустим что ID находится в колонке под номером 0. В результате получается, что берём нужный ID индекс так.

                          model->index(indexes.at(0).row(), 0).data(); 

                          То есть, зная, из какой строки дёргать данные, берём из модели данных индекс, который содержит ID, по номеру колонки для ID и номер строки из выделения.

                          А после этого уже попытаться выполнить запрос. Возможно, что ID передаётся неправильный, поэтому ничего и не происходит, поскольку обновлять нечего, так как не существует запись с таким ID.

                            R
                            • 21 мая 2017 г. 16:38

                            Да , я спрятал id, потому что tableview итак нумерует. Спасибо, буду у компьютера попробую.

                              Комментарии

                              Только авторизованные пользователи могут публиковать комментарии.
                              Пожалуйста, авторизуйтесь или зарегистрируйтесь
                              Ua

                              Qt - Тест 001. Сигналы и слоты

                              • Результат:84баллов,
                              • Очки рейтинга4
                              Ua

                              Qt - Тест 001. Сигналы и слоты

                              • Результат:42баллов,
                              • Очки рейтинга-8
                              ОК

                              Qt - Тест 001. Сигналы и слоты

                              • Результат:47баллов,
                              • Очки рейтинга-6
                              Последние комментарии
                              ИМ
                              Игорь Максимов22 ноября 2024 г. 21:51
                              Django - Урок 017. Кастомизированная страница авторизации на Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                              Evgenii Legotckoi
                              Evgenii Legotckoi31 октября 2024 г. 23:37
                              Django - Урок 064. Как написать расширение для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                              A
                              ALO1ZE19 октября 2024 г. 17:19
                              Читалка fb3-файлов на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                              ИМ
                              Игорь Максимов5 октября 2024 г. 16:51
                              Django - Урок 064. Как написать расширение для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                              d
                              dblas55 июля 2024 г. 20:02
                              QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                              Сейчас обсуждают на форуме
                              f
                              firstlunoxod15 февраля 2025 г. 13:46
                              Рисование на QGraphicsScene при зажатой кнопке мыши Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
                              Дмитрий
                              Дмитрий3 февраля 2025 г. 16:24
                              Создание deb-пакета. Как создать ярлык на рабочем столе после установки собственного deb-пакета? Всем привет. Сделал свой deb-пакет с программой. Всё устанавливается и работает. Ставлю по пути /usr/bin/my_application. Как для пользователя при установке пакета сразу создать ярлык на раб…
                              NW
                              Nayo Wai30 января 2025 г. 19:22
                              не запускается компьютер!!! Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
                              n
                              nkly3 января 2025 г. 12:52
                              Нужно запретить перемещение только некоторых итемов, остальные перемещать можно. Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
                              M
                              Marsel17 августа 2023 г. 0:26
                              OAuth2.0 через VK, получение email Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.

                              Следите за нами в социальных сетях