0 / 0 / 0
Регистрация: 12.03.2014
Сообщений: 13
1

Добавление множества записей в SQLite за одну транзакцию на примере Qt C++

02.02.2017, 08:46. Показов 3866. Ответов 1

Author24 — интернет-сервис помощи студентам
Доброе утро!

Передо мной стоит задача ускорить запись данных в БД. Бд использую SQLite, пишу на С++ Qt. Ознакомилась с интерестной статей, посвященной данному вопросу. В которой предлагался следующий вариант для ускорения записи в БД: увеличить количество insert-ов в одной транзакции. Безусловно, это увеличивает риск потери информации, но в то же время позволяет более оперативно добавлять данные в БД.

Ссылка на саму статью: http://devpractice.ru/fast-insert-in-sqlite/

Исходя из этого я попыталась реализовать эту идею следующим образом:

C++ (Qt)
1
2
3
4
5
6
.h 
    QSqlDatabase db;
    QSqlQuery *query;
 
    void connectDb();
    void writeBd();
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
.cpp
 
// Данный метод вызывается в конструкторе класса
void facadeBd::connectDb()
{
    db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("data_drone.db");
    if(db.open())
        query = new QSqlQuery(db);
    else
        query = 0;
 
    qDebug()<<"connectDataBase()"<<db.open();
}
 
bool facadeBd::execAdd(/*QString request*/)
{
    qDebug()<<"ExecAdd";
 
    if(!query)
        return false;
 
    query->clear();
    query->prepare("INSERT INTO test VALUES (?,?);");
 
    QVariantList name;
    name<<"1.0"<<"1.1"<<"1.2"<<"1.3"<<"1.4"<<"1.5"<<"1.6"<<"1.7"<<"1.8"<<"1.9"<<"2.0"<<"2.1"<<"2.2"<<"2.3"<<QVariant(QVariant::String);
    query->addBindValue(name);
 
    QVariantList age;
    age<<"1.0"<<"1.1"<<"1.2"<<"1.3"<<"1.4"<<"1.5"<<"1.6"<<"1.7"<<"1.8"<<"1.9"<<"2.0"<<"2.1"<<"2.2"<<"2.3"<<QVariant(QVariant::String);
    query->addBindValue(age);
 
    db.transaction();                      //Начало транзации
    if (!query->execBatch(QSqlQuery::ValuesAsColumns))      //Вставка пачки данных в базу данных
    {
        qDebug()<<"request"<<query->executedQuery();
        QString error = query->lastError().text();
        qDebug()<<"Работа с БД. " +error;
        db.rollback();
        return false;
    }
    else
    {
       db.commit();
        return true;
    }
 
}
В результате выполнения кода возникает след. ошибка при попытке записи в БД: Parameter count mismatch

Также подскажите пожалуйста какие еще способы можно предпринять для организации ускорения записи в БД? Может кто-то сможет поделиться своим опытом, как оптимальнее работать с БД
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.02.2017, 08:46
Ответы с готовыми решениями:

Добавление записей в таблицу sqlite
Всем привет! Подскажите пожалуйста, как мне добавить записи в существующую db таблицу. В таблице...

Запрос на одновременное добавление множества записей
Коллеги, не могу разобраться как через &quot;запрос на добавление&quot; (форма &quot;запись мероприятия&quot;) провести...

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

Добавить данные в несколько таблиц за одну транзакцию
Доброго времени суток! Подскажите, возможно ли одним запросом добавить в 2 и более таблиц данные ?...

1
93 / 93 / 33
Регистрация: 17.03.2012
Сообщений: 536
02.02.2017, 14:10 2
Если у вас запись данных в БД идет параллельно с чем-то, например, с работой пользователем, то было бы правильнее выделить работу с БД в отдельный поток, плюс добавить очередь
То есть у вас есть поток для работы с БД и поток для всего остального (ГУИ, например)
Между потоками у вас есть один контейнер (например, QQueue), в который вы из одного потока данные запихиваете, а в другом вынимаете и записываете их в БД
Таким образом по мере наполнения очереди-контейнера у вас будет происходить запись, а остальная работа будет продолжаться
0
02.02.2017, 14:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.02.2017, 14:10
Помогаю со студенческими работами здесь

Внесение нескольких строк данных за одну транзакцию
Уважаемые коллеги, подскажите, есть ли возможность за одну транзакцию в таблицу добавить несколько...

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

Добавление записей невозможно: ключ связи таблицы не входит в набор записей
Люди помогите пожалуйста. Есть база данных с 4 таблицами. Есть форма, на ней располагается...

Добавление записей невозможно: ключ связи таблицы не входит в набор записей
Здравствуйте! Возникла проблема при заполнении формы основанной на запросе. Как можно...


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

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

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