Arrow
Arrow23 марта 2017 г. 11:34

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

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

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 сделать выборку по неполному соответствию - типа %Имя%.

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

Вам это нравится? Поделитесь в социальных сетях!

16
Evgenii Legotckoi
  • 23 марта 2017 г. 12:44

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

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

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

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

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

    Arrow
    • 24 марта 2017 г. 3:20

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

      Evgenii Legotckoi
      • 24 марта 2017 г. 3:37

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

        Evgenii Legotckoi
        • 24 марта 2017 г. 3:51

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

          Evgenii Legotckoi
          • 24 марта 2017 г. 4:00

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

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

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

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

          query.exec(str);
            Arrow
            • 24 марта 2017 г. 7:26

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

            Вот полный код в текущей редакции. Через отладчик видно, что запрос формируется верно (точно такой же отлично работает в 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
              • 24 марта 2017 г. 7:33

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

                Arrow
                • 24 марта 2017 г. 7:35
                "SELECT * FROM table WHERE Name LIKE '%Е%'"

                  Evgenii Legotckoi
                  • 24 марта 2017 г. 14:02
                  QString str = QString("SELECT * FROM table WHERE Name LIKE '%d%'");

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

                    Arrow
                    • 24 марта 2017 г. 15:31

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

                      Arrow
                      • 24 марта 2017 г. 15:50

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

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

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

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

                        Arrow
                        • 24 марта 2017 г. 17:27
                        • Ответ был помечен как решение.

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

                        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
                          • 24 марта 2017 г. 17:27

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

                          QSqlQuery не нашел.
                            Arrow
                            • 24 марта 2017 г. 17:36

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

                              Evgenii Legotckoi
                              • 26 марта 2017 г. 6:47

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

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

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

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

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

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

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

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

                                  Комментарии

                                  Только авторизованные пользователи могут публиковать комментарии.
                                  Пожалуйста, авторизуйтесь или зарегистрируйтесь
                                  AD

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

                                  • Результат:50баллов,
                                  • Очки рейтинга-4
                                  m
                                  • molni99
                                  • 26 октября 2024 г. 7:37

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

                                  • Результат:80баллов,
                                  • Очки рейтинга4
                                  m
                                  • molni99
                                  • 26 октября 2024 г. 7:29

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

                                  • Результат:20баллов,
                                  • Очки рейтинга-10
                                  Последние комментарии
                                  i
                                  innorwall14 ноября 2024 г. 17:42
                                  Как Копировать Файлы в Linux If only females relatives with DZ offspring were considered these percentages were 23 order priligy online uk
                                  i
                                  innorwall14 ноября 2024 г. 15:09
                                  Qt/C++ - Урок 068. Hello World с использованием системы сборки CMAKE в CLion ditropan pristiq dosing With the Yankees leading, 4 3, Rivera jogged in from the bullpen to a standing ovation as he prepared for his final appearance in Chicago buy priligy pakistan
                                  i
                                  innorwall14 ноября 2024 г. 10:05
                                  EVILEG-CORE. Использование Google reCAPTCHA 2001; 98 29 34 priligy buy
                                  i
                                  innorwall14 ноября 2024 г. 10:00
                                  PyQt5 - Урок 007. Работаем с QML QtQuick (Сигналы и слоты) priligy 30mg Am J Obstet Gynecol 171 1488 505
                                  Сейчас обсуждают на форуме
                                  i
                                  innorwall14 ноября 2024 г. 9:39
                                  добавить qlineseries в функции priligy amazon canada 93 GREB1 protein GREB1 AB011147 6
                                  i
                                  innorwall11 ноября 2024 г. 16:55
                                  Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
                                  9
                                  9Anonim25 октября 2024 г. 15:10
                                  Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
                                  ИМ
                                  Игорь Максимов3 октября 2024 г. 10:05
                                  Реализация навигации по разделам Спасибо Евгений!

                                  Следите за нами в социальных сетях