M
MadBear54115 травня 2017 р. 21:33

Проверка наличия записи в БД при выполнении запроса

Qt, SQL

Есть программа в которой происходит добавление данных в базу SQL. Необходимо реализовать функцию проверки наличия записи при нажатии кнопки "Сохранить", если запись есть должен выполняться запрос Update, в ином случае выполняется запрос Insert. Как это реализовать?

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

Вам це подобається? Поділіться в соціальних мережах!

27
Evgenii Legotckoi
  • 16 травня 2017 р. 00:35

Можно через QSqlQuery и логический оператор EXISTS сделать.

QSqlQuery query;
// Проверка наличия записей по дате
QString str = QString("SELECT EXISTS (SELECT * FROM TableExample WHERE Date = '%1');").arg("2017-08-03");
query.prepare(str);
query.exec();
query.next();

/* Если запись существует, то вызывается
 * информационное сообщение
 * */
if(query.value(0) != 0){
    QMessageBox::information(this, trUtf8("Error"), trUtf8("Record is exists"));
}
else
{
    // ToDo something
}

Также есть статья с проверкой наличия записей в базе данных

    M
    • 16 травня 2017 р. 06:02

    Вопрос: есть способ обновить модель QSqlQeuryModel?

      Evgenii Legotckoi
      • 16 травня 2017 р. 10:09

      Выполнить заново setQuery() с последней применённой QSqlQuery, с помощью метода query()

      model->setQuery(model->query());
        M
        • 16 травня 2017 р. 21:14

        если использовать model->setQuery(model->query().lastQuery()); ? я так понял что в данном случае он вызывает последний запрос

          Evgenii Legotckoi
          • 17 травня 2017 р. 00:04

          QSqlQuery всегда содержит только последний запрос, а lastQuery() возвращает этот запрос в виде строки QString, так что, если база данных используется одна, то разницы нет, в каком виде будет передаваться запрос в model->setQuery()

            M
            • 17 травня 2017 р. 05:29

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

              Evgenii Legotckoi
              • 17 травня 2017 р. 05:56

              Проблема в том, как вы применили код, который я вам привёл, а не в самом коде.

                M
                • 17 травня 2017 р. 05:59

                проблема как я выяснил в том что connect соединение с слотом с первого нажатия не производит. а подключается к слоту только со второго нажатия и запускает нормально слот. connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(tww())); вот так соединяю нажатие и слот

                  Evgenii Legotckoi
                  • 17 травня 2017 р. 06:04

                  Вы запихали connect не в то место в коде. Написали некачественный алгоритм, по которому коннект создаётся не в нужное время.

                    M
                    • 18 травня 2017 р. 07:55

                    Еще вопрос, с которым не могу разобраться. Есть ComboBox - raspsel, который позволяет выбрать поле из таблицы. Делаю я это следующим образом:

                     rasmd = new QSqlQueryModel(this);
                        QSqlQuery zrs;
                        zrs.exec("SELECT idr, CONCAT(rnumber, ' от ', rdata) FROM op");
                        rasmd->setQuery(zrs);
                        ui->raspsel->setModel(rasmd);
                        ui->raspsel->setModelColumn(1);
                    Теперь вопрос. Как сделать чтобы открыв форму для редактирования я видел выбранное значение и при этом мог поменять значение. через QDataWidgetMapper не получается правильно сделать. Не допонимаю как работает ComboBox
                      Evgenii Legotckoi
                      • 18 травня 2017 р. 07:59

                      Начнём с того, что QSqlQueryModel является моделью только для чтения, она не может быть редактируемой. А также, ответьте на вопрос. Зачем Вы выполняете метод exec() у QSqlQuery? Когда потом помещаете этот QSqlQuery в модель QSqlQueryModel? Обращение к базе данных происходит дважды.

                        M
                        • 18 травня 2017 р. 08:04

                        я так делаю потому что потом планирую сделать библиотеку sql запросов, потом исправлю, сейчас занимаюсь отладкой. Редактируемая же форма QSqlTableModel и QSqlRelationalTableModel. QSqlQueryModel я использую для извлечения данных из одной таблицы.

                          Evgenii Legotckoi
                          • 18 травня 2017 р. 08:13

                          Ну тогда у QComboBox есть методы currentData(), currentText(), currentIndex() с помощью которых можно забрать текущее значение. Передать его в сторону формы редактирования и с помощью этого значения выбрать нужную строку из таблицы базы данных, чтобы отобразить её в форме для редактирования.

                            M
                            • 21 травня 2017 р. 09:11

                            Опишу еще раз ситуацию. Есть таблица в которую посредством SQL запроса ложу данные, так как там необходимо в один столбец выводить несколько значений. Теперь встала проблема что при двойном клике по строке и вызове окна для редактирования программа ложится по сигналу полученному от операционки. я реализовал метод с использованием currentIndex()

                            edob = new editobject(ui->obv->selectionModel()->currentIndex().row());
                            edob экземляр формы для редактирования editobject, а obv таблица. при отладке выяснил что как только отрабатывает строка rmap->setCurrentModelIndex(rmod->index(row,0)); в форме редактирования, прилетает сигнал от операционной системы rmap = new QDataWidgetMappe как решить проблему. от QComboBox я на данном этапе отказался. у меня сама форма не отрабатывает
                              Evgenii Legotckoi
                              • 21 травня 2017 р. 12:30

                              В смысле программа крашится и выдаёт Segmentation Fault?
                              Ну тогда обращаетесь видимо к объекту, который в данный момент не был инициализирован. Получается, что используете rmap раньше, чем этот объект был создан. Нужно перетряхнуть последовательность действий.

                                M
                                • 22 травня 2017 р. 03:31

                                rmap инициализируется после его создания. не знаю что сделал, код не правил, но все заработало. только вот есть косяк о котором ранее не задумался. так как таблица в которой происходит вызов окна редактирования формируется по sql запросу, то индексы актуальны только для одного набора данных, для остальных заполнение происходит не верно. в связи с чем возникает вопрос если для использования QSqlQuery или QSqlQueryModel. Но в первую очередь у меня проблема с тем что сохранение изменений не происходит. Делаю как и всегда mapper->submit() и model->submitAll(). в других случаях все нормально

                                  Evgenii Legotckoi
                                  • 23 травня 2017 р. 01:53

                                  Так вы используете model->submitAll() и при этом используете QSqlQueryModel в качестве этой model?

                                  Делаю как и всегда mapper->submit() и model->submitAll(). в других случаях все нормально

                                  Я фиксить баги по таким высказываниям не умею, а экстрасенсы в отпуске. Код показывать следует в таких случаях.

                                    M
                                    • 23 травня 2017 р. 01:55

                                    нет. model = new QSqlTableModel

                                      M
                                      • 23 травня 2017 р. 01:57

                                      QSqlQueryModel я использую для формирования визуальной таблицы из которой по двойному клику вызываю форму редактирования. в ней же использую стандартный подход QSqlTableModel и QDataWidgetMapper

                                        Evgenii Legotckoi
                                        • 23 травня 2017 р. 02:36

                                        Тогда после применения настроек в форме редактирования, применяйте обновление данных в вашей QSqlQueryModel.

                                          M
                                          • 23 травня 2017 р. 02:38

                                          я так и делаю. после редактирования у меня посылается сигнал по которому происходит обращение к слоту обновления. сначала думал не правильно реализовал. но посмотрев через консоль базы, выяснил что данные не обновились

                                            M
                                            • 23 травня 2017 р. 03:47

                                            Никак не могу найти способ чтобы обойти проблему с индексами в форме приведенной на скриншоте. в этой форме отображается информация, о которой говорил ранее, ее я и редактирую. заполнение данной формы происходит при помощи QSqlQueryModel и по ряду показателей. проблема в том что если я меняю значение показателя (критерия отбора) то при выводе в таблицу индексы строк обновляются, т.е. они всегда идут с значения "1", что не соответствует индексу строки в sql таблице. Как результат форма редактирования заполняется не верно. Возможно из-за этого и не отрабатывает обновление данных

                                              Evgenii Legotckoi
                                              • 23 травня 2017 р. 04:38

                                              Потому, что это не ID, а номера строк самой таблицы. Почитайте вот это сообщение , да и в принципе весь топик.

                                                M
                                                • 23 травня 2017 р. 05:11

                                                вообще-то я делаю передачу индекса

                                                edob = new editobject(rrid, rayid, ui->obv->selectionModel()->currentIndex().row());
                                                где obv та самая таблица из которой я дергую информацию. а editobject форма для редактирования. в editobject индекс я использую в
                                                rmap->setCurrentModelIndex(rmod->index(row,0));
                                                rmap = new QDataWidgetMapper.

                                                  Evgenii Legotckoi
                                                  • 23 травня 2017 р. 05:27

                                                  И дальше что? То, что вы привели мне две эти строчки ещё не говорит о том, что этот код работает правильно.

                                                  И вообще-то QModelIndex != ID в базе данных, index.row() != ID в базе данных

                                                  Он у Вас работает правильно? Вы получаете обновление данных в базе данных? - НЕТ . Иначе это обсуждение не длилось бы так долго.

                                                  А теперь, я увижу достаточно подробный код или нет? 

                                                    M
                                                    • 23 травня 2017 р. 05:47

                                                    Код форм про которые говорил прикрепил. regrdit форма в которой отображается информация отбираемая из базы. editobject форма для редактирования

                                                      Evgenii Legotckoi
                                                      • 28 травня 2017 р. 10:01

                                                      Как интересно. У вас используется выборка по условиям везде. Ничего удивительного, что когда создаёте editobject , то получаете не верные данные. Забирая номер строки из одной таблицы, пытаетесь с помощью него получить другие данные в другой таблице. В которой используются совершенно другие условия выборки. Как я и говорил, почитайте топик, что я Вам привёл выше. И забирайте данные не по номеру строки в модели, а по ID записи в базе данных.

                                                      P/S/ Код у Вас отвратительный. Если кто-то после вас будет работать с проектом, то ему проще будет написать программу заново.

                                                        Коментарі

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

                                                        C++ - Тест 004. Указатели, Массивы и Циклы

                                                        • Результат:90бали,
                                                        • Рейтинг балів8
                                                        МВ

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

                                                        • Результат:68бали,
                                                        • Рейтинг балів-1
                                                        ЛС

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

                                                        • Результат:53бали,
                                                        • Рейтинг балів-4
                                                        Останні коментарі
                                                        A
                                                        ALO1ZE19 жовтня 2024 р. 08:19
                                                        Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                                                        ИМ
                                                        Игорь Максимов05 жовтня 2024 р. 07:51
                                                        Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                                                        d
                                                        dblas505 липня 2024 р. 11:02
                                                        QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                                                        k
                                                        kmssr08 лютого 2024 р. 18:43
                                                        Qt Linux - Урок 001. Автозапуск програми Qt під Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                                                        АК
                                                        Анатолий Кононенко05 лютого 2024 р. 01:50
                                                        Qt WinAPI - Урок 007. Робота з ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                                                        Тепер обговоріть на форумі
                                                        J
                                                        JacobFib17 жовтня 2024 р. 03:27
                                                        добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
                                                        ИМ
                                                        Игорь Максимов03 жовтня 2024 р. 04:05
                                                        Реализация навигации по разделам Спасибо Евгений!
                                                        JW
                                                        Jhon Wick01 жовтня 2024 р. 15:52
                                                        Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
                                                        КГ
                                                        Кирилл Гусарев27 вересня 2024 р. 09:09
                                                        Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
                                                        F
                                                        Fynjy22 липня 2024 р. 04:15
                                                        при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

                                                        Слідкуйте за нами в соціальних мережах