Работа с БД C++(QT)

257
24 декабря 2017, 09:39

Здравствуйте, создаю приложение, которое работает с БД. БД представляет собой данные о школе(ученики, сотрудники школы, классы, родители учеников и т.д.). И вот в процессе разработки возник у меня вопрос... Как лучше работать с БД есть 2 варианта:

  1. Это связывать все с базой напрямую к примеру... Если нужно отсортировать таблицу, то пишем запрос к БД, принимаем данные от БД и обновляем таблицу. Точно также поступаем и с добавление удалением, поиском и т.д., т.е. суть заключается в постоянном большом потоке обменов данных с БД.

    Пример работы на прямую

    ... 
    void StaffsForm::updateTableModel(QString &stringQuery)
    {
        model->removeRows(0, model->columnCount());
        QSqlQuery query = dataBase->execS(stringQuery);
        for(size_t row = 0; query.next(); row++)
        {
            for(size_t col = 0; col < model->columnCount() ; col++)
            {
                QStandardItem *item = new QStandardItem(query.value(col).toString());
                model->setItem(row, col, item);
                //освобождается память в другом месте
            }
        }
    }
    ... 
    void StaffsForm::clickedBtnDel()
    {
        QModelIndexList selectedRows = getSelectedRows();
        if(!selectedRows.size() == 0)
        {
            QMessageBox::StandardButton confirm = FormProperties::Confirm("Действительно хотите удалить сотрудника?");
            if(confirm == QMessageBox::Yes)
            {
                 ui->statusbar->showMessage("Удаление из базы данных сотрудника(ов) ");
                 for(size_t i = 0; i < (size_t)selectedRows.size(); i++)
                 {
                     QString name = selectedRows.at(i).data().toString();
                     ui->statusbar->showMessage(ui->statusbar->currentMessage() + " | " + name);
                     dataBase->execDelete("DELETE FROM staffs WHERE name = '" + name + "'");
                 }
                 this->updateTableModel(commonQuery);
            }
        } 
        else 
        {
            FormProperties::WarnMessage("Не выделена строка, либо выделена не целиком.");
        }
    }
    
  2. Можно сделать класс моделей к примеру Сотрудника, в нем хранить данные о сотруднике, потом создать класс в котором будет храниться вектор этих объектов, которые будут заполнены с БД. Ну и уже с ними производить сортировку поиск и т.д.. Но а если уже добавление либо удаление, то понятно дело добавляем либо удаляем данные из/в списке и пишем запрос на добавление либо удаление данных в БД.

    Пример модели

    class Staff : public Models
    {
    private:
        QString name;
        QString number;
        QString address;
        QString personalData;
        QString dateOfBirth;
        QString profession;
        QString predmet;
        Staff(QString &name, QString &number, QString &address, QString &personalData,
              QString &dateOfBirth, QString &profession, QString &predmet);
    public:
        class Builder {
            QString name;
            QString number;
            QString address;
            QString personalData;
            QString dateOfBirth;
            QString profession;
            QString predmet;
        public:
            // setters
            Staff* build();
        };
    // getters
    };
    

    Пример работы с моделью

    ...
    void StaffsModel::fillItems()
    {
        QSqlQuery query = dataBase->execS(commonQuery);
        while(query.next())
        {
            Staff *staff = Staff::Builder()
                .setName(query.value(0).toString())
                .setNumber(query.value(1).toString())
                .setAddress(query.value(2).toString())
                .setPersonalData(query.value(3).toString())
                .setDateOfBirth(query.value(4).toString())
                .setPredmet(query.value(5).toString())
                .setProfession(query.value(6).toString())
                .build();
        staffs.append(staff);
        }
    }
    void StaffsModel::updateDataInTable()
    {
        model->removeRows(0, model->columnCount());
        for(size_t row = 0; row < staffs.size(); row++)
        {
            Staff *staff = staffs.at(row);
            model->setItem(row, 0, new QStandardItem(staff->getName()));
            model->setItem(row, 1, new QStandardItem(staff->getNumber()));
            model->setItem(row, 2, new QStandardItem(staff->getAddress()));
            model->setItem(row, 4, new QStandardItem(staff->getPersonalData()));
            model->setItem(row, 4, new QStandardItem(staff->getDateOfBirth()));
            model->setItem(row, 5, new QStandardItem(staff->getPredmet()));
            model->setItem(row, 6, new QStandardItem(staff->getProfession()));
        }
    }
    ...
    

Не могу понять как это лучше делать и кой из методов является костыльным, может кто-нибудь подскажут?

READ ALSO
Как заменить пробелы на символ &ldquo;$&rdquo;?

Как заменить пробелы на символ “$”?

Здравствуйте! Как заменить пробелы символом “$” с помощью функций и манипуляторов?

296
Выключение экрана WinAPI C++

Выключение экрана WinAPI C++

Только учусь winAPI, весь вечер вчера пытался написать программу, которая бы выключала экран и включала при нажатие на клавишу F2, код нижеПроблема...

283
Что быстрее в длинном цикле - макрос или inline?

Что быстрее в длинном цикле - макрос или inline?

Например, есть цикл перевода YUY2 буфера в буфер BGR (от 100 до 900+ тысяч итераций):

232
Замена strcpy и ошибки C4996, E0304, C2660

Замена strcpy и ошибки C4996, E0304, C2660

Как можно заменить strcpy не теряя работоспособности?

987