Реклама

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;

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

"(:id_)"


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

:id_

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

Screenshot_4.png

Вообще, вы делаете всё правильно. Но, возможно, это придурь парсера этих 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.

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

Screenshot_5.png

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

 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)");

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

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

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

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

dialog->getFirstName()

QString, getSholarship - bool, getBirthdate- QDate.

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

indexes.at(0).row()

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

indexes.at(0).data()

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

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

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

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

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

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

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

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

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

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

Реклама

Ответы

Только авторизованные пользователи могут отвечать на форуме.
Пожалуйста, Авторизуйтесь или Зарегистрируйтесь
  • BoostEX
  • 17 августа 2017 г. 16:45

C++ - Тест 001. Первая программа и типы данных

  • Результат - 73 баллов
  • Nordman
  • 15 августа 2017 г. 20:40

C++ - Тест 005. Структуры и Классы

  • Результат - 66 баллов

C++ - Тест 002. Константы

  • Результат - 33 баллов
Последние комментарии
  • EVILEG
  • 17 августа 2017 г. 18:33

Qt/C++ - Урок 069. Шифрование методом XOR

Не обратил внимания на это, Проверял с большим текстом.. По идее не должно.

Qt/C++ - Урок 069. Шифрование методом XOR

Шифрует/дешифрует текст от 8 символов, так и должно быть?

  • EVILEG
  • 15 августа 2017 г. 20:32

Qt/C++ - Урок 048. QThread - работа с потоками с помощью moveToThread

Нууу... тут уже вопрос к самому Qt4.8. Если честно, идей нет, да и копаться в deprecated коде желания тоже нет.

  • t000r
  • 15 августа 2017 г. 19:49

Qt/C++ - Урок 048. QThread - работа с потоками с помощью moveToThread

В qt5.6 всё нормально заработало. С 4.8 - нет

  • EVILEG
  • 15 августа 2017 г. 17:44

Qt/C++ - Урок 050. Логирование событий Qt приложения в текстовый файл

Я полистал информацию в интернетах, вроде как кто-то пытается подружить его с Qt5, но успешных результатов не нашёл. Да и на сайте как-то не заметно информации о том, что конкретно ему нужно, ...

Сейчас обсуждают на форуме

Сборка Qt / C++ проекта под windows и linux

вы имели ввиду это? если да, то как то не работает((( #include <iostream>#include <bitset> // заголовочный файл битовых полей#include <iomanip> // для манип...

  • alex_lip
  • 17 августа 2017 г. 19:11

Я только учусь..(как правильно присвоить значение объекту другого класса)

А что вы думаете про директиву friend ? class A { friend void B::changeValue(); private: int _value;};class B { void changeValue() { a-&...

  • EVILEG
  • 16 августа 2017 г. 13:38

Перевод кодировки строки из windows 1251 в Utf-8

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

  • EVILEG
  • 15 августа 2017 г. 17:09

Переключение между Qt::WindowMaximized и Qt::WindowNoState при фиксированном размере окна.

Согласен - это велосипед, но это гораздо меньше, чем отключить оформление окна и написать своё оформление )) Например, как здесь .

  • EVILEG
  • 13 августа 2017 г. 13:51

SQLITE speed up

Заполняете в цикле из объекта query? Можете показать тот кусок кода, где выполняете эти манипуляции? Ускорить код разве только некоторым манипуляциями с указателями или ссылками, н...