РС
Руслан СклюевМаусым 18, 2020, 4:01 Т.Қ.

Простенький запрос

qt, DataBase, QML

Здравствуйте! Установил PG12.
Тестовый запрос: INSERT INTO "public"."NameTable" ("FirstName", "SurName", "Nik") VALUES ('ff', 'cc', 'bb');
Как реализовать его в query.prepare? ругается на кавычки.

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

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

19
Evgenii Legotckoi
  • Маусым 18, 2020, 4:18 Т.Қ.

Добрый день.
Нужно делать экранирование, поскольку кавычки в C++ это спец символы.

Напишите строку так

query.prepare("INSERT INTO \"public\".\"NameTable\" (\"FirstName\", \"SurName\", \"Nik\") VALUES ('ff', 'cc', 'bb');")
    РС
    • Маусым 18, 2020, 4:38 Т.Қ.

    "INSERT INTO \"public\".\"NameTable\" ( \"FisrtName\", \"SurName\", \"Nik\") VALUES (:db, 'cc', \"bb\")"
    "ОШИБКА: ошибка синтаксиса в конце\nLINE 1: EXECUTE \n ^\n(42601) QPSQL: Невозможно создать запрос"
    QML debugging is enabled. Only use this in a safe environment.

      Evgenii Legotckoi
      • Маусым 18, 2020, 4:41 Т.Қ.

      Показывайте полный код, как формируете запрос, в том числе и C++ код.

      P/S/ и когда будете вставлять в сообщение код, то воспользуйтесь диалогом для вставки кода, чтобы разметка правильно сформировалась.
      Это одна из кнопок в тулбаре редактора.

        Evgenii Legotckoi
        • Маусым 18, 2020, 4:49 Т.Қ.
        • (өңделген)

        Будьте так любезны, вставляйте программный код с помощью этого дилога.
        У меня нет времени, чтобы перепечатывать ваш код с картинки, чтобы объяснить вам вашу ошибку.

          РС
          • Маусым 18, 2020, 4:50 Т.Қ.
          bool DataBase::inserIntoTable(const QVariantList &data)
          {
          
              QSqlQuery query;
          
             query.prepare("INSERT INTO \"public\".\"NameTable\" (\"FirstName\", \"SurName\", \"Nik\") VALUES ('ff', 'cc', 'bb');");
          
              if(!query.exec()){
                  qDebug() << "error insert into " << TABLE;
                  qDebug() <<  query.lastQuery();
                  qDebug() << query.lastError().text();
                  return false;
              } else {
                  return true;
              }
              return false;
          }
          
            Evgenii Legotckoi
            • Маусым 18, 2020, 4:54 Т.Қ.

            Какую ошибку выдаёт этот ваш запрос?
            Поскольку в предыдущем сообщении у вас был запрос, в котором вы пытались сделать bind

            и выглядел он иначе

            "INSERT INTO \"public\".\"NameTable\" ( \"FisrtName\", \"SurName\", \"Nik\") VALUES (:db, 'cc', \"bb\")"
            
              РС
              • Маусым 18, 2020, 4:55 Т.Қ.

              "INSERT INTO \"public\".\"NameTable\" ( \"FisrtName\", \"SurName\", \"Nik\") VALUES (:db, 'cc', \"bb\")"
              "ОШИБКА: ошибка синтаксиса в конце\nLINE 1: EXECUTE \n ^\n(42601) QPSQL: Невозможно создать запрос"
              QML debugging is enabled. Only use this in a safe environment.

                Evgenii Legotckoi
                • Маусым 18, 2020, 5:02 Т.Қ.

                Вот пример из документации

                QSqlQuery query;
                query.prepare("INSERT INTO person (id, forename, surname) "
                              "VALUES (:id, :forename, :surname)");
                query.bindValue(":id", 1001);
                query.bindValue(":forename", "Bart");
                query.bindValue(":surname", "Simpson");
                query.exec();
                

                Если вы пытаетесь сделать bind, то вам нужно правильно сформировать строку запроса, плюс указать bind привязки.

                В данном случае наличие кавычек уже не нужно будет.

                bool DataBase::inserIntoTable(const QVariantList &data)
                {
                
                    QSqlQuery query;
                
                   query.prepare("INSERT INTO public.NameTable (FirstName, SurName, Nik) VALUES (:db, 'cc', 'bb');");
                   query.bindValue(":db",       data[0].toString());
                
                    if(!query.exec()){
                        qDebug() << "error insert into " << TABLE;
                        qDebug() <<  query.lastQuery();
                        qDebug() << query.lastError().text();
                        return false;
                    } else {
                        return true;
                    }
                    return false;
                }
                

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

                  РС
                  • Маусым 18, 2020, 5:07 Т.Қ.
                  error insert into  NameTable
                  "INSERT INTO public.NameTable (FirstName, SurName, Nik) VALUES ('ffb', 'cc', 'bb');"
                  "ОШИБКА:  ошибка синтаксиса в конце\nLINE 1: EXECUTE \n                ^\n(42601) QPSQL: Невозможно создать запрос"
                  
                    Evgenii Legotckoi
                    • Маусым 18, 2020, 5:20 Т.Қ.

                    Так, добро... А как себя поведёт такой код?

                    bool DataBase::inserIntoTable(const QVariantList &data)
                    {
                    
                        QSqlQuery query;
                    
                        query.prepare("INSERT INTO NameTable (FirstName, SurName, Nik) VALUES (:FName, :SName, :Nik)");
                        query.bindValue(":FName",       "Name");
                        query.bindValue(":SName",       "Surname");
                        query.bindValue(":Nik",         "Nik");
                    
                        if(!query.exec()){
                            qDebug() << "error insert into " << TABLE;
                            qDebug() <<  query.lastQuery();
                            qDebug() << query.lastError().text();
                            return false;
                        } else {
                            return true;
                        }
                        return false;
                    }
                    
                      РС
                      • Маусым 18, 2020, 5:22 Т.Қ.

                      error insert into public.NameTable
                      "INSERT INTO NameTable (FirstName, SurName, Nik) VALUES (:FName, :SName, :Nik)"
                      "ОШИБКА: ошибка синтаксиса (примерное положение: \"(\")\nLINE 1: EXECUTE ('Name', 'Surname', 'Nik')\n ^\n(42601) QPSQL: Невозможно создать запрос"

                      Ну теперь на значения ругается

                        Evgenii Legotckoi
                        • Маусым 18, 2020, 5:30 Т.Қ.

                        А это уже очень плохо. Данный вариант кода должен был сработать.
                        Или не создалась таблица, или драйвер QPSQL коряво отрабатывает с PG12.

                        Лучше будет, если таблицы нет.
                        В случае с драйвером писать на багтрекер Qt Company тикет об ошибке и откатываться на более старую версию PG

                          РС
                          • Маусым 18, 2020, 5:32 Т.Қ.

                          На PG запрос должен выглядеть так INSERT INTO "public"."NameTable" ("FirstName", "SurName", "Nik") VALUES ('ff', 'cc', 'bb')

                            Evgenii Legotckoi
                            • Маусым 18, 2020, 5:38 Т.Қ.

                            Тогда это должно было сработать - ссылка на комментарий

                            Также наличие public не принципиально, как и наличие кавычек

                            Сами документацию на PostgreSQL 12 почитайте, вот ссылка на INSERT

                            А вот пример из документации

                            INSERT INTO films (code, title, did, date_prod, kind)
                                VALUES ('T_601', 'Yojimbo', 106, '1961-06-16', 'Drama');
                            
                              РС
                              • Маусым 18, 2020, 6:03 Т.Қ.

                              У меня получилось, если создать строку, потом как вы написали, потом как тут - https://doc.qt.io/qt-5/qstring.html#initializing-a-string перебрать строку и заменить слэши на пробелы. Но это костыль?

                                Evgenii Legotckoi
                                • Маусым 18, 2020, 6:10 Т.Қ.

                                Сдаётся мне, что у вас кодировка файла исходных кодов корявая.
                                Другой причины уже быть не может, иначе вам не пришлось бы заменять слэши. Дело в том, что слэш экранирует в код на C++ кавычки, чтобы это скомпилировалось нормально в строку.

                                  РС
                                  • Маусым 18, 2020, 6:44 Т.Қ.

                                  А как ее сменить?

                                    РС
                                    • Маусым 18, 2020, 8:15 Т.Қ.
                                    • Жауап шешім ретінде белгіленді.

                                    Пересоздал таблицу в базе - все заработало без кавычек и public. Большое спасибо!

                                      Пікірлер

                                      Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
                                      Кіріңіз немесе Тіркеліңіз
                                      Г

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

                                      • Нәтиже:66ұпай,
                                      • Бағалау ұпайлары-1
                                      t

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

                                      • Нәтиже:33ұпай,
                                      • Бағалау ұпайлары-10
                                      t

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

                                      • Нәтиже:52ұпай,
                                      • Бағалау ұпайлары-4
                                      Соңғы пікірлер
                                      G
                                      GoattRockҚыр. 3, 2024, 1:50 Т.Қ.
                                      Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
                                      d
                                      dblas5Шілде 5, 2024, 11:02 Т.Ж.
                                      QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                                      k
                                      kmssrАқп. 8, 2024, 6:43 Т.Қ.
                                      Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                                      АК
                                      Анатолий КононенкоАқп. 5, 2024, 1:50 Т.Ж.
                                      Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                                      Енді форумда талқылаңыз
                                      Evgenii Legotckoi
                                      Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
                                      добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                                      F
                                      FynjyШілде 22, 2024, 4:15 Т.Ж.
                                      при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
                                      BlinCT
                                      BlinCTМаусым 25, 2024, 1 Т.Ж.
                                      Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
                                      BlinCT
                                      BlinCTМамыр 5, 2024, 5:46 Т.Ж.
                                      Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
                                      Evgenii Legotckoi
                                      Evgenii LegotckoiМамыр 2, 2024, 2:07 Т.Қ.
                                      Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

                                      Бізді әлеуметтік желілерде бақылаңыз