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

QSqlDatabase. Работа с несколькими базами данных

21.11.2015, 16:47. Показов 3346. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!
Мне необходимо в одном приложении подключаться к нескольким базам данных sqlite, получать и редактировать таблицы находящиеся в них.

Но как только я задаю имя подключению, виджет с таблицей не отображается.

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//Для упрощения запихал все в main без проверок и т.д.
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE","firstConnection");
    db.setDatabaseName("C:\\programs\\Qt\\Examples\\Qt-5.5\\sql\\cachedtable\\200.ab");
 
    QSqlRelationalTableModel model;
    initializeModel(&model, "book");
    QTableView *view = createView(QObject::tr("book"), &model);
    view->show();
 
    return app.exec();
}
Как только я изменяю параметр при добавлении БД на
C++ (Qt)
1
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
Все отображается.

Как мне реализовать подключение сразу к нескольким БД?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.11.2015, 16:47
Ответы с готовыми решениями:

Работа с несколькими базами данных
Здравствуйте! Пишу программу на java, она должна выполнять сбор отзывов с сайтов, затем...

Работа с несколькими базами одновременно
День добрый. Ситуация. Имеется форма с контролами. Контролы не связаны с полями таблиц, а...

Управление несколькими базами данных
Как в запросе использовать данные запросов других баз данных?

Как в МFС работать с несколькими взаимосвязанными базами данных
Есть аксессовская БД, в которой несколько взаимосвязаных таблиц. Как подключить их и как сделать...

11
72 / 72 / 33
Регистрация: 07.11.2015
Сообщений: 281
21.11.2015, 17:38 2
Конструктор QSqlRelationalTableModel по-умолчанию работает с соединением по-умолчанию. Попробуйте
C++ (Qt)
1
QSqlRelationalTableModel model (NULL, db);
0
5 / 5 / 2
Регистрация: 28.11.2012
Сообщений: 165
21.11.2015, 18:07  [ТС] 3
Цитата Сообщение от OneMoreGres Посмотреть сообщение
Конструктор QSqlRelationalTableModel по-умолчанию работает с соединением по-умолчанию. Попробуйте
C++ (QT)Выделить код
1
QSqlRelationalTableModel model (NULL, db);
Не помогло.

Ниже вложил методы по инициализации и вида. Но вряд ли дело в них?

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
void initializeModel(QSqlRelationalTableModel *model, const QString nameTable)
{
//! [0]
    model->setTable(nameTable);
//! [0]
 
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);
//! [1]
    model->setRelation(model->fieldIndex("status"),
                                       QSqlRelation("status","id","status"));
//! [1]
 
//! [2]
    model->setRelation(model->fieldIndex("rating"),
                                       QSqlRelation("rating","id","rating"));
//! [2]
 
    model->select();
}
 
QTableView *createView(const QString &title, QSqlTableModel *model)
{
//! [4]
    QTableView *view = new QTableView;
    view->setModel(model);
    view->setSortingEnabled(1);
    view->setItemDelegate(new QSqlRelationalDelegate(view));
//! [4]
    view->setWindowTitle(title);
    return view;
}
0
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
21.11.2015, 18:21 4
А db.open() где?
0
5 / 5 / 2
Регистрация: 28.11.2012
Сообщений: 165
21.11.2015, 18:48  [ТС] 5
RazrFalcon, наверное глупый вопрос:
А почему работает без .Open?
Перед чем необходимо ее открывать?
0
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
21.11.2015, 18:51 6
open() нужно вызывать после setDatabaseName()
Работает - значит кто-то где-то сам открывает.
0
5 / 5 / 2
Регистрация: 28.11.2012
Сообщений: 165
21.11.2015, 19:13  [ТС] 7
RazrFalcon, В общем не помогло.

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
QApplication app(argc, argv);
 
 
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE","kjijiij");
    db.open();
    db.setDatabaseName("C:\\programs\\Qt\\Examples\\Qt-5.5\\sql\\cachedtable\\200.clt");
 
    QSqlRelationalTableModel model(NULL, db);
    initializeModel(&model, "book");
    QTableView *view = createView(QObject::tr("Relational Table Model"), &model);
    view->show();
0
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
21.11.2015, 20:23 8
Maxfashko, после, а не перед
0
5 / 5 / 2
Регистрация: 28.11.2012
Сообщений: 165
22.11.2015, 05:45  [ТС] 9
RazrFalcon, Уже как только не пробовал)

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

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
//Это все по-старому
void initializeModel(QSqlRelationalTableModel *model, const QString nameTable)
{
//! [0]
    model->setTable(nameTable);
//! [0]
 
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);
//! [1]
    model->setRelation(model->fieldIndex("status"),
                                       QSqlRelation("status","id","status"));
//! [1]
 
//! [2]
    model->setRelation(model->fieldIndex("rating"),
                                       QSqlRelation("rating","id","rating"));
//! [2]
    model->select();
}
 
//Тоже самое (код не изменился)
QTableView *createView(const QString &title, QSqlTableModel *model)
{
//! [4]
    QTableView *view = new QTableView;
    view->setModel(model);
    view->setSortingEnabled(1);
    view->setItemDelegate(new QSqlRelationalDelegate(view));
//! [4]
    view->setWindowTitle(title);
    return view;
}
 
 
 
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
 
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE","first");
    db.setDatabaseName("C:\\programs\\Qt\\Examples\\Qt-5.5\\sql\\cachedtable\\200.clt");
 
    if(!db.open()){
        qDebug()<<"not open";
        return -1;
    }else{
        qDebug()<< db.open();             //true
    }
 
    QSqlQuery query1(db);
    QSqlQuery list;
 
 
    //создаю новую таблицу для отображения ее на форме
 
    list.exec("CREATE TABLE list (ID INTEGER,"
        "nameBook   VARCHAR(40),"
        "autor  TEXT,"
        "amountList INTEGER,"
        "status INTEGER,"
        "dateStartRead  DATE,"
        "dateFinishRead DATE,"
        "rating INTEGER,"
        "сomment   TEXT,"
        "PRIMARY KEY(ID)");
    
    //запрос из таблицы БД
    query1.exec("select * from book");
    qDebug()<<query1.size();    //возвращает -1
 
    list.prepare("INSERT INTO list(id, nameBook, autor, amountList, status, dateStartRead, dateFinishRead, rating, comment)"
                     "VALUES (?,?,?,?,?,?,?,?,?)");
 
    while (query1.next()){
            list.addBindValue(query1.value(0).toString());
            list.addBindValue(query1.value(1).toString());
            list.addBindValue(query1.value(2).toString());
            list.addBindValue(query1.value(3).toString());
            list.addBindValue(query1.value(4).toString());
            list.addBindValue(query1.value(5).toString());
            list.addBindValue(query1.value(6).toString());
            list.addBindValue(query1.value(7).toString());
            list.addBindValue(query1.value(8).toString());
            qDebug()<<query1.value(0).toString();                  //выводит id`шники от 1 до 200 (как и в таблице)
            list.exec();
        }
 
 
    QSqlRelationalTableModel model(NULL, db);
    initializeModel(&model, "list");
    QTableView *view = createView(QObject::tr("Книги"), &model);
    view->show();
 
 
 
    return app.exec();
}
Но странное дело, таблица пуста, консоль сборки выдает

C++ (Qt)
1
2
3
4
5
6
7
true
QSqlQuery::exec: database not open
-1
QSqlQuery::prepare: database not open
"1"
"2"
до...../n
Добавлено через 6 минут
Но ведь qDebug работает, значит QSqlQuery не пустой.

Добавлено через 8 часов 49 минут
Подскажите, может я неправильно подошел к проектированию? И мне не нужно работать с несколькими БД?
Смысл такой: пользователь может работать с несколькими таблицами, просматривая и редактируя их. Выбор текущей таблицы осуществляется через combobox. Пользователь может добавлять свои новые "пользовательские" таблицы, удалять таблицы.
Выборка данных из всех "пользовательских" таблиц сливается в одну - главную.
Я расчитывал на то, что все "пользовательские" таблицы будут лежать отдельными файлами, чтобы не загромождать основную БД с таблицей статистики, и чтобы избежать ?проблем? при удалении "пользовательских" таблиц.
Целесообразно ли это? Разбивать отдельными БД.
Либо стоит окреститься от этой идеи в свете вышеприведенных 9 сообщений, и добавлять все таблицы в одну БД?
0
72 / 72 / 33
Регистрация: 07.11.2015
Сообщений: 281
22.11.2015, 12:28 10
Maxfashko, QSqlQuery list работает с соединение по-умолчанию. Это он ругается. Ему тоже соединение задайте или дефолтное инициализируйте.
Насчет проектирования особенно не вникал, но сравните, что потребует больше сил по разработке/сопровождению: поддерживать работу с множеством баз или обнаруживать и вычищать неиспользуемые таблицы.
0
5 / 5 / 2
Регистрация: 28.11.2012
Сообщений: 165
22.11.2015, 12:44  [ТС] 11
OneMoreGres, не помогло.
Да ide перестала ругаться, но таблица по-прежнему выводится пустой.
Видимо придется делать все с одной базой данных
0
72 / 72 / 33
Регистрация: 07.11.2015
Сообщений: 281
22.11.2015, 15:34 12
Запросы через list-то хоть отрабатываются? Проверьте на ошибки prepare и exec. Или вообще на создание - по-моему там скобки закрывающей не хватает.
0
22.11.2015, 15:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.11.2015, 15:34
Помогаю со студенческими работами здесь

Работа с базами данных
Недавно прочитал про пару интересных возможностей HTML5, а именно Web Storage и работа с БД. Можно...

Работа с базами данных
Здравствуйте, мне нужно удаленно подключиться к базе данных mysql как это можно сделать?

Работа с базами данных
Помогите, пожалуйста. Решил для себя разобраться с django. В итоге, при работе с бд, а именно при...

Работа с базами данных
Предусмотренно ли в паскале работа с БД? Подскажите или дайте направление. Хочу создать простенькую...


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

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

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