From 4617d02649702e5c2da3bdf4465a08db2a2bafdf Mon Sep 17 00:00:00 2001 From: Alexander Date: Fri, 18 Aug 2023 18:22:16 +0300 Subject: [PATCH] 20230818 --- anbs_cpdb/Classes/MySqlEngine.cs | 122 ++++++++++++++++++++++++++++++ anbs_cpdb/Interfaces/IDbEngine.cs | 72 ++++++++++++++++++ anbs_cpdb/anbs_cpdb.csproj | 27 +++++++ anbsoftware.componentspack.sln | 6 ++ 4 files changed, 227 insertions(+) create mode 100644 anbs_cpdb/Classes/MySqlEngine.cs create mode 100644 anbs_cpdb/Interfaces/IDbEngine.cs create mode 100644 anbs_cpdb/anbs_cpdb.csproj 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