5 / 5 / 2
Регистрация: 28.11.2012
Сообщений: 165
1

Организация поиска в базе SQLite с помощью QSqlRelationalTableModel

14.03.2016, 14:18. Показов 4636. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер ребята.

Имеется БД sqlite. В программе необходимо реализовать поиск в БД введенных значений.
БД содержит множество "пользовательских таблиц" с записями.
Функция поиска выглядит следующим образом:

-формируем запрос (текст искомой строки берем из lineEdit, название искомого столбца из combobox)
-открываем таблицу в которой содержатся имена всех "пользовательских таблиц"
-проходим циклом по всем "пользовательским таблицам"
-в конкретной таблице ищем строку, используя сформированный нами запрос.

В итоге поиск работает только на числах. При вводе "буковок" метод prepare всегда возвращает false.
То есть книга 1984 будет найдена, книга HI-FI найдена не будет, даже, если запрос сформировать вручную
C++ (Qt)
1
sqlSelect = QString("SELECT * FROM _200_book_BBC WHERE nameBook = HI-FI");
Всю голову сломал, не могу

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
void MainWindow::on_tab_pushButtonSearchBook_clicked()
{
    //проверка на пустое поле ввода
    if(ui->tab_lineEditSearchBook->text() > 0){
 
        QString searchFilter;                                                //столбец по которому будем производить поиск значения
 
        // сооветствие индексам комбоокса к столбцам таблицы
        if(ui->tab_comboBoxFilterSearchBook->currentIndex() == 0)
            searchFilter = "nameBook";
        else if(ui->tab_comboBoxFilterSearchBook->currentIndex() == 1)
            searchFilter = "autor";
        else if(ui->tab_comboBoxFilterSearchBook->currentIndex() == 2)
            searchFilter = "amountList";
        else if(ui->tab_comboBoxFilterSearchBook->currentIndex() == 3)
            searchFilter = "dateStartRead";
        else if(ui->tab_comboBoxFilterSearchBook->currentIndex() == 4)
            searchFilter = "dateFinishRead";
        else if(ui->tab_comboBoxFilterSearchBook->currentIndex() == 5)
            searchFilter = "rating";
        else if(ui->tab_comboBoxFilterSearchBook->currentIndex() == 6)
            searchFilter = "comment";
 
        QSqlQuery queryUserList;
        QString sqlSelect;
        queryUserList.exec("SELECT name FROM userList");                          //выбираем пользовательские списки из таблицы userList
 
        //цикл по пользовательским спискам
        while(queryUserList.next()){
 
            QString currentNameList = queryUserList.value(0).toString();     //текущая пользовательская таблица
            QSqlQuery queryCurrentList;
            QSqlQuery queryInsertItem;
 
            //текст искомого значения из lineEdit
            QString valueLineEditSearchBook = ui->tab_lineEditSearchBook->text();
 
            //формируем запрос
            sqlSelect = QString("SELECT * FROM %1 WHERE %2 = %3").arg(currentNameList, searchFilter, valueLineEditSearchBook);
//            sqlSelect = QString("SELECT * FROM _200_book_BBC WHERE nameBook = HI-FI");             //даже если использовать данный запрос, prepare вернет false
 
            qDebug()<<"STRING  = "<<sqlSelect;
            qDebug()<<"currentNameList = "<< currentNameList;
            qDebug()<<"searchLine = "<<valueLineEditSearchBook;
            qDebug()<<"Filter = "<<searchFilter;
 
            if(queryCurrentList.prepare(sqlSelect)){
                if(queryCurrentList.exec())
                    qDebug()<<"Запуск найденного значения: true";
                else
                    qDebug()<<"Запуск найденного значения: false";
 
                    //Производим вставку в таблицу найденных книг search
                    queryInsertItem.prepare("INSERT INTO search(id, nameList, nameBook, autor, amountList,"
                                            "status, dateStartRead, dateFinishRead, rating, comment)"
                                            "VALUES (?,?,?,?,?,?,?,?,?,?)");
                    while(queryCurrentList.next()){
                        qDebug()<<"SearchBoook = "<<queryCurrentList.value(1).toString();
 
                        queryInsertItem.addBindValue(queryCurrentList.value(0).toString());
                        queryInsertItem.addBindValue(currentNameList);
                        queryInsertItem.addBindValue(queryCurrentList.value(1).toString());
                        queryInsertItem.addBindValue(queryCurrentList.value(2).toString());
                        queryInsertItem.addBindValue(queryCurrentList.value(3).toString());
                        queryInsertItem.addBindValue(queryCurrentList.value(4).toString());
                        queryInsertItem.addBindValue(queryCurrentList.value(5).toString());
                        queryInsertItem.addBindValue(queryCurrentList.value(6).toString());
                        queryInsertItem.addBindValue(queryCurrentList.value(7).toString());
                        queryInsertItem.addBindValue(queryCurrentList.value(8).toString());
                        qDebug() << queryInsertItem.exec();
                    }
 
                }else{
                    qDebug()<<"sql broken. Вставка не удалась!";
                }
            }
 
            QSqlRelationalTableModel *model = new QSqlRelationalTableModel();
 
            model->setEditStrategy(QSqlTableModel::OnManualSubmit);
            model->setRelation(model->fieldIndex("status"),
                               QSqlRelation("status","id","status"));
 
            model->setRelation(model->fieldIndex("rating"),
                               QSqlRelation("rating","id","rating"));
 
            model->setHeaderData(0, Qt::Horizontal, QObject::tr("ID"));
            model->setHeaderData(1, Qt::Horizontal, QObject::tr("Название списка"));
            model->setHeaderData(2, Qt::Horizontal, QObject::tr("Название книги"));
            model->setHeaderData(3, Qt::Horizontal, QObject::tr("Автор"));
            model->setHeaderData(4, Qt::Horizontal, QObject::tr("Страниц"));
            model->setHeaderData(5, Qt::Horizontal, QObject::tr("Статус"));
            model->setHeaderData(6, Qt::Horizontal, QObject::tr("Начало чтения"));
            model->setHeaderData(7, Qt::Horizontal, QObject::tr("Конец чтения"));
            model->setHeaderData(8, Qt::Horizontal, QObject::tr("Рейтинг"));
            model->setHeaderData(9, Qt::Horizontal, QObject::tr("Комментарий"));
 
            model->select();
            model->setTable("search");
            createView(model, ui->tab_tableViewList);
 
    }else{
        QMessageBox::warning(this, tr("слишком короткий запрос"), tr("Введите текст запроса!"));
    }
}
Миниатюры
Организация поиска в базе SQLite с помощью QSqlRelationalTableModel  
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.03.2016, 14:18
Ответы с готовыми решениями:

Организация поиска в базе .mdb.
sub poisk() dim db as database,tb as recordset set db=opendatabase('avto.mdb') set...

организация поиска в базе данных
Допустим, я хочу создать портал фильмов. У каждого фильма есть: Название, год, Страна, режиссер,...

Организация поиска по базе данных
Всем, привет. Тут вот какое дело... занимаюсь курсовой, и надо мне сделать поиск по имени в BDE....

Организация поиска по сайту с помощью PHP
Уважаемые форумчане, подскажите как организовать поиск при помощи PHP! есть сайт в великому...

5
59 / 41 / 18
Регистрация: 07.10.2015
Сообщений: 112
15.03.2016, 10:40 2
Лучший ответ Сообщение было отмечено Maxfashko как решение

Решение

Строки в запросе должны быть обрамлены кавычками.
Соответственно вместо
C++
1
sqlSelect = QString("SELECT * FROM _200_book_BBC WHERE nameBook = HI-FI");
Должно быть
C++
1
sqlSelect = QString("SELECT * FROM _200_book_BBC WHERE nameBook = "HI-FI" ");
Ну и в коде тоже
C++
1
sqlSelect = QString("SELECT * FROM %1 WHERE %2 = "%3" ").arg(currentNameList, searchFilter, valueLineEditSearchBook);
1
5 / 5 / 2
Регистрация: 28.11.2012
Сообщений: 165
15.03.2016, 11:00  [ТС] 3
slava_stepankof, Огромное спасибо.
То есть числа в кавычки обрамлять не нужно?
0
59 / 41 / 18
Регистрация: 07.10.2015
Сообщений: 112
15.03.2016, 11:10 4
Maxfashko, Числа нет.
А вообще лучше использовать такой вариант передачи параметров.
C++
1
2
sql->prepare("SELECT * FROM _200_book_BBC WHERE nameBook = :nameBook");
sql->bindValue(":nameBook","Hi-Fi");
0
5 / 5 / 2
Регистрация: 28.11.2012
Сообщений: 165
15.03.2016, 11:15  [ТС] 5
slava_stepankof,
C++ (Qt)
1
2
sql->prepare("SELECT * FROM _200_book_BBC WHERE nameBook = :nameBook");
sql->bindValue(":nameBook","Hi-Fi");
В чем будет разница? Я ведь все равно вызываю метод prepare в 47 строке, после того как сформирую запрос.
0
59 / 41 / 18
Регистрация: 07.10.2015
Сообщений: 112
15.03.2016, 11:23 6
Разница в том что:
1. препаре делается один раз а потом просто биндятся разные значения параметров.
2. бинд сам выводит тип параметра и принимает в качестве аргумернта значения QVariant (кавычить строку не надо)
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.03.2016, 11:23
Помогаю со студенческими работами здесь

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

Организация поиска в списке. Исправить ошибку в методе поиска
Сколько бы у меня желания не было, найти ее не могу. Может кто помочь? Заранее спасибо... #include...

Разработать программы поиска в глубину и поиска в ширину при описании графа с помощью матрицы смежности
Ребят помогите, на носу экзамен. Дали задачу,для получения зачета. Весь мозг себе сломал, не как не...

Путь к базе sqlite
string path = @&quot;C:\Users\vano\Desktop\Новая папка(2)\WindowsFormsApplication2\DB&quot;; В проекте...

Поиск по базе SQLite
Добрый день! С SQLite работаю в первый раз ,никак не могу разобраться.Суть кода:при нажатии на...

Не могу подключится к базе SQLITE
Изучаю С++ и QT. (имеется опыт программирования на C#) Так вот. Для Windows приложений писал так:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru