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# для работы с базами данных