Arrow
March 23, 2017, 9:34 p.m.

Создание запроса

Пытаюсь сформировать такого содержания запрос:

SELECT * FROM table WHERE Name = '%Имя%'

Пишу следующее:

    QString serchStr = "";

    switch (ui->serchComboBox->currentIndex()) {
    case 1:
        serchStr = TABLE_REG_NUMBER;
        break;
    case 2:
        serchStr = TABLE_SHIFR;
        break;
    case 3:
        serchStr = TABLE_NAME;
        break;
    case 4:
        serchStr = TABLE_DATE;
        break;
    case 5:
        serchStr = TABLE_UZEL;
        break;
    default:
        break;
    }

    QSqlQuery query;
    QString str = QString("SELECT * FROM " TABLE
                          " WHERE " + serchStr + " = '%1';").arg(arg1);

    query.prepare(str);
    query.exec();
    query.next();

    modelMain->select();

Ничего не происходит. Что я делаю не так? И как в SQLite сделать выборку по неполному соответствию - типа %Имя%.

2

Do you like it? Share on social networks!

16
Evgenii Legotckoi
  • March 23, 2017, 10:44 p.m.

По идее строка формируется правильно, но почему-то что-то не работает. Я уже сталкивался с таким поведением, но так и не понял, из-за чего конкретно так происходит. Кажется, я в своё время обошёл эту проблему, когда всё перенёс в метод arg()

QString str = QString("SELECT * FROM " TABLE " WHERE %1 = '%2';").arg(serchStr).arg(arg1);

Для выборки по неполному соответствию используйте оператор LIKE , он поддерживается в SQLite3

SELECT * FROM table1 WHERE name LIKE '%часть слова%';

Знак процента означает любое количество символов.

    Arrow
    • March 24, 2017, 1:20 p.m.

    Запрос в самом SQLiteStudio работает. В программе не хочет.

      Evgenii Legotckoi
      • March 24, 2017, 1:37 p.m.

      Какой именно запрос? LIKE-запрос? Или изначальный?

        Evgenii Legotckoi
        • March 24, 2017, 1:51 p.m.

        Пробовали для начала прописать запрос одной строкой вручную? Чтобы проверить, работает ли в принципе? А то может тот метод и не вызывается вовсе или ещё какая другая причина. в этот запросе особо и ломаться нечему.

          Evgenii Legotckoi
          • March 24, 2017, 2 p.m.

          Возможно ещё метод prepare() лишний, поскольку не выполняются методы bindValue() после него.

          Вместо такой записи:

          query.prepare(str);
          query.exec();

          Сделайте так:

          query.exec(str);
            Arrow
            • March 24, 2017, 5:26 p.m.

            Результат тот же.

            Вот полный код в текущей редакции. Через отладчик видно, что запрос формируется верно (точно такой же отлично работает в SQLiteStudio). Везде query.exec(); и query.next(); возвращают true.

            void DrawWidget::on_serchLine_textChanged(const QString &arg1)
            {
                // Поиск в базе данных
            
                QString serchStr = "";
            
                switch (ui->serchComboBox->currentIndex()) {
                case 1:
                    serchStr = TABLE_REG_NUMBER;
                    break;
                case 2:
                    serchStr = TABLE_SHIFR;
                    break;
                case 3:
                    serchStr = TABLE_NAME;
                    break;
                case 4:
                    serchStr = TABLE_DATE;
                    break;
                case 5:
                    serchStr = TABLE_UZEL;
                    break;
                default:
                    break;
                }
            
                QSqlQuery query;
                QString str = QString("SELECT * FROM " TABLE
                                      " WHERE %1 LIKE '%%2%';").arg(serchStr).arg(arg1);
            
                //query.prepare(str);
                query.exec(str);
                query.next();
            
                modelMain->select();
            }

            Если написать даже цельной строкой так:

            QString str = QString("SELECT * FROM table WHERE Name LIKE '%d%'");

            Результата ноль.

              Arrow
              • March 24, 2017, 5:33 p.m.

              Через отладчик видно, что функция вызывается и отрабатывает полностью без ошибок - все значения от query.exec(str), query.next() и modelMain->select() через qDebug() возвращают true. сама строка str содержит правильный запрос (он же в SQLiteStudio работает). Сам запрос в переменной str:

                Arrow
                • March 24, 2017, 5:35 p.m.
                "SELECT * FROM table WHERE Name LIKE '%Е%'"

                  Evgenii Legotckoi
                  • March 25, 2017, 12:02 a.m.
                  QString str = QString("SELECT * FROM table WHERE Name LIKE '%d%'");

                  Меня сейчас один момент напряг в этой строке. Не могу понять - это опечатка, или у вас таблица действительно имеет название table ? Если название таблицы table , то переименуйте её... с таким названием работать не будет, я уже нарывался на такой интересный момент. Даже не знаю баг ли это, но не работают запросы, если таблица называется table в любом регистре. Хотя по отладчику всё будет нормально и методы будут возвращать true, но просто это не работает и хоть ты тресни, работать не будет.

                    Arrow
                    • March 25, 2017, 1:31 a.m.

                    Нет таблица называется main, а table я написал чтобы лучше воспринималось.

                      Arrow
                      • March 25, 2017, 1:50 a.m.

                      Подумал может и название main чем-то не угодило - переименовал в draw. Не идет все равно. Перерыл материалы по Qt - все должно работать./p>

                      Нашел еще один вариант:

                      QString str = QString("SELECT * FROM " TABLE
                                                " WHERE %1 LIKE '%%2%';").arg(serchStr).arg(arg1);
                      
                      QSqlQueryModel model;
                      
                       model.setQuery(str);

                      Хотя хочется на будущее понять где грабли лежат.

                        Arrow
                        • March 25, 2017, 3:27 a.m.
                        • The answer was marked as a solution.

                        Если кому пригодится - интерактивный поиск по неполному соответствию реализовал так:

                        void DrawWidget::on_serchLine_textChanged(const QString &arg1)
                        {
                            // Поиск в базе данных
                        
                            QString serchStr = "";
                        
                            switch (ui->serchComboBox->currentIndex()) {
                            case 1:
                                serchStr = TABLE_REG_NUMBER;
                                break;
                            case 2:
                                serchStr = TABLE_SHIFR;
                                break;
                            case 3:
                                serchStr = TABLE_NAME;
                                break;
                            case 4:
                                serchStr = TABLE_DATE;
                                break;
                            case 5:
                                serchStr = TABLE_UZEL;
                                break;
                            default:
                                break;
                            }
                        
                            modelMain->setFilter(serchStr + " LIKE '%" + arg1 + "%'");
                        
                            modelMain->select();
                        }
                          Arrow
                          • March 25, 2017, 3:27 a.m.

                          Реализации через

                          QSqlQuery не нашел.
                            Arrow
                            • March 25, 2017, 3:36 a.m.

                            Через QSqlQueryModel тоже все работает.

                              Evgenii Legotckoi
                              • March 26, 2017, 4:47 p.m.

                              А у меня тут один вопрос возник. Видимо я не правильно понял изначальную суть того, что Вы пытались сделать. А ведь Вы пытались с помощью QSqlQuery выполнить фильтрацию в модели данных modelMain ? Не так ли?

                              Если так, то это никогда бы у Вас и не заработало. В данном случае QSqlQuery и QSqlTableModel - это абсолютно разные сущности, которые никак не связаны. Я то подумал, что вы пытаетесь просто получить данные через QSqlQuery, а вы оказывается пытались фильтр на модель навешать. Что в корне не верно.

                              QSqlQuery наверняка работает, только вы не видите результата в QSqlTableModel, поскольку query к ней вообще никакого отношения не имеет.

                              // Значение из query можно забрать таким образом
                              int i = query.boundValue(1).toInt();
                                Arrow
                                • March 26, 2017, 4:59 p.m.

                                Да, я как раз и хотел отфильтровать данные.

                                Меня тоже интересовал вопрос связи QSqlQuery и QSqlTableModel и я хотел задать его позже.

                                Как забрать данные из query уже знаю и проверил - оказывается запрос все время работал корректно.

                                Спасибо за помощь и извините за неправильно заданный вопрос :)

                                  Comments

                                  Only authorized users can post comments.
                                  Please, Log in or Sign up
                                  • Last comments
                                  • AK
                                    April 1, 2025, 11:41 a.m.
                                    Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
                                  • Evgenii Legotckoi
                                    March 9, 2025, 9:02 p.m.
                                    К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
                                  • VP
                                    March 9, 2025, 4:14 p.m.
                                    Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
                                  • ИМ
                                    Nov. 22, 2024, 9:51 p.m.
                                    Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                                  • Evgenii Legotckoi
                                    Oct. 31, 2024, 11:37 p.m.
                                    Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup