diff --git a/anbs_cpdb/Classes/MySqlEngine.cs b/anbs_cpdb/Classes/MySqlEngine.cs
new file mode 100644
index 0000000..8fe0d24
--- /dev/null
+++ b/anbs_cpdb/Classes/MySqlEngine.cs
@@ -0,0 +1,122 @@
+using anbs_cp.Database.Interfaces;
+using anbs_cp.Structs;
+
+using Dapper;
+
+using MySqlConnector;
+
+namespace anbs_cp.Database.Classes;
+
+public class MySqlEngine: IDbEngine
+{
+ ///
+ /// Конструктор
+ ///
+ /// Строка подключения базы данных
+ public MySqlEngine (string connectionString) => ConnectionString = connectionString;
+
+ ///
+ /// Строка подключения базы данных
+ ///
+ public string ConnectionString { get; set; }
+
+ #region Небезопасные методы
+ ///
+ /// Выполняем команду
+ ///
+ /// Запрос
+ /// Данные запроса
+ /// Успешно ли (есть ли хотя бы одна затронутая строки) выполнена команда
+ public async Task ExecuteAsync (string sql, object model)
+ {
+ // Подключаемся к БД
+ await using MySqlConnection connection = new(ConnectionString);
+
+ // Открываем соединение
+ await connection.OpenAsync();
+
+ // Выполняем команду и выводим результат
+ return await connection.ExecuteAsync(sql, model) > 0;
+ }
+
+ ///
+ /// Запрос на получение одной строки
+ ///
+ /// Тип передаваемого значения
+ /// Запрос
+ /// Данные запроса
+ /// Возвращает тип или значение по умолчанию
+ public async Task QueryRowAsync (string sql, object model)
+ {
+ // Подключаемся к БД
+ await using MySqlConnection connection = new(ConnectionString);
+
+ // Открываем соединение
+ await connection.OpenAsync();
+
+ // Выполняем запрос и выводим результат
+ return await connection.QueryFirstOrDefaultAsync(sql, model);
+ }
+
+ ///
+ /// Запрос
+ ///
+ /// Тип передаваемого значения
+ /// Запрос
+ /// Данные запроса
+ /// Возвращает массив типа или значение по умолчанию
+ public async Task> QueryAsync (string sql, object model)
+ {
+ // Подключаемся к БД
+ await using MySqlConnection? connection = new(ConnectionString);
+
+ // Открываем соединение
+ await connection.OpenAsync();
+
+ // Выполняем запрос и выводим результат
+ return await connection.QueryAsync(sql, model);
+ }
+
+ #endregion
+
+ #region Получение
+ public async Task> SelectAsync (string table, string[] columns, List> where, string? orderBy = null)
+ {
+ string sql = $@"SELECT
+ {(columns.Any() ? string.Join(", ", columns) : "*")}
+ FROM {table} ";
+
+ List whereCondition = new();
+
+ List paramsValues = new();
+
+ if (where.Any())
+ {
+ whereCondition.AddRange(where.Select(static whereItem => $"{whereItem.Key}=@{whereItem.Key}"));
+ paramsValues.AddRange(where.Select(static whereItem => $"@{whereItem.Key}={whereItem.Value}"));
+ }
+
+ if (whereCondition.Any())
+ sql += $" WHERE {string.Join(", ", whereCondition.ToArray())}";
+
+ if (orderBy != null)
+ sql += $" ORDER BY {orderBy}";
+
+ return await QueryAsync(sql, paramsValues.ToArray());
+ }
+
+ public async Task SelectRowAsync (string table, List columns, KeyValue where, string? orderBy = null) => throw new NotImplementedException();
+ #endregion
+
+ public async Task CountAsync (string table) => throw new NotImplementedException();
+
+ public async Task InsertAsync (string table, T entity, KeyValue primaryIndex) => throw new NotImplementedException();
+
+ public async Task InsertUpdateAsync (string table, T entity) => throw new NotImplementedException();
+
+ public async Task UpdateAsync (string table, T entity, KeyValue where) => throw new NotImplementedException();
+
+ public async Task DeleteAsync (string table, KeyValue where) => throw new NotImplementedException();
+
+ public async Task DeleteRowAsync (string table, KeyValue where) => throw new NotImplementedException();
+}}
\ No newline at end of file
diff --git a/anbs_cpdb/Interfaces/IDbEngine.cs b/anbs_cpdb/Interfaces/IDbEngine.cs
new file mode 100644
index 0000000..332713f
--- /dev/null
+++ b/anbs_cpdb/Interfaces/IDbEngine.cs
@@ -0,0 +1,72 @@
+using anbs_cp.Structs;
+
+namespace anbs_cp.Database.Interfaces;
+
+///
+/// Интерфейс для работы с базой данных
+///
+public interface IDbEngine
+{
+ ///
+ /// Строка подключения
+ ///
+ string ConnectionString { get; set; }
+
+ #region Небезопасные методы
+
+ Task ExecuteAsync (string sql, object model);
+
+ ///
+ /// Запрос на получение одной строки
+ ///
+ /// Тип передаваемого значения
+ /// Запрос
+ /// Данные запроса
+ /// Возвращает тип или значение по умолчанию
+ Task QueryRowAsync (string sql, object model);
+
+ ///
+ /// Запрос
+ ///
+ /// Тип передаваемого значения
+ /// Запрос
+ /// Данные запроса
+ /// Возвращает массив типа или значение по умолчанию
+ Task> QueryAsync (string sql, object model);
+
+ #endregion
+
+ #region Получение
+ Task> SelectAsync (string table, string[] columns, List> where, string? orderBy = null);
+
+ Task SelectRowAsync (string table, List columns, KeyValue where, string? orderBy = null);
+ #endregion
+
+ #region Вычисление числа элементов в таблице
+
+ Task CountAsync (string table);
+
+ #endregion
+
+ #region Добавление строки в таблицу
+
+ Task InsertAsync (string table, T entity, KeyValue primaryIndex);
+
+ Task InsertUpdateAsync (string table, T entity);
+
+ #endregion
+
+ #region Обновление строки в таблице
+
+ Task UpdateAsync (string table, T entity, KeyValue where);
+
+ #endregion
+
+ #region Удаление строк
+
+ Task DeleteAsync (string table, KeyValue where);
+
+ Task DeleteRowAsync (string table, KeyValue where);
+
+ #endregion
+}
\ No newline at end of file
diff --git a/anbs_cpdb/anbs_cpdb.csproj b/anbs_cpdb/anbs_cpdb.csproj
new file mode 100644
index 0000000..fd807b8
--- /dev/null
+++ b/anbs_cpdb/anbs_cpdb.csproj
@@ -0,0 +1,27 @@
+
+
+
+ net7.0
+ enable
+ enable
+ anbs_cp_db
+ anbs_cp.Database
+ True
+ ANBSoftware.ComponentsPack.Database
+ 2023.08.18
+ Александр Бабаев
+ Набор компонентов ANB Software для работы с БД
+ Библиотека полезных методов языка C# для работы с базами данных
+ Александр Бабаев
+ https://git.babaev-an.ru/babaev-an/anbsoftware_componentspack
+ https://git.babaev-an.ru/babaev-an/anbsoftware_componentspack
+ git
+
+
+
+
+
+
+
+
+
diff --git a/anbsoftware.componentspack.sln b/anbsoftware.componentspack.sln
index e2e10fa..1435a4a 100644
--- a/anbsoftware.componentspack.sln
+++ b/anbsoftware.componentspack.sln
@@ -17,6 +17,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "anbs_cpfn", "anbs_cpfn\anbs
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "anbs_cposinfo", "anbs_cposinfo\anbs_cposinfo.csproj", "{80E1FEA9-EEDA-4411-8EBA-11991432E98E}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "anbs_cpdb", "anbs_cpdb\anbs_cpdb.csproj", "{3796862F-F181-4A27-92D8-8BF13C4FD711}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -38,6 +40,10 @@ Global
{80E1FEA9-EEDA-4411-8EBA-11991432E98E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{80E1FEA9-EEDA-4411-8EBA-11991432E98E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{80E1FEA9-EEDA-4411-8EBA-11991432E98E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3796862F-F181-4A27-92D8-8BF13C4FD711}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {3796862F-F181-4A27-92D8-8BF13C4FD711}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3796862F-F181-4A27-92D8-8BF13C4FD711}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {3796862F-F181-4A27-92D8-8BF13C4FD711}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE