20230819
This commit is contained in:
parent
2fdb100ee0
commit
9b37f0477e
@ -20,14 +20,14 @@ public class MySqlEngine: IDbEngine
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string ConnectionString { get; set; }
|
public string ConnectionString { get; set; }
|
||||||
|
|
||||||
#region Небезопасные методы
|
#region Базовые операции
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Выполняем команду
|
/// Выполняем команду
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="sql">Запрос</param>
|
/// <param name="sql">Запрос</param>
|
||||||
/// <param name="model">Данные запроса</param>
|
/// <param name="values">Данные запроса</param>
|
||||||
/// <returns>Успешно ли (есть ли хотя бы одна затронутая строки) выполнена команда</returns>
|
/// <returns>Количество затронутых строк</returns>
|
||||||
public async Task<bool> ExecuteAsync (string sql, object model)
|
public async Task<int> ExecuteAsync (string sql, object values)
|
||||||
{
|
{
|
||||||
// Подключаемся к БД
|
// Подключаемся к БД
|
||||||
await using MySqlConnection connection = new(ConnectionString);
|
await using MySqlConnection connection = new(ConnectionString);
|
||||||
@ -36,17 +36,25 @@ public class MySqlEngine: IDbEngine
|
|||||||
await connection.OpenAsync();
|
await connection.OpenAsync();
|
||||||
|
|
||||||
// Выполняем команду и выводим результат
|
// Выполняем команду и выводим результат
|
||||||
return await connection.ExecuteAsync(sql, model) > 0;
|
return await connection.ExecuteAsync(sql, values);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Запрос на получение одной строки
|
/// Выполняем команду
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="sql">Запрос</param>
|
||||||
|
/// <param name="values">Данные запроса</param>
|
||||||
|
/// <returns>Количество затронутых строк</returns>
|
||||||
|
public int Execute (string sql, object values) => ExecuteAsync(sql, values).GetAwaiter().GetResult();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Запрос
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <typeparam name="T">Тип передаваемого значения</typeparam>
|
/// <typeparam name="T">Тип передаваемого значения</typeparam>
|
||||||
/// <param name="sql">Запрос</param>
|
/// <param name="sql">Запрос</param>
|
||||||
/// <param name="model">Данные запроса</param>
|
/// <param name="values">Данные запроса</param>
|
||||||
/// <returns>Возвращает тип <see cref="T"/> или значение по умолчанию</returns>
|
/// <returns>Возвращает массив типа <see cref="T"/> или значение по умолчанию</returns>
|
||||||
public async Task<T> QueryRowAsync<T> (string sql, object model)
|
public async Task<IEnumerable<T>> QueryAsync<T> (string sql, object values)
|
||||||
{
|
{
|
||||||
// Подключаемся к БД
|
// Подключаемся к БД
|
||||||
await using MySqlConnection connection = new(ConnectionString);
|
await using MySqlConnection connection = new(ConnectionString);
|
||||||
@ -55,7 +63,7 @@ public class MySqlEngine: IDbEngine
|
|||||||
await connection.OpenAsync();
|
await connection.OpenAsync();
|
||||||
|
|
||||||
// Выполняем запрос и выводим результат
|
// Выполняем запрос и выводим результат
|
||||||
return await connection.QueryFirstOrDefaultAsync<T>(sql, model);
|
return await connection.QueryAsync<T>(sql, values);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -63,9 +71,18 @@ public class MySqlEngine: IDbEngine
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <typeparam name="T">Тип передаваемого значения</typeparam>
|
/// <typeparam name="T">Тип передаваемого значения</typeparam>
|
||||||
/// <param name="sql">Запрос</param>
|
/// <param name="sql">Запрос</param>
|
||||||
/// <param name="model">Данные запроса</param>
|
/// <param name="values">Данные запроса</param>
|
||||||
/// <returns>Возвращает массив типа <see cref="T"/> или значение по умолчанию</returns>
|
/// <returns>Возвращает массив типа <see cref="T"/> или значение по умолчанию</returns>
|
||||||
public async Task<IEnumerable<T>> QueryAsync<T> (string sql, object model)
|
public IEnumerable<T> Query<T> (string sql, object values) => QueryAsync<T>(sql, values).GetAwaiter().GetResult();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Запрос строки
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T">Тип передаваемого значения</typeparam>
|
||||||
|
/// <param name="sql">Запрос</param>
|
||||||
|
/// <param name="values">Данные запроса</param>
|
||||||
|
/// <returns>Возвращает массив типа <see cref="T"/> или значение по умолчанию</returns>
|
||||||
|
public async Task<T?> QueryRowAsync<T> (string sql, object values)
|
||||||
{
|
{
|
||||||
// Подключаемся к БД
|
// Подключаемся к БД
|
||||||
await using MySqlConnection connection = new(ConnectionString);
|
await using MySqlConnection connection = new(ConnectionString);
|
||||||
@ -74,105 +91,275 @@ public class MySqlEngine: IDbEngine
|
|||||||
await connection.OpenAsync();
|
await connection.OpenAsync();
|
||||||
|
|
||||||
// Выполняем запрос и выводим результат
|
// Выполняем запрос и выводим результат
|
||||||
return await connection.QueryAsync<T>(sql, model);
|
return await connection.QuerySingleOrDefaultAsync<T>(sql, values);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Запрос строки
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T">Тип передаваемого значения</typeparam>
|
||||||
|
/// <param name="sql">Запрос</param>
|
||||||
|
/// <param name="values">Данные запроса</param>
|
||||||
|
/// <returns>Возвращает массив типа <see cref="T"/> или значение по умолчанию</returns>
|
||||||
|
public T? QueryRow<T> (string sql, object values) => QueryRowAsync<T>(sql, values).GetAwaiter().GetResult();
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Получение
|
|
||||||
|
#region Получение данных
|
||||||
|
/// <summary>
|
||||||
|
/// Получает массив данных (SELECT * FROM...)
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T">Тип получаемых данных</typeparam>
|
||||||
|
/// <param name="sql">SQL-запрос</param>
|
||||||
|
/// <param name="values">Данные запроса</param>
|
||||||
|
/// <returns>Массив результата запроса</returns>
|
||||||
|
public async Task<IEnumerable<T>> GetResultsAsync<T> (string sql, object values) => await QueryAsync<T>(sql, values);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Выборка данных из таблицы
|
/// Получает массив данных (SELECT * FROM...)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <typeparam name="T">Тип данных</typeparam>
|
/// <typeparam name="T">Тип получаемых данных</typeparam>
|
||||||
/// <param name="table">Имя таблицы</param>
|
/// <param name="sql">SQL-запрос</param>
|
||||||
/// <param name="columns">Выбор столбцов таблицы, которые должны попасть в выборку (пустая -- все)</param>
|
/// <param name="values">Данные запроса</param>
|
||||||
/// <param name="where">Массив значений столбцов, которые должны попасть в выборку</param>
|
/// <returns>Массив результата запроса</returns>
|
||||||
/// <param name="orderBy">Сортировка</param>
|
public IEnumerable<T> GetResults<T> (string sql, object values) => GetResultsAsync<T>(sql, values).GetAwaiter().GetResult();
|
||||||
/// <param name="limit">Сколько максимально элементов должно быть в выборке (0 -- без ограничения)</param>
|
|
||||||
/// <returns>Массив типа <see cref="T"/></returns>
|
/// <summary>
|
||||||
public async Task<IEnumerable<T>> SelectAsync<T>(string table, string[] columns,
|
/// Получает строку в массиве данных
|
||||||
List<KeyValue<string, string>> where, string? orderBy, int limit = 0)
|
/// </summary>
|
||||||
|
/// <typeparam name="T">Тип получаемых данных</typeparam>
|
||||||
|
/// <param name="sql">SQL-запрос</param>
|
||||||
|
/// <param name="values">Данные запроса</param>
|
||||||
|
/// <returns>Строки данных или null</returns>
|
||||||
|
public async Task<T?> GetRowAsync<T> (string sql, object values)
|
||||||
{
|
{
|
||||||
// Формирую запрос
|
// Подключаемся к БД
|
||||||
|
await using MySqlConnection connection = new(ConnectionString);
|
||||||
|
|
||||||
|
// Открываем соединение
|
||||||
|
await connection.OpenAsync();
|
||||||
|
|
||||||
|
// Выполняем запрос и выводим результат
|
||||||
|
return await connection.QuerySingleOrDefaultAsync<T>(sql, values);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Получает строку в массиве данных
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T">Тип получаемых данных</typeparam>
|
||||||
|
/// <param name="sql">SQL-запрос</param>
|
||||||
|
/// <param name="values">Данные запроса</param>
|
||||||
|
/// <returns>Строки данных или null</returns>
|
||||||
|
public T? GetRow<T> (string sql, object values) => GetRowAsync<T>(sql, values).GetAwaiter().GetResult();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Получает колонку в массиве данных
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T">Тип получаемых данных</typeparam>
|
||||||
|
/// <param name="sql">SQL-запрос</param>
|
||||||
|
/// <param name="values">Данные запроса</param>
|
||||||
|
/// <returns>Колонка данных или null</returns>
|
||||||
|
public async Task<IEnumerable<T>> GetColAsync<T> (string sql, object values)
|
||||||
|
where T : IComparable, IConvertible, IEquatable<T> => await QueryAsync<T>(sql, values);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Получает колонку в массиве данных
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T">Тип получаемых данных</typeparam>
|
||||||
|
/// <param name="sql">SQL-запрос</param>
|
||||||
|
/// <param name="values">Данные запроса</param>
|
||||||
|
/// <returns>Колонка данных или null</returns>
|
||||||
|
public IEnumerable<T> GetCol<T> (string sql, object values) where T : IComparable, IConvertible, IEquatable<T> =>
|
||||||
|
GetColAsync<T>(sql, values).GetAwaiter().GetResult();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Получение значение единичного поля
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T">Тип получаемых данных</typeparam>
|
||||||
|
/// <param name="sql">SQL-запрос</param>
|
||||||
|
/// <param name="values">Данные запроса</param>
|
||||||
|
/// <returns>Поле или null</returns>
|
||||||
|
public async Task<T?> GetVarAsync<T> (string sql, object values) where T : IComparable, IConvertible, IEquatable<T>
|
||||||
|
{
|
||||||
|
// Подключаемся к БД
|
||||||
|
await using MySqlConnection connection = new(ConnectionString);
|
||||||
|
|
||||||
|
// Открываем соединение
|
||||||
|
await connection.OpenAsync();
|
||||||
|
|
||||||
|
// Выполняем запрос и выводим результат
|
||||||
|
return await connection.QuerySingleOrDefaultAsync<T>(sql, values);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Получение значение единичного поля
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T">Тип получаемых данных</typeparam>
|
||||||
|
/// <param name="sql">SQL-запрос</param>
|
||||||
|
/// <param name="values">Данные запроса</param>
|
||||||
|
/// <returns>Поле или null</returns>
|
||||||
|
public T? GetVar<T> (string sql, object values) where T : IComparable, IConvertible, IEquatable<T> =>
|
||||||
|
GetVarAsync<T>(sql, values).GetAwaiter().GetResult();
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region CRUD данные
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Вставляет данные в таблицу
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T">Класс данных</typeparam>
|
||||||
|
/// <param name="data">Данные</param>
|
||||||
|
/// <param name="tableName">Имя таблицы</param>
|
||||||
|
/// <returns>Результат выполнения</returns>
|
||||||
|
public async Task<bool> InsertAsync<T> (T data, string tableName) where T : class
|
||||||
|
{
|
||||||
|
// Получение список имён свойств в data
|
||||||
|
List<string> propertyNamesList = (from dataProperty in data.GetType().GetProperties() select dataProperty.Name).ToList();
|
||||||
|
|
||||||
|
// Получаем список имён в data, обрамленные @
|
||||||
|
List<string> propertyValuesList = propertyNamesList.Select(static propertyName => $"@{propertyName}").ToList();
|
||||||
|
|
||||||
|
//Получаем строку имён свойств
|
||||||
|
string propertyNames = string.Join(", ", propertyNamesList.ToArray());
|
||||||
|
|
||||||
|
// Получаем строку имён свойств, обрамленных @
|
||||||
|
string propertyValues = string.Join(", ", propertyValuesList.ToArray());
|
||||||
|
|
||||||
|
// Создаю соединение
|
||||||
|
await using MySqlConnection connection = new(ConnectionString);
|
||||||
|
|
||||||
|
// Создаю запрос
|
||||||
string sql = $"""
|
string sql = $"""
|
||||||
SELECT
|
INSERT
|
||||||
{(columns.Any() ? string.Join(", ", columns) : "*")}
|
INTO {tableName} ({propertyNames})
|
||||||
FROM {table}
|
VALUES ({propertyValues})
|
||||||
""";
|
""";
|
||||||
|
|
||||||
// Создаю массив where параметров
|
// Выполняю запрос
|
||||||
List<string> whereCondition = new();
|
return await connection.ExecuteAsync(sql, data) > 0;
|
||||||
|
|
||||||
// Создаю массив значений
|
|
||||||
List<string> paramsValues = new();
|
|
||||||
|
|
||||||
// Если заданы параметры where
|
|
||||||
if (where.Any())
|
|
||||||
{
|
|
||||||
// - то формирую массив where из where-запроса
|
|
||||||
whereCondition.AddRange(where.Select(static whereItem => $"{whereItem.Key}=@{whereItem.Key}"));
|
|
||||||
// - и значения параметров
|
|
||||||
paramsValues.AddRange(where.Select(static whereItem => $"@{whereItem.Key}={whereItem.Value}"));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Если массив where параметров не пуст
|
|
||||||
if (whereCondition.Any())
|
|
||||||
// - то добавляю к запросу
|
|
||||||
sql += $" WHERE {string.Join(", ", whereCondition.ToArray())}";
|
|
||||||
|
|
||||||
// Если добавлена сортировка
|
|
||||||
if (orderBy != null)
|
|
||||||
// - то добавляю сортировку к запросу
|
|
||||||
sql += $" ORDER BY {orderBy}";
|
|
||||||
|
|
||||||
// Если установлено запрашиваемое число элементов
|
|
||||||
if (limit > 0)
|
|
||||||
// - то вводим ограничение
|
|
||||||
sql += $" LIMIT {limit}";
|
|
||||||
|
|
||||||
// Осуществляю запрос и возвращаю результат
|
|
||||||
return await QueryAsync<T>(sql, paramsValues.ToArray());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Выборка строки из таблицы
|
/// Вставляет данные в таблицу
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <typeparam name="T">Тип данных</typeparam>
|
/// <typeparam name="T">Класс данных</typeparam>
|
||||||
/// <param name="table">Имя таблицы</param>
|
/// <param name="data">Данные</param>
|
||||||
/// <param name="columns">Выбор столбцов таблицы, которые должны попасть в выборку (пустая -- все)</param>
|
/// <param name="tableName">Имя таблицы</param>
|
||||||
/// <param name="where">Массив значений столбцов, которые должны попасть в выборку</param>
|
/// <returns>Результат выполнения</returns>
|
||||||
/// <param name="orderBy">Сортировка</param>
|
public bool Insert<T> (T data, string tableName) where T : class => InsertAsync(data, tableName).GetAwaiter().GetResult();
|
||||||
/// <returns>Тип <see cref="T"/> или null</returns>
|
|
||||||
public async Task<T?> SelectRowAsync<T>(string table, string[] columns, List<KeyValue<string, string>> where,
|
|
||||||
string? orderBy = null) => (await SelectAsync<T>(table, columns, where, orderBy, 1)).FirstOrDefault();
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region Вычисление числа элементов в таблице
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Вычисляет число строк в таблице <paramref name="table"/>
|
/// Обновляет строку в таблице
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="table">Таблица</param>
|
/// <typeparam name="T">Класс данных</typeparam>
|
||||||
/// <returns>Число строк в таблице <paramref name="table"/></returns>
|
/// <param name="data">Данные</param>
|
||||||
public async Task<int> CountAsync(string table)
|
/// <param name="tableName">Имя таблицы</param>
|
||||||
|
/// <param name="whereConditionColumn">Условие поиска строки. ВНИМАНИЕ! Должно быть одним из указанных свойств типа класса data</param>
|
||||||
|
/// <returns>Результат выполнения</returns>
|
||||||
|
public async Task<bool> UpdateAsync<T> (T data, string tableName, string whereConditionColumn) where T : class
|
||||||
{
|
{
|
||||||
// Задаю запрос
|
// Получение список имён свойств в data
|
||||||
string sql = $"SELECT COUNT(*) FROM {table}";
|
List<string> propertyNamesList = (from dataProperty in data.GetType().GetProperties()
|
||||||
|
where dataProperty.Name != whereConditionColumn
|
||||||
|
select dataProperty.Name).ToList();
|
||||||
|
|
||||||
|
// Получаем список имён в data, обрамленные @
|
||||||
|
List<string> propertyKeyValuesList = propertyNamesList.Select(static propertyName => $"{propertyName}=@{propertyName}").ToList();
|
||||||
|
|
||||||
|
// Получаем строку имён свойств, обрамленных @
|
||||||
|
string properties = string.Join(", ", propertyKeyValuesList.ToArray());
|
||||||
|
|
||||||
|
// Создаю соединение
|
||||||
|
await using MySqlConnection connection = new(ConnectionString);
|
||||||
|
|
||||||
|
// Создаю запрос
|
||||||
|
string sql = $"""
|
||||||
|
UPDATE
|
||||||
|
{tableName}
|
||||||
|
SET
|
||||||
|
({properties})
|
||||||
|
WHERE
|
||||||
|
{whereConditionColumn}=@{whereConditionColumn}
|
||||||
|
""";
|
||||||
|
|
||||||
// Выполняю запрос
|
// Выполняю запрос
|
||||||
return (await QueryAsync<int>(sql, new())).FirstOrDefault();
|
return await connection.ExecuteAsync(sql, data) > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Обновляет строку в таблице
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T">Класс данных</typeparam>
|
||||||
|
/// <param name="data">Данные</param>
|
||||||
|
/// <param name="tableName">Имя таблицы</param>
|
||||||
|
/// <param name="whereConditionColumn">Условие поиска строки. ВНИМАНИЕ! Должно быть одним из указанных свойств типа класса data</param>
|
||||||
|
/// <returns>Результат выполнения</returns>
|
||||||
|
public bool Update<T> (T data, string tableName, string whereConditionColumn) where T : class =>
|
||||||
|
UpdateAsync(data, tableName, whereConditionColumn).GetAwaiter().GetResult();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Удаляет строки
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="tableName">Имя таблицы</param>
|
||||||
|
/// <param name="where">Условие</param>
|
||||||
|
/// <returns>Результат выполнения</returns>
|
||||||
|
public async Task<bool> DeleteAsync (string tableName, KeyValue<string, object> where)
|
||||||
|
{
|
||||||
|
// Создаю соединение
|
||||||
|
await using MySqlConnection connection = new(ConnectionString);
|
||||||
|
|
||||||
|
// Создаю запрос
|
||||||
|
string sql = $"""
|
||||||
|
DELETE FROM
|
||||||
|
{tableName}
|
||||||
|
WHERE
|
||||||
|
{where.Key}=@{where.Key}
|
||||||
|
""";
|
||||||
|
|
||||||
|
// Выполняю запрос
|
||||||
|
return await connection.ExecuteAsync(sql, new { where.Value }) > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Удаляет строки
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="tableName">Имя таблицы</param>
|
||||||
|
/// <param name="where">Условие</param>
|
||||||
|
/// <returns>Результат выполнения</returns>
|
||||||
|
public bool Delete (string tableName, KeyValue<string, object> where) => DeleteAsync(tableName, where).GetAwaiter().GetResult();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Удаляет строку
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="tableName">Имя таблицы</param>
|
||||||
|
/// <param name="where">Условие</param>
|
||||||
|
/// <returns>Результат выполнения</returns>
|
||||||
|
public async Task<bool> DeleteRowAsync (string tableName, KeyValue<string, object> where)
|
||||||
|
{
|
||||||
|
// Создаю соединение
|
||||||
|
await using MySqlConnection connection = new(ConnectionString);
|
||||||
|
|
||||||
|
// Создаю запрос
|
||||||
|
string sql = $"""
|
||||||
|
DELETE FROM
|
||||||
|
{tableName}
|
||||||
|
WHERE
|
||||||
|
{where.Key}=@{where.Key}
|
||||||
|
LIMIT 1
|
||||||
|
""";
|
||||||
|
|
||||||
|
// Выполняю запрос
|
||||||
|
return await connection.ExecuteAsync(sql, new { where.Value }) > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Удаляет строку
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="tableName">Имя таблицы</param>
|
||||||
|
/// <param name="where">Условие</param>
|
||||||
|
/// <returns>Результат выполнения</returns>
|
||||||
|
public bool DeleteRow (string tableName, KeyValue<string, object> where) => DeleteRowAsync(tableName, where).GetAwaiter().GetResult();
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
public async Task<TPit> InsertAsync<T, TPit> (string table, T entity, KeyValue<string, TPit> primaryIndex) => throw new NotImplementedException();
|
|
||||||
|
|
||||||
public async Task<bool> InsertUpdateAsync<T> (string table, T entity) => throw new NotImplementedException();
|
|
||||||
|
|
||||||
public async Task<bool> UpdateAsync<T> (string table, T entity, KeyValue<string, string> where) => throw new NotImplementedException();
|
|
||||||
|
|
||||||
public async Task<bool> DeleteAsync<T> (string table, KeyValue<string, string> where) => throw new NotImplementedException();
|
|
||||||
|
|
||||||
public async Task<bool> DeleteRowAsync<T> (string table, KeyValue<string, string> where) => throw new NotImplementedException();
|
|
||||||
}
|
}
|
@ -12,84 +12,206 @@ public interface IDbEngine
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
string ConnectionString { get; set; }
|
string ConnectionString { get; set; }
|
||||||
|
|
||||||
#region Небезопасные методы
|
#region Базовые операции
|
||||||
|
|
||||||
Task<bool> ExecuteAsync (string sql, object model);
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Запрос на получение одной строки
|
/// Выполняем команду
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <typeparam name="T">Тип передаваемого значения</typeparam>
|
|
||||||
/// <param name="sql">Запрос</param>
|
/// <param name="sql">Запрос</param>
|
||||||
/// <param name="model">Данные запроса</param>
|
/// <param name="values">Данные запроса</param>
|
||||||
/// <returns>Возвращает тип <see cref="T"/> или значение по умолчанию</returns>
|
/// <returns>Количество затронутых строк</returns>
|
||||||
Task<T> QueryRowAsync<T> (string sql, object model);
|
Task<int> ExecuteAsync (string sql, object values);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Выполняем команду
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="sql">Запрос</param>
|
||||||
|
/// <param name="values">Данные запроса</param>
|
||||||
|
/// <returns>Количество затронутых строк</returns>
|
||||||
|
int Execute (string sql, object values);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Запрос
|
/// Запрос
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <typeparam name="T">Тип передаваемого значения</typeparam>
|
/// <typeparam name="T">Тип передаваемого значения</typeparam>
|
||||||
/// <param name="sql">Запрос</param>
|
/// <param name="sql">Запрос</param>
|
||||||
/// <param name="model">Данные запроса</param>
|
/// <param name="values">Данные запроса</param>
|
||||||
/// <returns>Возвращает массив типа <see cref="T"/> или значение по умолчанию</returns>
|
/// <returns>Возвращает массив типа <see cref="T"/> или значение по умолчанию</returns>
|
||||||
Task<IEnumerable<T>> QueryAsync<T> (string sql, object model);
|
Task<IEnumerable<T>> QueryAsync<T> (string sql, object values);
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region Получение
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Выборка данных из таблицы
|
/// Запрос
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <typeparam name="T">Тип данных</typeparam>
|
/// <typeparam name="T">Тип передаваемого значения</typeparam>
|
||||||
/// <param name="table">Имя таблицы</param>
|
/// <param name="sql">Запрос</param>
|
||||||
/// <param name="columns">Выбор столбцов таблицы, которые должны попасть в выборку (пустая -- все)</param>
|
/// <param name="values">Данные запроса</param>
|
||||||
/// <param name="where">Массив значений столбцов, которые должны попасть в выборку</param>
|
/// <returns>Возвращает массив типа <see cref="T"/> или значение по умолчанию</returns>
|
||||||
/// <param name="orderBy">Сортировка</param>
|
IEnumerable<T> Query<T> (string sql, object values);
|
||||||
/// <param name="limit">Сколько максимально элементов должно быть в выборке (0 -- без ограничения)</param>
|
|
||||||
/// <returns>Массив типа <see cref="T"/></returns>
|
|
||||||
Task<IEnumerable<T>> SelectAsync<T> (string table, string[] columns, List<KeyValue<string, string>> where, string? orderBy, int limit = 0);
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Выборка строки из таблицы
|
/// Запрос строки
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <typeparam name="T">Тип данных</typeparam>
|
/// <typeparam name="T">Тип передаваемого значения</typeparam>
|
||||||
/// <param name="table">Имя таблицы</param>
|
/// <param name="sql">Запрос</param>
|
||||||
/// <param name="columns">Выбор столбцов таблицы, которые должны попасть в выборку (пустая -- все)</param>
|
/// <param name="values">Данные запроса</param>
|
||||||
/// <param name="where">Массив значений столбцов, которые должны попасть в выборку</param>
|
/// <returns>Возвращает массив типа <see cref="T"/> или значение по умолчанию</returns>
|
||||||
/// <param name="orderBy">Сортировка</param>
|
Task<T?> QueryRowAsync<T> (string sql, object values);
|
||||||
/// <returns>Тип <see cref="T"/> или null</returns>
|
|
||||||
Task<T?> SelectRowAsync<T> (string table, string[] columns, List<KeyValue<string, string>> where, string? orderBy = null);
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region Вычисление числа элементов в таблице
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Вычисляет число строк в таблице <paramref name="table"/>
|
/// Запрос строки
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="table">Таблица</param>
|
/// <typeparam name="T">Тип передаваемого значения</typeparam>
|
||||||
/// <returns>Число строк в таблице <paramref name="table"/></returns>
|
/// <param name="sql">Запрос</param>
|
||||||
Task<int> CountAsync (string table);
|
/// <param name="values">Данные запроса</param>
|
||||||
|
/// <returns>Возвращает массив типа <see cref="T"/> или значение по умолчанию</returns>
|
||||||
|
T? QueryRow<T> (string sql, object values);
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Добавление строки в таблицу
|
#region Получение данных
|
||||||
|
|
||||||
Task<TPit> InsertAsync<T, TPit> (string table, T entity, KeyValue<string, TPit> primaryIndex);
|
/// <summary>
|
||||||
|
/// Получает массив данных (SELECT * FROM...)
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T">Тип получаемых данных</typeparam>
|
||||||
|
/// <param name="sql">SQL-запрос</param>
|
||||||
|
/// <param name="values">Данные запроса</param>
|
||||||
|
/// <returns>Массив результата запроса</returns>
|
||||||
|
Task<IEnumerable<T>> GetResultsAsync<T> (string sql, object values);
|
||||||
|
|
||||||
Task<bool> InsertUpdateAsync<T> (string table, T entity);
|
/// <summary>
|
||||||
|
/// Получает массив данных (SELECT * FROM...)
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T">Тип получаемых данных</typeparam>
|
||||||
|
/// <param name="sql">SQL-запрос</param>
|
||||||
|
/// <param name="values">Данные запроса</param>
|
||||||
|
/// <returns>Массив результата запроса</returns>
|
||||||
|
IEnumerable<T> GetResults<T> (string sql, object values);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Получает строку в массиве данных
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T">Тип получаемых данных</typeparam>
|
||||||
|
/// <param name="sql">SQL-запрос</param>
|
||||||
|
/// <param name="values">Данные запроса</param>
|
||||||
|
/// <returns>Строки данных или null</returns>
|
||||||
|
Task<T?> GetRowAsync<T> (string sql, object values);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Получает строку в массиве данных
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T">Тип получаемых данных</typeparam>
|
||||||
|
/// <param name="sql">SQL-запрос</param>
|
||||||
|
/// <param name="values">Данные запроса</param>
|
||||||
|
/// <returns>Строки данных или null</returns>
|
||||||
|
T? GetRow<T> (string sql, object values);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Получает колонку в массиве данных
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T">Тип получаемых данных</typeparam>
|
||||||
|
/// <param name="sql">SQL-запрос</param>
|
||||||
|
/// <param name="values">Данные запроса</param>
|
||||||
|
/// <returns>Колонка данных или null</returns>
|
||||||
|
Task<IEnumerable<T>> GetColAsync<T> (string sql, object values) where T : IComparable, IConvertible, IEquatable<T>;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Получает колонку в массиве данных
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T">Тип получаемых данных</typeparam>
|
||||||
|
/// <param name="sql">SQL-запрос</param>
|
||||||
|
/// <param name="values">Данные запроса</param>
|
||||||
|
/// <returns>Колонка данных или null</returns>
|
||||||
|
IEnumerable<T> GetCol<T> (string sql, object values) where T : IComparable, IConvertible, IEquatable<T>;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Получение значение единичного поля
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T">Тип получаемых данных</typeparam>
|
||||||
|
/// <param name="sql">SQL-запрос</param>
|
||||||
|
/// <param name="values">Данные запроса</param>
|
||||||
|
/// <returns>Поле или null</returns>
|
||||||
|
Task<T?> GetVarAsync<T> (string sql, object values) where T : IComparable, IConvertible, IEquatable<T>;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Получение значение единичного поля
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T">Тип получаемых данных</typeparam>
|
||||||
|
/// <param name="sql">SQL-запрос</param>
|
||||||
|
/// <param name="values">Данные запроса</param>
|
||||||
|
/// <returns>Поле или null</returns>
|
||||||
|
T? GetVar<T> (string sql, object values) where T : IComparable, IConvertible, IEquatable<T>;
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Обновление строки в таблице
|
#region CRUD данные
|
||||||
|
/// <summary>
|
||||||
|
/// Вставляет данные в таблицу
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T">Класс данных</typeparam>
|
||||||
|
/// <param name="data">Данные</param>
|
||||||
|
/// <param name="tableName">Имя таблицы</param>
|
||||||
|
/// <returns>Результат выполнения</returns>
|
||||||
|
Task<bool> InsertAsync<T> (T data, string tableName) where T : class;
|
||||||
|
|
||||||
Task<bool> UpdateAsync<T> (string table, T entity, KeyValue<string, string> where);
|
/// <summary>
|
||||||
|
/// Вставляет данные в таблицу
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T">Класс данных</typeparam>
|
||||||
|
/// <param name="data">Данные</param>
|
||||||
|
/// <param name="tableName">Имя таблицы</param>
|
||||||
|
/// <returns>Результат выполнения</returns>
|
||||||
|
bool Insert<T> (T data, string tableName) where T : class;
|
||||||
|
|
||||||
#endregion
|
/// <summary>
|
||||||
|
/// Обновляет строку в таблице
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T">Класс данных</typeparam>
|
||||||
|
/// <param name="data">Данные</param>
|
||||||
|
/// <param name="tableName">Имя таблицы</param>
|
||||||
|
/// <param name="whereConditionColumn">Условие поиска строки. ВНИМАНИЕ! Должно быть одним из указанных свойств типа класса data</param>
|
||||||
|
/// <returns>Результат выполнения</returns>
|
||||||
|
Task<bool> UpdateAsync<T> (T data, string tableName, string whereConditionColumn) where T : class;
|
||||||
|
|
||||||
#region Удаление строк
|
/// <summary>
|
||||||
|
/// Обновляет строку в таблице
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T">Класс данных</typeparam>
|
||||||
|
/// <param name="data">Данные</param>
|
||||||
|
/// <param name="tableName">Имя таблицы</param>
|
||||||
|
/// <param name="whereConditionColumn">Условие поиска строки. ВНИМАНИЕ! Должно быть одним из указанных свойств типа класса data</param>
|
||||||
|
/// <returns>Результат выполнения</returns>
|
||||||
|
bool Update<T> (T data, string tableName, string whereConditionColumn) where T : class;
|
||||||
|
|
||||||
Task<bool> DeleteAsync<T> (string table, KeyValue<string, string> where);
|
/// <summary>
|
||||||
|
/// Удаляет строки
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="tableName">Имя таблицы</param>
|
||||||
|
/// <param name="where">Условие</param>
|
||||||
|
/// <returns>Результат выполнения</returns>
|
||||||
|
Task<bool> DeleteAsync (string tableName, KeyValue<string, object> where);
|
||||||
|
|
||||||
Task<bool> DeleteRowAsync<T> (string table, KeyValue<string, string> where);
|
/// <summary>
|
||||||
|
/// Удаляет строки
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="tableName">Имя таблицы</param>
|
||||||
|
/// <param name="where">Условие</param>
|
||||||
|
/// <returns>Результат выполнения</returns>
|
||||||
|
bool Delete (string tableName, KeyValue<string, object> where);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Удаляет строку
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="tableName">Имя таблицы</param>
|
||||||
|
/// <param name="where">Условие</param>
|
||||||
|
/// <returns>Результат выполнения</returns>
|
||||||
|
Task<bool> DeleteRowAsync (string tableName, KeyValue<string, object> where);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Удаляет строку
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="tableName">Имя таблицы</param>
|
||||||
|
/// <param name="where">Условие</param>
|
||||||
|
/// <returns>Результат выполнения</returns>
|
||||||
|
bool DeleteRow (string tableName, KeyValue<string, object> where);
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
@ -8,7 +8,7 @@
|
|||||||
<RootNamespace>anbs_cp.Database</RootNamespace>
|
<RootNamespace>anbs_cp.Database</RootNamespace>
|
||||||
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
|
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
|
||||||
<PackageId>ANBSoftware.ComponentsPack.Database</PackageId>
|
<PackageId>ANBSoftware.ComponentsPack.Database</PackageId>
|
||||||
<Version>2023.08.18</Version>
|
<Version>2023.08.19</Version>
|
||||||
<Company>Александр Бабаев</Company>
|
<Company>Александр Бабаев</Company>
|
||||||
<Product>Набор компонентов ANB Software для работы с БД</Product>
|
<Product>Набор компонентов ANB Software для работы с БД</Product>
|
||||||
<Description>Библиотека полезных методов языка C# для работы с базами данных</Description>
|
<Description>Библиотека полезных методов языка C# для работы с базами данных</Description>
|
||||||
@ -22,6 +22,7 @@
|
|||||||
<PackageReference Include="ANBSoftware.ComponentsPack" Version="2023.813.1" />
|
<PackageReference Include="ANBSoftware.ComponentsPack" Version="2023.813.1" />
|
||||||
<PackageReference Include="Dapper" Version="2.0.151" />
|
<PackageReference Include="Dapper" Version="2.0.151" />
|
||||||
<PackageReference Include="MySqlConnector" Version="2.2.7" />
|
<PackageReference Include="MySqlConnector" Version="2.2.7" />
|
||||||
|
<PackageReference Include="Z.Dapper.Plus" Version="6.0.2" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user