-
Notifications
You must be signed in to change notification settings - Fork 14
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
15 changed files
with
1,022 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | ||
|
||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
Oops, something went wrong.