Skip to content

Commit

Permalink
Add files via upload
Browse files Browse the repository at this point in the history
  • Loading branch information
Sniper53 authored Apr 6, 2023
1 parent d41f422 commit 3efa6bd
Show file tree
Hide file tree
Showing 15 changed files with 1,022 additions and 0 deletions.
42 changes: 42 additions & 0 deletions 08/08_DataBaseLect/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
cmake_minimum_required(VERSION 3.5)

project(08_DataBaseLect VERSION 0.1 LANGUAGES CXX)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(Qt6 REQUIRED COMPONENTS Widgets Sql Concurrent)


set(PROJECT_SOURCES
main.cpp
mainwindow.cpp
mainwindow.h
mainwindow.ui
database.h
database.cpp
dbdata.h
dbdata.cpp
dbdata.ui
)

add_executable(08_DataBaseLect
${PROJECT_SOURCES}
)


target_link_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/PG_Libs)
target_link_libraries(08_DataBaseLect PRIVATE Qt6::Widgets
Qt6::Sql
Qt6::Concurrent
libcrypto-3-x64
libiconv-2
libintl-9
libpq
libssl-3-x64)


Binary file added 08/08_DataBaseLect/PG_Libs/libcrypto-3-x64.dll
Binary file not shown.
Binary file added 08/08_DataBaseLect/PG_Libs/libiconv-2.dll
Binary file not shown.
Binary file added 08/08_DataBaseLect/PG_Libs/libintl-9.dll
Binary file not shown.
Binary file added 08/08_DataBaseLect/PG_Libs/libpq.dll
Binary file not shown.
Binary file added 08/08_DataBaseLect/PG_Libs/libssl-3-x64.dll
Binary file not shown.
184 changes: 184 additions & 0 deletions 08/08_DataBaseLect/database.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,184 @@
#include "database.h"

DataBase::DataBase(QObject *parent)
: QObject{parent}
{

/*Выделяем память под объекты классов.
*Объект QSqlDatabase является основным классом низкого уровня,
*в котором настраивается подключение к БД.
*/
dataBase = new QSqlDatabase();
//Объект QSqlQuery отвечает за формирование запросов к БД
simpleQuery = new QSqlQuery();
//QTableWidget необходим для формирования отображения ответа и передачи его в форму.
tableWidget = new QTableWidget();

}

DataBase::~DataBase()
{
delete dataBase;
}

/*!
* \brief Метод добавляет БД к экземпляру класса QSqlDataBase
* \param driver драйвер БД
* \param nameDB имя БД (Если отсутствует Qt задает имя по умолчанию)
*/
void DataBase::AddDataBase(QString driver, QString nameDB)
{
/* Класс QSqlDatabase представляет из себя интерфейс между
кодом и БД. Он организует соединение с БД. Для подключения
в конструктор класса необходимо передать драйвер БД и имя.
В объекте может храниться несколько подключений, они различаются именами.
*/
*dataBase = QSqlDatabase::addDatabase(driver, nameDB);

}

/*!
* \brief Метод подключается к БД
* \param для удобства передаем контейнер с данными необходимыми для подключения
* \return возвращает тип ошибки
*/
void DataBase::ConnectToDataBase(QVector<QString> data)
{
//Для подключения необходимо передать параметры БД в объект класса.
dataBase->setHostName(data[hostName]);
dataBase->setDatabaseName(data[dbName]);
dataBase->setUserName(data[login]);
dataBase->setPassword(data[pass]);
dataBase->setPort(data[port].toInt());
//Для подключения к БД используется метод open(), который возвращает true в случае успешного подключения.
bool status;
status = dataBase->open( );
emit sig_SendStatusConnection(status);

}
/*!
* \brief Метод производит отключение от БД
* \param Имя БД
*/
void DataBase::DisconnectFromDataBase(QString nameDb)
{

//Сначала выбираем имя БД
*dataBase = QSqlDatabase::database(nameDb);
//Метод close() закрывает соединение с БД
dataBase->close();

}
/*!
* \brief Метод формирует запрос к БД.
* \param request - SQL запрос
* \return
*/
void DataBase::RequestToDB(QString request)
{
/* Для фоомирования запроса будем использовать
* объект QSqlQuery.
* В конструктор передадим адрес объекта QSqlDatabase
*/
*simpleQuery = QSqlQuery(*dataBase);
/*
Выполнение запроса выполняется при помощи
метода exec. В случае успешного запроса он вернет true.
Если возникает какая либо ошибка, ее можно посмотреть
при помощи метода lastError. Этот метод возвращает
экземпляр класса QSqlError.
*/
QSqlError err;
if(simpleQuery->exec(request) == false){
err = simpleQuery->lastError();
}

emit sig_SendStatusRequest(err);

}

/*!
* \brief Метод читае ответ, полученный от БД при помощи QSqlQuery
* \param answerType - тип ответа
*/
void DataBase::ReadAnswerFromDB(int requestType)
{
/*
* Используем оператор switch для разделения запросов
*/
switch (requestType) {
//Для наших запросов вид таблицы не поменяетя. Поэтому бужет единый обработчик.
case requestAllFilms:
case requestComedy:
case requestHorrors:
{
/*
* Объект tableWidget представляет из себя таблицу, которую можно отобразить
* в ПИ. Зfдадим ее параметры и заголовки. Мы получаем из БД название фильма, год выпуска и жанр
*/

/* QSqlQuery
* После запроса к БД ответ помещается в объект QSqlQuery.
* Его необходимо считвать построчно. Для чтения ответа используется метод
* next, он работает следующим образом: при вызове метода указатель перемещается
* на следующую запись, в ответе. После получения ответа он указывает, если можно так
* выразится на -1 запись. Т.е. при первом вызове метода next указатель переместится
* на первую запись, а сам метод вернет true. В случае если указатель переместится
* за диапазон записей метод вернет false. Также он вернет false в случае отсутствия
* записей.
* Каждая запись является стройкой прочитанной из БД. Для перемещения по столбцам
* используется метод QSqlQuery value(индекс столбца).
*/
/* QTableWidget
* Необходимо сформировать таблицу, которую потом передадим в MainWindow для отображения
* Для каждой записи прочитанной при помощи метода next будем добавлять строку в tableWidget
* и заполнять значениями из ответа. Каждая ячейка таблицы является объектом класса
* QTableWidgetItem. Т.е. для заполнения каждой ячеки мы должны создать экземпляр этого метода.
* Значение ячейки в таблицк устанавливается при помощи метода setItem.
*/
/*
* После заполнения всей таблицы мы ее передаем в MainWindow при помощи сигнала.
*/

tableWidget->setColumnCount(3);
tableWidget->setRowCount(0);
QStringList hdrs;
hdrs << "Название" << "Год выпуска" << "Жанр";
tableWidget->setHorizontalHeaderLabels(hdrs);

uint32_t conterRows = 0;

while(simpleQuery->next()){
QString str;
tableWidget->insertRow(conterRows);

for(int i = 0; i<tableWidget->columnCount(); ++i){

str = simpleQuery->value(i).toString();
QTableWidgetItem *item = new QTableWidgetItem(str);
tableWidget->setItem(tableWidget->rowCount() - 1, i, item);

}
++conterRows;
}

emit sig_SendDataFromDB(tableWidget, requestAllFilms);

break;
}

default:
break;
}

}



/*!
* @brief Метод возвращает последнюю ошибку БД
*/
QSqlError DataBase::GetLastError()
{
return dataBase->lastError();
}
68 changes: 68 additions & 0 deletions 08/08_DataBaseLect/database.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
#ifndef DATABASE_H
#define DATABASE_H

#include <QTableWidget>
#include <QObject>
#include <QSqlDataBase>
#include <QSqlError>
#include <QSqlQuery>


#define POSTGRE_DRIVER "QPSQL"
#define DB_NAME "MyDB"

//Количество полей данных необходимых для подключения к БД
#define NUM_DATA_FOR_CONNECT_TO_DB 5

//Перечисление полей данных
enum fieldsForConnect{
hostName = 0,
dbName = 1,
login = 2,
pass = 3,
port = 4
};

//Типы запросов
enum requestType{

requestAllFilms = 1,
requestComedy = 2,
requestHorrors = 3

};



class DataBase : public QObject
{
Q_OBJECT

public:
explicit DataBase(QObject *parent = nullptr);
~DataBase();

void AddDataBase(QString driver, QString nameDB = "");
void DisconnectFromDataBase(QString nameDb = "");
void RequestToDB(QString request);
void ReadAnswerFromDB( int answerType );
QSqlError GetLastError(void);
void ConnectToDataBase(QVector<QString> dataForConnect);


signals:

void sig_SendDataFromDB(const QTableWidget *tableWg, int typeR);
void sig_SendStatusConnection(bool);
void sig_SendStatusRequest(QSqlError err);


private:

QSqlDatabase* dataBase;
QSqlQuery* simpleQuery;
QTableWidget* tableWidget;

};

#endif // DATABASE_H
38 changes: 38 additions & 0 deletions 08/08_DataBaseLect/dbdata.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
#include "dbdata.h"
#include "database.h"
#include "ui_dbdata.h"

DbData::DbData(QWidget *parent) :
QDialog(parent),
ui(new Ui::DbData)
{
ui->setupUi(this);


//Ресайзим вектор значений, по количеству полей необходимых для
//подключения к БД
data.resize(NUM_DATA_FOR_CONNECT_TO_DB);

}

DbData::~DbData()
{
delete ui;
}
/*!
* \brief Обработчик кнопки "Ок"
*/
void DbData::on_buttonBox_accepted()
{

//Добавляем данные в контейнер и передаем в главное окно
data[hostName] = ui->le_host->text();
data[dbName] = ui->le_dbName->text();
data[login] = ui->le_login->text();
data[pass] = ui->le_pass->text();
data[port] = ui->spB_port->text();

emit sig_sendData(data);

}

32 changes: 32 additions & 0 deletions 08/08_DataBaseLect/dbdata.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#ifndef DBDATA_H
#define DBDATA_H

#include <QDialog>

namespace Ui {
class DbData;
}

class DbData : public QDialog
{
Q_OBJECT

public:
explicit DbData(QWidget *parent = nullptr);
~DbData();


signals:
void sig_sendData(QVector<QString> dbData);


private slots:
void on_buttonBox_accepted();

private:
Ui::DbData *ui;
QVector<QString> data;

};

#endif // DBDATA_H
Loading

0 comments on commit 3efa6bd

Please sign in to comment.