using Dapper;
using Microsoft.Data.Sqlite;
using MySql.Data.MySqlClient;
using Npgsql;
using System.Data;
using Long.Core.Query;
using Long.Core.Settings;
using Microsoft.Extensions.Configuration;
using System.Data.SqlClient;
namespace Long.Dapper
{
///
/// 静态配置文件
///
public static class DatabaseConfig
{
public static string AppSettingsFileName = "appsettings.json";
}
///
/// 基础数据库连接类
///
public class Database : IDatabase
{
private string _tableName = "";
private IList _fields;
///
/// 数据库连接字符串
///
public string ConnectionString { get; set; }
///
/// 数据库配置关键字
///
public string DbKey { get; set; }
///
/// 数据库类型
///
public string DbType { get; set; }
///
/// 基础数据库连接类
///
/// 数据库配置关键字
/// 数据库类型
public Database(string dbKey = "Default", string dbType = "MySql")
{
SetConnectionString(dbKey);
DbType = dbType;
// 实例化字段
_fields = new List();
// 获取表名
var type = typeof(TEntity);
_tableName = type.Name;
// 获取字段
var props = type.GetProperties();
for (var i = 0; i < props.Length; i++)
{
_fields.Add(props[i].Name);
}
}
///
/// 设置 appsettings.json 中的数据库连接字符串
///
/// 数据库配置关键字
public void SetConnectionString(string dbKey)
{
IConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
configurationBuilder.AddJsonFile(DatabaseConfig.AppSettingsFileName, optional: true, reloadOnChange: true);
IConfiguration configuration = configurationBuilder.Build();
string res = configuration.GetSection($"ConnectionStrings:{dbKey}").Value ?? "";
if (!String.IsNullOrWhiteSpace(res))
{
ConnectionString = res;
DbKey = dbKey;
}
}
///
/// 获取数据库连接
///
///
///
public IDbConnection GetDbConnection()
{
if (string.IsNullOrWhiteSpace(ConnectionString))
{
throw new ApplicationException("数据库连接字符串异常!");
}
switch (DbType.ToLower())
{
case "npgsql":
return new NpgsqlConnection(ConnectionString);
case "sqlserver":
return new SqlConnection(ConnectionString);
case "sqlite":
return new SqliteConnection(ConnectionString);
case "mysql":
default:
return new MySqlConnection(ConnectionString);
}
}
#region 查询
///
/// 查询列表
///
/// 泛型
/// SQL 查询字符串
/// SQL 参数对象
/// 泛型列表
public IEnumerable Query(string sqlString, object? param = null)
{
IDbConnection conn = GetDbConnection();
return conn.Query(sqlString, param);
}
///
/// 查询列表
///
/// 泛型
/// SQL 查询字符串
/// SQL 参数对象
/// 泛型列表
public async Task> QueryAsync(string sqlString, object? param = null)
{
IDbConnection conn = GetDbConnection();
return await conn.QueryAsync(sqlString, param);
}
///
/// 查询第一条数据
///
/// 泛型
/// SQL 查询字符串
/// SQL 参数对象
/// 泛型对象
public T QueryFirst(string sqlString, object? param = null)
{
IDbConnection conn = GetDbConnection();
return conn.QueryFirstOrDefault(sqlString, param);
}
///
/// 查询第一条数据
///
/// 泛型
/// SQL 查询字符串
/// SQL 参数对象
/// 泛型对象
public async Task QueryFirstAsync(string sqlString, object? param = null)
{
IDbConnection conn = GetDbConnection();
return await conn.QueryFirstOrDefaultAsync(sqlString, param);
}
///
/// 获取数据
///
///
public IEnumerable Get()
{
return Query(GetSql(new QueryParamenter()));
}
///
/// 获取数据
///
///
public async Task> GetAsync()
{
return await QueryAsync(GetSql(new QueryParamenter()));
}
///
/// 获取数据
///
///
///
///
public IEnumerable Get(string sql)
{
return Query(sql);
}
///
/// 获取数据
///
///
///
///
public async Task> GetAsync(string sql)
{
return await QueryAsync(sql);
}
///
/// 获取数据
///
///
///
///
public IEnumerable Get(string sql, object param)
{
return Query(sql, param);
}
///
/// 获取数据
///
///
///
///
public async Task> GetAsync(string sql, object param)
{
return await QueryAsync(sql, param);
}
///
/// 获取数据
///
///
///
///
public async Task> GetAsync(string sql, object param)
{
return await QueryAsync(sql, param);
}
///
/// 通过id获取数据
///
/// 内码
///
public IEnumerable Get(long id)
{
return Query(GetByIdSql(), new { Id = id });
}
///
/// 通过id获取数据
///
/// 内码
///
public async Task> GetAsync(long id)
{
return await QueryAsync(GetByIdSql(), new { Id = id });
}
///
/// 通过id获取数据
///
/// 内码
///
public async Task> GetAsync(long id)
{
return await QueryAsync(GetByIdSql(), new { Id = id });
}
///
/// 通过一堆id获取数据
///
/// 内码列表
///
public IEnumerable Get(IEnumerable ids)
{
return Query(GetByIdsSql(), new { Ids = ids });
}
///
/// 通过一堆id获取数据
///
/// 内码列表
///
public async Task> GetAsync(IEnumerable ids)
{
return await QueryAsync(GetByIdsSql(), new { Ids = ids });
}
///
/// 获取数据
///
/// 查询参数
///
public IEnumerable Get(QueryParamenter param)
{
return Query(GetSql(param));
}
///
/// 获取数据
///
/// 查询参数
///
public async Task> GetAsync(QueryParamenter param)
{
return await QueryAsync(GetSql(param));
}
///
/// 获取数据
///
/// 查询参数
///
public async Task> GetAsync(QueryParamenter param)
{
return await QueryAsync(GetSql(param));
}
///
/// 通过id获取一条数据
///
///
public TEntity GetFirst()
{
return QueryFirst(GetSql());
}
///
/// 通过id获取一条数据
///
///
public async Task GetFirstAsync()
{
return await QueryFirstAsync(GetSql());
}
///
/// 通过id获取一条数据
///
///
///
public TEntity GetFirst(long id)
{
return QueryFirst(GetByIdSql(), new { Id = id });
}
///
/// 通过id获取一条数据
///
///
///
public async Task GetFirstAsync(long id)
{
return await QueryFirstAsync(GetByIdSql(), new { Id = id });
}
///
/// 获取一条数据
///
///
///
public TEntity GetFirst(string sql)
{
return QueryFirst(sql);
}
///
/// 获取一条数据
///
///
///
public async Task GetFirstAsync(string sql)
{
return await QueryFirstAsync(sql);
}
///
/// 获取一条数据
///
///
///
///
public TEntity GetFirst(string sql, object param)
{
return QueryFirst(sql, param);
}
///
/// 获取一条数据
///
///
///
///
public async Task GetFirstAsync(string sql, object param)
{
return await QueryFirstAsync(sql, param);
}
///
/// 获取一条数据
///
///
///
///
public async Task GetFirstAsync(string sql, object param)
{
return await QueryFirstAsync(sql, param);
}
///
/// 获取一条数据
///
///
///
public TEntity GetFirst(QueryParamenter queryParamenter, object? param = null)
{
return QueryFirst(GetSql(queryParamenter), param);
}
///
/// 获取一条数据
///
///
///
public async Task GetFirstAsync(QueryParamenter queryParamenter, object? param = null)
{
return await QueryFirstAsync(GetSql(queryParamenter), param);
}
///
/// 获取一条数据
///
///
///
public TEntity GetFirst(QueryParamenter queryParamenter)
{
return QueryFirst(GetSql(queryParamenter));
}
///
/// 获取一条数据
///
///
///
public async Task GetFirstAsync(QueryParamenter queryParamenter)
{
return await QueryFirstAsync(GetSql(queryParamenter));
}
///
/// 获取一条数据
///
///
///
public T GetFirst(QueryParamenter queryParamenter)
{
return QueryFirst(GetSql(queryParamenter));
}
///
/// 获取一条数据
///
///
///
public async Task GetFirstAsync(QueryParamenter queryParamenter)
{
return await QueryFirstAsync(GetSql(queryParamenter));
}
#endregion
#region 统计
///
/// 统计表记录数
///
/// 记录数
public int Count()
{
string sql = $"SELECT COUNT(1) FROM {_tableName};";
return QueryFirst(sql);
}
///
/// 统计表记录数
///
/// 记录数
public async Task CountAsync()
{
string sql = $"SELECT COUNT(1) FROM {_tableName};";
return await QueryFirstAsync(sql);
}
///
/// 统计表记录数
///
/// 记录数
public async Task CountAsync(QueryParamenter queryParamenter)
{
return await QueryFirstAsync(GetCountSql(queryParamenter));
}
///
/// 统计表记录数
///
/// 内码
/// 记录数
public int Count(long id)
{
string sql = $"SELECT COUNT(1) FROM {_tableName} WHERE Id=@Id;";
return QueryFirst(sql, new { Id = id });
}
///
/// 统计表记录数
///
/// 内码
/// 记录数
public async Task CountAsync(long id)
{
string sql = $"SELECT COUNT(1) FROM {_tableName} WHERE Id=@Id;";
return await QueryFirstAsync(sql, new { Id = id });
}
///
/// 统计表记录数
///
/// 表名
/// 记录数
public int Count(string tableName)
{
string sql = $"SELECT COUNT(1) FROM {tableName};";
return QueryFirst(sql);
}
///
/// 统计表记录数
///
/// 表名
/// 记录数
public async Task CountAsync(string tableName)
{
string sql = $"SELECT COUNT(1) FROM {tableName};";
return await QueryFirstAsync(sql);
}
///
/// 通过条件统计表记录数
///
/// 筛选条件,不包含 WHERE 关键字
/// 记录数
public int CountByWhere(string where)
{
string sql = $"SELECT COUNT(1) FROM {_tableName} WHERE {where};";
return QueryFirst(sql);
}
///
/// 通过条件统计表记录数
///
/// 筛选条件,不包含 WHERE 关键字
/// 记录数
public async Task CountByWhereAsync(string where)
{
string sql = $"SELECT COUNT(1) FROM {_tableName} WHERE {where};";
return await QueryFirstAsync(sql);
}
///
/// 通过条件统计表记录数
///
/// 内码
/// 筛选条件,不包含 WHERE 关键字
/// 记录数
public int CountByWhere(long id, string where)
{
string sql = $"SELECT COUNT(1) FROM {_tableName} WHERE Id=@Id AND {where};";
return QueryFirst(sql, new { Id = id });
}
///
/// 通过条件统计表记录数
///
/// 内码
/// 筛选条件,不包含 WHERE 关键字
/// 记录数
public async Task CountByWhereAsync(long id, string where)
{
string sql = $"SELECT COUNT(1) FROM {_tableName} WHERE Id=@Id AND {where};";
return await QueryFirstAsync(sql, new { Id = id });
}
///
/// 通过条件统计表记录数
///
/// 表名
/// 筛选条件,不包含 WHERE 关键字
/// 记录数
public int CountByWhere(string tableName, string where)
{
string sql = $"SELECT COUNT(1) FROM {tableName} WHERE {where};";
return QueryFirst(sql);
}
///
/// 通过条件统计表记录数
///
/// 表名
/// 筛选条件,不包含 WHERE 关键字
/// 记录数
public async Task CountByWhereAsync(string tableName, string where)
{
string sql = $"SELECT COUNT(1) FROM {tableName} WHERE {where};";
return await QueryFirstAsync(sql);
}
#endregion
#region 插入
///
/// 插入数据
///
/// SQL
/// 插入对象
/// 插入记录数
public int Insert(string sql, object? insert)
{
var result = Execute(sql, insert);
if (result == 0)
{
throw new ApplicationException("插入记录失败!");
}
return result;
}
///
/// 插入数据
///
/// SQL
/// 插入对象
///
public async Task InsertAsync(string sql, object? insert)
{
var result = await ExecuteAsync(sql, insert);
if (result == 0)
{
throw new ApplicationException("插入记录失败!");
}
return result;
}
///
/// 插入数据,自动填入Id
///
/// 插入对象
/// 记录内码
public long Insert(TEntity insert)
{
var id = SetId(insert);
var res = Insert(InsertSql(), insert);
return res > 0 ? id : res;
}
///
/// 插入数据,自动填入Id
///
/// 插入对象
/// 记录内码
public async Task InsertAsync(TEntity insert)
{
var id = SetId(insert);
var res = await InsertAsync(InsertSql(), insert);
return res > 0 ? id : res;
}
///
/// 插入一堆数据,自动填入Id
///
/// 插入对象列表
/// 记录内码列表
public IEnumerable Insert(IEnumerable inserts)
{
var ids = new List();
foreach (var item in inserts)
{
var id = SetId(item);
ids.Add(id);
}
Insert(InsertSql(), inserts);
return ids;
}
///
/// 插入一堆数据,自动填入Id
///
/// 插入对象列表
/// 记录内码列表
public async Task> InsertAsync(IEnumerable inserts)
{
var ids = new List();
foreach (var item in inserts)
{
var id = await SetIdAsync(item);
ids.Add(id);
}
await InsertAsync(InsertSql(), inserts);
return ids;
}
#endregion
#region 更新
///
/// 更新数据
///
/// SQL
/// 更新对象
///
public int Update(string sql, object? update)
{
return Execute(sql, update);
}
///
/// 更新数据
///
/// SQL
/// 更新对象
///
public async Task UpdateAsync(string sql, object? update)
{
return await ExecuteAsync(sql, update);
}
///
/// 更新数据
///
/// 更新对象
///
public int Update(TEntity update)
{
return Update(UpdateSql(), update);
}
///
/// 更新数据
///
/// 更新对象
///
public async Task UpdateAsync(TEntity update)
{
return await UpdateAsync(UpdateSql(), update);
}
///
/// 更新数据
///
/// 更新对象
/// 更新字段
///
public int Update(TEntity update, string[] fields)
{
return Update(UpdateSql(fields), update);
}
///
/// 更新数据
///
/// 更新对象
/// 更新字段
///
public async Task UpdateAsync(TEntity update, string[] fields)
{
return await UpdateAsync(UpdateSql(fields), update);
}
///
/// 更新一堆数据
///
/// 更新对象列表
///
public int Update(IEnumerable updates)
{
return Update(UpdatesSql(), updates);
}
///
/// 更新一堆数据
///
/// 更新对象列表
///
public async Task UpdateAsync(IEnumerable updates)
{
return await UpdateAsync(UpdatesSql(), updates);
}
///
/// 更新一堆数据
///
/// 更新对象列表
/// 更新字段
///
public int Update(IEnumerable updates, string[] fields)
{
return Update(UpdatesSql(fields), updates);
}
///
/// 更新一堆数据
///
/// 更新对象列表
/// 更新字段
///
public async Task UpdateAsync(IEnumerable updates, string[] fields)
{
return await UpdateAsync(UpdatesSql(fields), updates);
}
#endregion
#region 删除
///
/// 删除
///
/// 内码
///
public int Delete(long id)
{
return Execute(DeleteSql(), new { Id = id });
}
///
/// 删除
///
/// 内码
///
public async Task DeleteAsync(long id)
{
return await ExecuteAsync(DeleteSql(), new { Id = id });
}
///
/// 删除
///
/// 一堆内码
///
public int Delete(IEnumerable ids)
{
return Execute(DeletesSql(), new { Ids = ids });
}
///
/// 删除
///
/// 一堆内码
///
public async Task DeleteAsync(IEnumerable ids)
{
return await ExecuteAsync(DeletesSql(), new { Ids = ids });
}
#endregion
#region 执行
///
/// 执行 SQL
///
/// sql字符串
///
public int Execute(string sqlString)
{
using (IDbConnection conn = GetDbConnection())
{
return conn.Execute(sqlString);
}
}
///
/// 执行 SQL
///
/// sql字符串
///
public async Task ExecuteAsync(string sqlString)
{
using (IDbConnection conn = GetDbConnection())
{
return await conn.ExecuteAsync(sqlString);
}
}
///
/// 执行 SQL
///
/// sql字符串
/// 传入参数
///
public int Execute(string sqlString, object? param)
{
using (IDbConnection conn = GetDbConnection())
{
return conn.Execute(sqlString, param);
}
}
///
/// 执行 SQL
///
/// sql字符串
/// 传入参数
///
public async Task ExecuteAsync(string sqlString, object? param)
{
using (IDbConnection conn = GetDbConnection())
{
return await conn.ExecuteAsync(sqlString, param);
}
}
///
/// 执行 SQL
///
/// sql字符串
/// 传入参数
/// 数据库事务
///
public int Execute(string sqlString, object? param = null, IDbTransaction? dbTransaction = null)
{
using (IDbConnection conn = GetDbConnection())
{
if (dbTransaction == null)
{
return conn.Execute(sqlString, param);
}
return conn.Execute(sqlString, param, dbTransaction);
}
}
///
/// 执行 SQL
///
/// sql字符串
/// 传入参数
/// 数据库事务
///
public async Task ExecuteAsync(string sqlString, object? param = null, IDbTransaction? dbTransaction = null)
{
using (IDbConnection conn = GetDbConnection())
{
if (dbTransaction == null)
{
return await conn.ExecuteAsync(sqlString, param);
}
return await conn.ExecuteAsync(sqlString, param, dbTransaction);
}
}
///
/// 执行存储过程
///
/// sql字符串
/// 传入参数
///
public int ExecuteStoredProcedure(string storedProcedure, object? param = null)
{
using (IDbConnection conn = GetDbConnection())
{
return conn.Execute(storedProcedure, param, null, null, CommandType.StoredProcedure);
}
}
///
/// 执行存储过程
///
/// sql字符串
/// 传入参数
///
public async Task ExecuteStoredProcedureAsync(string storedProcedure, object? param = null)
{
using (IDbConnection conn = GetDbConnection())
{
return await conn.ExecuteAsync(storedProcedure, param, null, null, CommandType.StoredProcedure);
}
}
#endregion
#region 获取SQL
///
/// 获取SQL
///
///
public string GetSql()
{
return GetSql(new QueryParamenter());
}
///
/// 获取SQL
///
///
///
public string GetSql(QueryParamenter queryParamenter)
{
// 分页记录起始
int start = 0;
// 是否分页
bool isPage = false;
string sql = "SELECT ";
// 生成去重语句
if (queryParamenter.Distinct)
{
sql += "DISTINCT ";
}
// 生成查询字段
if (queryParamenter.Fields != null)
{
sql += string.Join(", ", queryParamenter.Fields);
}
else
{
sql += string.Join(", ", _fields);
}
sql += $" FROM {_tableName}";
// 生成查询条件
if (!string.IsNullOrWhiteSpace(queryParamenter.Where))
{
sql += " WHERE " + queryParamenter.Where;
}
// 判断是否分页
if (queryParamenter.Page.HasValue && queryParamenter.PageSize.HasValue && queryParamenter.Page > 0 && queryParamenter.PageSize > 0)
{
isPage = true;
start = (queryParamenter.Page.Value - 1) * queryParamenter.PageSize.Value;
}
// 生成分组
if (!string.IsNullOrWhiteSpace(queryParamenter.GroupBy))
{
sql += " GROUP BY " + queryParamenter.GroupBy;
}
// 生产排序
bool isOrderBy = false;
if (!string.IsNullOrWhiteSpace(queryParamenter.OrderBy))
{
isOrderBy = true;
sql += " ORDER BY " + queryParamenter.OrderBy;
}
// 分页
if (isPage)
{
switch (DbType)
{
case "SqlServer":
sql += $"{(isOrderBy ? " ORDER BY" : "")} Id OFFSET {start} ROWS FETCH NEXT {queryParamenter.PageSize ?? 20} ROWS ONLY";
break;
case "MySql":
case "PgSql":
case "Sqlite":
sql += $" LIMIT {queryParamenter.PageSize ?? 20} OFFSET {start}";
break;
}
}
sql += ";";
return sql;
}
///
/// 获取统计SQL
///
///
///
public string GetCountSql(QueryParamenter queryParamenter)
{
string sql = "SELECT ";
// 生成去重语句
if (queryParamenter.Distinct)
{
sql += "DISTINCT ";
}
// 生成查询字段
sql += $" COUNT(1) FROM {_tableName}";
// 生成查询条件
if (!string.IsNullOrWhiteSpace(queryParamenter.Where))
{
sql += " WHERE " + queryParamenter.Where;
}
sql += ";";
return sql;
}
///
/// 查询全部SQL
///
///
public string GetAllSql()
{
return "SELECT " + string.Join(", ", _fields) + $" FROM {_tableName};";
}
///
/// 查询全部SQL
///
///
public string GetAllSql()
{
// 实例化字段
var fields = new List();
// 获取表名
var type = typeof(T);
var tableName = type.Name;
// 获取字段
var props = type.GetProperties();
for (var i = 0; i < props.Length; i++)
{
fields.Add(props[i].Name);
}
return "SELECT " + string.Join(", ", fields) + $" FROM {tableName};";
}
///
/// 通过id查询SQL
///
///
public string GetByIdSql()
{
string sql = GetAllSql();
sql = sql.Substring(0, sql.IndexOf(";"));
sql += " WHERE Id = @Id";
return sql;
}
///
/// 通过id查询SQL
///
///
public string GetByIdSql()
{
string sql = GetAllSql();
sql = sql.Substring(0, sql.IndexOf(";"));
sql += " WHERE Id = @Id";
return sql;
}
///
/// 通过一堆id查询SQL
///
///
public string GetByIdsSql()
{
string sql = GetAllSql();
sql = sql.Substring(0, sql.IndexOf(";"));
sql += " WHERE Ids IN @Ids";
return sql;
}
///
/// 插入SQL
///
///
public string InsertSql()
{
return $"INSERT INTO {_tableName} (" + string.Join(", ", _fields) + ") VALUES (@" + string.Join(", @", _fields) + ");";
}
///
/// 更新SQL
///
///
public string UpdateSql()
{
string sql = $"UPDATE {_tableName} SET";
var i = 0;
foreach (var field in _fields)
{
if (field == "Id")
{
continue;
}
if (i == 0)
{
sql += " ";
}
else
{
sql += ", ";
}
sql += field + " = @" + field;
i++;
}
sql += " WHERE Id = @Id";
return sql;
}
///
/// 更新SQL
///
/// 要更新的字段
///
public string UpdateSql(string[] fields)
{
string sql = $"UPDATE {_tableName} SET ";
foreach (var field in fields)
{
sql += field + " = @" + field;
}
sql += " WHERE Id = @Id";
return sql;
}
///
/// 更新一堆SQL
///
///
public string UpdatesSql()
{
string sql = $"UPDATE {_tableName} SET ";
foreach (var field in _fields)
{
sql += field + " = @" + field;
}
sql += " WHERE Ids IN @Ids";
return sql;
}
///
/// 更新一堆SQL
///
/// 要更新的字段
///
public string UpdatesSql(string[] fields)
{
string sql = $"UPDATE {_tableName} SET ";
foreach (var field in fields)
{
sql += field + " = @" + field;
}
sql += " WHERE Ids IN @Ids";
return sql;
}
///
/// 获取删除SQL
///
///
public string DeleteAllSql()
{
return $"DELETE {_tableName};";
}
///
/// 通过id获取删除SQL
///
///
public string DeleteSql()
{
return $"DELETE {_tableName} WHERE Id = @Id;";
}
///
/// 通过一堆id获取删除SQL
///
///
public string DeletesSql()
{
return $"DELETE {_tableName} WHERE Ids IN @Ids;";
}
#endregion
#region 获取值和编码
///
/// 设置id
///
///
///
public long SetId(object? param)
{
long id = 0;
Type type;
if (param != null)
{
id = GetNextValue();
type = param.GetType();
var props = type.GetProperties();
foreach (var prop in props)
{
if (prop.Name == "Id")
{
prop.SetValue(param, id);
}
}
}
return id;
}
///
/// 设置id
///
///
///
public async Task SetIdAsync(object? param)
{
long id = 0;
Type type;
if (param != null)
{
id = await GetNextValueAsync();
type = param.GetType();
var props = type.GetProperties();
foreach (var prop in props)
{
if (prop.Name == "Id")
{
prop.SetValue(param, id);
}
}
}
return id;
}
///
/// 获取下一个值。请在数据库中建立表(NextValue),字段有(TableName: varchar, FieldName: varchar, Value: long)
///
/// 默认值:1
///
public long GetNextValue(long defaultValue = 1)
{
return GetNextValue(_tableName, "Id", defaultValue);
}
///
/// 获取下一个值。请在数据库中建立表(NextValue),字段有(TableName: varchar, FieldName: varchar, Value: long)
///
/// 默认值:1
///
public async Task GetNextValueAsync(long defaultValue = 1)
{
return await GetNextValueAsync(_tableName, "Id", defaultValue);
}
///
/// 获取下一个值。请在数据库中建立表(NextValue),字段有(TableName: varchar, FieldName: varchar, Value: long)
///
/// 默认值:1
///
public long GetNextValue(string tableName, string fieldName, long defaultValue = 1)
{
string querySql = $"SELECT TableName, FieldName, Value FROM nextvalue WHERE TableName = @TableName AND FieldName = @FieldName;";
string insertSql = $"INSERT INTO NextValue(TableName, FieldName, Value) Values(@TableName, @FieldName, @Value);";
string updateSql = $"UPDATE NextValue SET Value = @Value WHERE TableName = @TableName AND FieldName = @FieldName;";
var next = QueryFirst(querySql, new
{
TableName = tableName,
FieldName = fieldName
});
long result = 0;
/**
* 没有记录,插入
* 有记录,更新,值递增
*/
if (next == null)
{
result = Execute(insertSql, new
{
TableName = tableName,
FieldName = fieldName,
Value = defaultValue + 1
});
if (result == 0)
{
throw new ApplicationException("插入下一个值失败!");
}
return defaultValue;
}
else
{
next.Value++;
result = Execute(updateSql, new
{
TableName = tableName,
FieldName = fieldName,
Value = next.Value
});
if (result == 0)
{
throw new ApplicationException("更新下一个值失败!");
}
return next.Value;
}
}
///
/// 获取下一个值。请在数据库中建立表(NextValue),字段有(TableName: varchar, FieldName: varchar, Value: long)
///
/// 默认值:1
///
public async Task GetNextValueAsync(string tableName, string fieldName, long defaultValue = 1)
{
string querySql = $"SELECT TableName, FieldName, Value FROM nextvalue WHERE TableName = @TableName AND FieldName = @FieldName;";
string insertSql = $"INSERT INTO NextValue (TableName, FieldName, Value) Values(@TableName, @FieldName, @Value);";
string updateSql = $"UPDATE NextValue SET Value = @Value WHERE TableName = @TableName AND FieldName = @FieldName;";
var next = await QueryFirstAsync(querySql, new
{
TableName = tableName,
FieldName = fieldName
});
long result = 0;
/**
* 没有记录,插入
* 有记录,更新,值递增
*/
if (next == null)
{
result = await ExecuteAsync(insertSql, new
{
TableName = tableName,
FieldName = fieldName,
Value = defaultValue + 1
});
if (result == 0)
{
throw new ApplicationException("插入下一个值失败!");
}
return defaultValue;
}
else
{
result = await ExecuteAsync(updateSql, new
{
TableName = tableName,
FieldName = fieldName,
Value = next.Value + 1
});
if (result == 0)
{
throw new ApplicationException("更新下一个值失败!");
}
return next.Value;
}
}
#endregion
}
}