R
Rus6lanMay 18, 2017, 2:54 p.m.

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;
We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!

14
D
  • May 18, 2017, 4:34 p.m.

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

"(:id_)"


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

:id_
    R
    • May 18, 2017, 4:46 p.m.

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

      Evgenii Legotckoi
      • May 19, 2017, 2:37 a.m.

      Вообще, вы делаете всё правильно. Но, возможно, это придурь парсера этих 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
        • May 19, 2017, 4:17 a.m.

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

          Ruslan Polupan
          • May 19, 2017, 6:24 a.m.

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

           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
            • May 19, 2017, 1:29 p.m.

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

              Ruslan Polupan
              • May 19, 2017, 2:57 p.m.

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

                R
                • May 19, 2017, 4:36 p.m.

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

                  Evgenii Legotckoi
                  • May 20, 2017, 2:09 a.m.

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

                  dialog->getFirstName()
                    R
                    • May 20, 2017, 12:12 p.m.

                    QString, getSholarship - bool, getBirthdate- QDate.

                      Evgenii Legotckoi
                      • May 20, 2017, 11:42 p.m.

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

                      indexes.at(0).row()

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

                      indexes.at(0).data()

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

                        R
                        • May 21, 2017, 6:04 a.m.

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

                          Evgenii Legotckoi
                          • May 21, 2017, 6:20 a.m.
                          • The answer was marked as a solution.

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

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

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

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

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

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

                            R
                            • May 21, 2017, 6:38 a.m.

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

                              Comments

                              Only authorized users can post comments.
                              Please, Log in or Sign up
                              AD

                              C ++ - Test 004. Pointers, Arrays and Loops

                              • Result:50points,
                              • Rating points-4
                              m

                              C ++ - Test 004. Pointers, Arrays and Loops

                              • Result:80points,
                              • Rating points4
                              m

                              C ++ - Test 004. Pointers, Arrays and Loops

                              • Result:20points,
                              • Rating points-10
                              Last comments
                              Evgenii Legotckoi
                              Evgenii LegotckoiOct. 31, 2024, 2:37 p.m.
                              Django - Lesson 064. How to write a Python Markdown extension Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                              A
                              ALO1ZEOct. 19, 2024, 8:19 a.m.
                              Fb3 file reader on Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                              ИМ
                              Игорь МаксимовOct. 5, 2024, 7:51 a.m.
                              Django - Lesson 064. How to write a Python Markdown extension Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                              d
                              dblas5July 5, 2024, 11:02 a.m.
                              QML - Lesson 016. SQLite database and the working with it in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                              k
                              kmssrFeb. 8, 2024, 6:43 p.m.
                              Qt Linux - Lesson 001. Autorun Qt application under Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                              Now discuss on the forum
                              Evgenii Legotckoi
                              Evgenii LegotckoiJune 24, 2024, 3:11 p.m.
                              добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                              t
                              tonypeachey1Nov. 15, 2024, 6:04 a.m.
                              google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                              NSProject
                              NSProjectJune 4, 2022, 3:49 a.m.
                              Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
                              9
                              9AnonimOct. 25, 2024, 9:10 a.m.
                              Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

                              Follow us in social networks