diff --git a/anbs_cp/Structs/KeyValueList.cs b/anbs_cp/Structs/KeyValueList.cs new file mode 100644 index 0000000..6531759 --- /dev/null +++ b/anbs_cp/Structs/KeyValueList.cs @@ -0,0 +1,145 @@ +namespace anbs_cp.Structs; + +/// +/// Список из пара ключ-значение +/// +/// Тип ключа +/// Тип значения +public struct KeyValueList +{ + /// + /// Хранение значений + /// + private readonly List> _list; + + #region Конструкторы + /// + /// Конструктор по умолчанию + /// + public KeyValueList () => _list = new(); + #endregion + + #region Свойства + /// + /// Список ключей из списка + /// + public IEnumerable Keys => GetKeys(); + #endregion + + #region Методы + + /// + /// Получает список ключей + /// + /// Список ключей + private IEnumerable GetKeys () => from keyValue in _list where keyValue.Key is not null select keyValue.Key; + + /// + /// Добавляет в список параметр + /// + /// Параметр + public void Add (KeyValue keyValue) => _list.Add(keyValue); + + /// + /// Добавляет в список параметр + /// + /// Ключ параметра + /// Значение + public void Add (TK key, TV value) => _list.Add(new(key, value)); + + /// + /// Изменяет значение + /// + /// Новое значение + public void ChangeValue (KeyValue keyValue) + { + // Если такой ключ не существует + if (!Contains(keyValue.Key!)) + { + // - тогда добавляю новое значение + Add(keyValue); + + // - прерываю + return; + } + + // Существующее значение + KeyValue existValue = GetItem(keyValue.Key!) ?? new(); + + // Удаляем существующее + _list.Remove(existValue); + + // Добавляем новое + _list.Add(keyValue); + } + + /// + /// Изменяет значение + /// + /// Ключ + /// Новое значение + public void ChangeValue (TK key, TV newValue) => ChangeValue(new(key, newValue)); + + /// + /// Получает элемент по ключу + /// + /// Ключ + /// Элемент + public KeyValue? GetItem (TK key) + { + // Ищем элемент в списке + foreach (KeyValue keyValueItem in _list.Where(keyValueItem => keyValueItem.Key!.Equals(key))) + // - возвращаем его при нахождении + return keyValueItem; + + // Элемент не найден -- вывожу null + return null; + } + + /// + /// Получает значение + /// + /// Ключ + /// Значение + public TV? GetValue (TK key) + { + // Если такой ключ не существует + if (!Contains(key)) + // Тогда возвращаю значение по умолчанию + return default; + + // Получаю элемент + KeyValue keyValue = GetItem(key) ?? new(); + + // Вывожу значение + return keyValue.Value; + } + + /// + /// Удаляет элемент из списка + /// + /// Элемент + public void Remove (KeyValue keyValue) => _list.Remove(keyValue); + + /// + /// Удаляет элемент из списка + /// + /// Ключ элемента + public void Remove (TK key) => Remove(GetItem(key) ?? new()); + + /// + /// Проверяет, содержится ли элемент в списке + /// + /// Элемент + /// Результат проверки + public bool Contains (KeyValue keyValue) => _list.Contains(keyValue); + + /// + /// Проверяет, содержится ли элемент в списке + /// + /// Ключ элемента + /// Результат проверки + public bool Contains (TK key) => Keys.Any(keyParam => keyParam!.Equals(key)); + + #endregion +} \ No newline at end of file diff --git a/anbs_cp/anbs_cp.csproj b/anbs_cp/anbs_cp.csproj index 8210ecd..2fb692f 100644 --- a/anbs_cp/anbs_cp.csproj +++ b/anbs_cp/anbs_cp.csproj @@ -2,7 +2,7 @@ net7.0 - 2023.813.1 + 2023.827.0 Александр Бабаев Набор компонентов ANB Software Библиотека полезных методов языка C# diff --git a/anbs_cpdb/Classes/MySqlEngine.cs b/anbs_cpdb/Classes/MySqlEngine.cs index 8f328ca..e280601 100644 --- a/anbs_cpdb/Classes/MySqlEngine.cs +++ b/anbs_cpdb/Classes/MySqlEngine.cs @@ -26,7 +26,7 @@ public class MySqlEngine: IDbEngine /// Запрос /// Данные запроса /// Количество затронутых строк - public async Task ExecuteAsync (string sql, object values) + public async Task ExecuteAsync (string sql, object? values = null) { // Подключаемся к БД await using MySqlConnection connection = new(ConnectionString); @@ -44,7 +44,7 @@ public class MySqlEngine: IDbEngine /// Запрос /// Данные запроса /// Количество затронутых строк - public int Execute (string sql, object values) => ExecuteAsync(sql, values).GetAwaiter().GetResult(); + public int Execute (string sql, object? values = null) => ExecuteAsync(sql, values).GetAwaiter().GetResult(); /// /// Запрос @@ -53,7 +53,7 @@ public class MySqlEngine: IDbEngine /// Запрос /// Данные запроса /// Возвращает массив типа или значение по умолчанию - public async Task> QueryAsync (string sql, object values) + public async Task> QueryAsync (string sql, object? values = null) { // Подключаемся к БД await using MySqlConnection connection = new(ConnectionString); @@ -72,7 +72,7 @@ public class MySqlEngine: IDbEngine /// Запрос /// Данные запроса /// Возвращает массив типа или значение по умолчанию - public IEnumerable Query (string sql, object values) => QueryAsync(sql, values).GetAwaiter().GetResult(); + public IEnumerable Query (string sql, object? values = null) => QueryAsync(sql, values).GetAwaiter().GetResult(); /// /// Запрос строки @@ -81,7 +81,7 @@ public class MySqlEngine: IDbEngine /// Запрос /// Данные запроса /// Возвращает массив типа или значение по умолчанию - public async Task QueryRowAsync (string sql, object values) + public async Task QueryRowAsync (string sql, object? values = null) { // Подключаемся к БД await using MySqlConnection connection = new(ConnectionString); @@ -100,7 +100,7 @@ public class MySqlEngine: IDbEngine /// Запрос /// Данные запроса /// Возвращает массив типа или значение по умолчанию - public T? QueryRow (string sql, object values) => QueryRowAsync(sql, values).GetAwaiter().GetResult(); + public T? QueryRow (string sql, object? values = null) => QueryRowAsync(sql, values).GetAwaiter().GetResult(); #endregion @@ -113,7 +113,7 @@ public class MySqlEngine: IDbEngine /// SQL-запрос /// Данные запроса /// Массив результата запроса - public async Task> GetResultsAsync (string sql, object values) => await QueryAsync(sql, values); + public async Task> GetResultsAsync (string sql, object? values = null) => await QueryAsync(sql, values); /// /// Получает массив данных (SELECT * FROM...) @@ -122,7 +122,7 @@ public class MySqlEngine: IDbEngine /// SQL-запрос /// Данные запроса /// Массив результата запроса - public IEnumerable GetResults (string sql, object values) => GetResultsAsync(sql, values).GetAwaiter().GetResult(); + public IEnumerable GetResults (string sql, object? values = null) => GetResultsAsync(sql, values).GetAwaiter().GetResult(); /// /// Получает строку в массиве данных @@ -131,7 +131,7 @@ public class MySqlEngine: IDbEngine /// SQL-запрос /// Данные запроса /// Строки данных или null - public async Task GetRowAsync (string sql, object values) + public async Task GetRowAsync (string sql, object? values = null) { // Подключаемся к БД await using MySqlConnection connection = new(ConnectionString); @@ -150,7 +150,7 @@ public class MySqlEngine: IDbEngine /// SQL-запрос /// Данные запроса /// Строки данных или null - public T? GetRow (string sql, object values) => GetRowAsync(sql, values).GetAwaiter().GetResult(); + public T? GetRow (string sql, object? values = null) => GetRowAsync(sql, values).GetAwaiter().GetResult(); /// /// Получает колонку в массиве данных @@ -159,7 +159,7 @@ public class MySqlEngine: IDbEngine /// SQL-запрос /// Данные запроса /// Колонка данных или null - public async Task> GetColAsync (string sql, object values) + public async Task> GetColAsync (string sql, object? values = null) where T : IComparable, IConvertible, IEquatable => await QueryAsync(sql, values); /// @@ -169,7 +169,7 @@ public class MySqlEngine: IDbEngine /// SQL-запрос /// Данные запроса /// Колонка данных или null - public IEnumerable GetCol (string sql, object values) where T : IComparable, IConvertible, IEquatable => + public IEnumerable GetCol (string sql, object? values = null) where T : IComparable, IConvertible, IEquatable => GetColAsync(sql, values).GetAwaiter().GetResult(); /// @@ -179,7 +179,7 @@ public class MySqlEngine: IDbEngine /// SQL-запрос /// Данные запроса /// Поле или null - public async Task GetVarAsync (string sql, object values) where T : IComparable, IConvertible, IEquatable + public async Task GetVarAsync (string sql, object? values = null) where T : IComparable, IConvertible, IEquatable { // Подключаемся к БД await using MySqlConnection connection = new(ConnectionString); @@ -198,7 +198,7 @@ public class MySqlEngine: IDbEngine /// SQL-запрос /// Данные запроса /// Поле или null - public T? GetVar (string sql, object values) where T : IComparable, IConvertible, IEquatable => + public T? GetVar (string sql, object? values = null) where T : IComparable, IConvertible, IEquatable => GetVarAsync(sql, values).GetAwaiter().GetResult(); #endregion @@ -363,7 +363,7 @@ public class MySqlEngine: IDbEngine /// Имя таблицы /// Условие поиска строки. ВНИМАНИЕ! Должно быть одним из указанных свойств типа класса data /// Результат выполнения - public bool DeleteRow(T data, string tableName, string whereConditionColumn) where T : class => + public bool DeleteRow (T data, string tableName, string whereConditionColumn) where T : class => DeleteRowAsync(data, tableName, whereConditionColumn).GetAwaiter().GetResult(); #endregion } \ No newline at end of file diff --git a/anbs_cpdb/Interfaces/IDbEngine.cs b/anbs_cpdb/Interfaces/IDbEngine.cs index 8499723..b4f5943 100644 --- a/anbs_cpdb/Interfaces/IDbEngine.cs +++ b/anbs_cpdb/Interfaces/IDbEngine.cs @@ -1,4 +1,6 @@ -namespace anbs_cp.Database.Interfaces; +using System.Transactions; + +namespace anbs_cp.Database.Interfaces; /// /// Интерфейс для работы с базой данных @@ -18,7 +20,7 @@ public interface IDbEngine /// Запрос /// Данные запроса /// Количество затронутых строк - Task ExecuteAsync (string sql, object values); + Task ExecuteAsync (string sql, object? values = null); /// /// Выполняем команду @@ -26,7 +28,7 @@ public interface IDbEngine /// Запрос /// Данные запроса /// Количество затронутых строк - int Execute (string sql, object values); + int Execute (string sql, object? values = null); /// /// Запрос @@ -35,7 +37,7 @@ public interface IDbEngine /// Запрос /// Данные запроса /// Возвращает массив типа или значение по умолчанию - Task> QueryAsync (string sql, object values); + Task> QueryAsync (string sql, object? values = null); /// /// Запрос @@ -44,7 +46,7 @@ public interface IDbEngine /// Запрос /// Данные запроса /// Возвращает массив типа или значение по умолчанию - IEnumerable Query (string sql, object values); + IEnumerable Query (string sql, object? values = null); /// /// Запрос строки @@ -53,7 +55,7 @@ public interface IDbEngine /// Запрос /// Данные запроса /// Возвращает массив типа или значение по умолчанию - Task QueryRowAsync (string sql, object values); + Task QueryRowAsync (string sql, object? values = null); /// /// Запрос строки @@ -62,7 +64,7 @@ public interface IDbEngine /// Запрос /// Данные запроса /// Возвращает массив типа или значение по умолчанию - T? QueryRow (string sql, object values); + T? QueryRow (string sql, object? values = null); #endregion #region Получение данных @@ -74,7 +76,7 @@ public interface IDbEngine /// SQL-запрос /// Данные запроса /// Массив результата запроса - Task> GetResultsAsync (string sql, object values); + Task> GetResultsAsync (string sql, object? values = null); /// /// Получает массив данных (SELECT * FROM...) @@ -83,7 +85,7 @@ public interface IDbEngine /// SQL-запрос /// Данные запроса /// Массив результата запроса - IEnumerable GetResults (string sql, object values); + IEnumerable GetResults (string sql, object? values = null); /// /// Получает строку в массиве данных @@ -92,7 +94,7 @@ public interface IDbEngine /// SQL-запрос /// Данные запроса /// Строки данных или null - Task GetRowAsync (string sql, object values); + Task GetRowAsync (string sql, object? values = null); /// /// Получает строку в массиве данных @@ -101,7 +103,7 @@ public interface IDbEngine /// SQL-запрос /// Данные запроса /// Строки данных или null - T? GetRow (string sql, object values); + T? GetRow (string sql, object? values = null); /// /// Получает колонку в массиве данных @@ -110,7 +112,7 @@ public interface IDbEngine /// SQL-запрос /// Данные запроса /// Колонка данных или null - Task> GetColAsync (string sql, object values) where T: IComparable, IConvertible, IEquatable; + Task> GetColAsync (string sql, object? values = null) where T: IComparable, IConvertible, IEquatable; /// /// Получает колонку в массиве данных @@ -119,7 +121,7 @@ public interface IDbEngine /// SQL-запрос /// Данные запроса /// Колонка данных или null - IEnumerable GetCol (string sql, object values) where T: IComparable, IConvertible, IEquatable; + IEnumerable GetCol (string sql, object? values = null) where T: IComparable, IConvertible, IEquatable; /// /// Получение значение единичного поля @@ -128,7 +130,7 @@ public interface IDbEngine /// SQL-запрос /// Данные запроса /// Поле или null - Task GetVarAsync (string sql, object values) where T: IComparable, IConvertible, IEquatable; + Task GetVarAsync (string sql, object? values = null) where T: IComparable, IConvertible, IEquatable; /// /// Получение значение единичного поля @@ -137,7 +139,7 @@ public interface IDbEngine /// SQL-запрос /// Данные запроса /// Поле или null - T? GetVar (string sql, object values) where T: IComparable, IConvertible, IEquatable; + T? GetVar (string sql, object? values = null) where T: IComparable, IConvertible, IEquatable; #endregion diff --git a/anbs_cpdb/anbs_cpdb.csproj b/anbs_cpdb/anbs_cpdb.csproj index 730b781..6987504 100644 --- a/anbs_cpdb/anbs_cpdb.csproj +++ b/anbs_cpdb/anbs_cpdb.csproj @@ -8,7 +8,7 @@ anbs_cp.Database True ANBSoftware.ComponentsPack.Database - 2023.08.19.4 + 2023.08.27.0 Александр Бабаев Набор компонентов ANB Software для работы с БД Библиотека полезных методов языка C# для работы с базами данных