需要引入包:
Dapper Dapper.Contrib
接口代码:
/// <summary>
/// Dapper上下文
/// </summary>
public interface IDapperContext : IDisposable
{
/// <summary>
/// 数据库连接对象
/// </summary>
IDbConnection Connection { get; }
}
/// <summary>
/// 数据库CRUD等操作
/// </summary>
/// <typeparam name="T"></typeparam>
public interface IRepository<T> where T : class
{
/// <summary>
/// 连接
/// </summary>
IDbConnection Connection { get; }
/// <summary>
/// 上下文
/// </summary>
IDapperContext Context { get; }
/// <summary>
/// 设置上下文连接字符串
/// </summary>
/// <param name="connectionString">字符串</param>
void SetContext(string connectionString);
/// <summary>
/// 重置上下文,用appSetting.json里的数据库连接串
/// </summary>
void ResetContext();
/// <summary>
/// 获取分页数据
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <param name="criteria">查询设置</param>
/// <param name="param"></param>
/// <returns></returns>
PageDataView<TEntity> GetPageData<TEntity>(PageCriteria criteria, object param = null) where TEntity : class;
/// <summary>
/// 根据主键获取数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <param name="transaction"></param>
/// <param name="commandTimeout"></param>
/// <returns></returns>
T GetByKey<T>(object key, IDbTransaction transaction = null, int? commandTimeout = null) where T : class;
/// <summary>
/// 添加数据
/// </summary>
/// <param name="entity"></param>
/// <param name="transaction"></param>
/// <param name="commandTimeout"></param>
/// <returns></returns>
long Add(T entity, IDbTransaction transaction = null, int? commandTimeout = null);
/// <summary>
///
/// </summary>
/// <param name="entity"></param>
/// <param name="transaction"></param>
/// <param name="commandTimeout"></param>
void Update(T entity, IDbTransaction transaction = null, int? commandTimeout = null);
/// <summary>
/// 删除单条数据
/// </summary>
/// <param name="entity"></param>
/// <param name="transaction"></param>
/// <param name="commandTimeout"></param>
void Remove(T entity, IDbTransaction transaction = null, int? commandTimeout = null);
/// <summary>
/// 根据主键获取数据
/// </summary>
/// <param name="key"></param>
/// <param name="transaction"></param>
/// <param name="commandTimeout"></param>
/// <returns></returns>
T GetByKey(object key, IDbTransaction transaction = null, int? commandTimeout = null);
/// <summary>
/// 获取所有数据
/// </summary>
/// <param name="transaction"></param>
/// <param name="commandTimeout"></param>
/// <returns></returns>
IEnumerable<T> GetAll(IDbTransaction transaction = null, int? commandTimeout = null);
/// <summary>
/// 根据条件获取数据列表
/// </summary>
/// <param name="where"></param>
/// <param name="order"></param>
/// <param name="transaction"></param>
/// <param name="commandTimeout"></param>
/// <returns></returns>
IEnumerable<T> GetBy(object where = null, object order = null, IDbTransaction transaction = null, int? commandTimeout = null);
IEnumerable<T> GetBy<T>(object sql = null, object param = null, IDbTransaction transaction = null, int? commandTimeout = null) where T : class;
T QuerySingleOrDefault<T>(string sql = null, object param = null, IDbTransaction transaction = null, int? commandTimeout = null) where T : class;
/// <summary>
/// 查询数据列表
/// </summary>
/// <param name="sql"></param>
/// <param name="transaction"></param>
/// <param name="commandTimeout"></param>
/// <returns></returns>
IEnumerable<dynamic> Query(string sql, IDbTransaction transaction = null, int? commandTimeout = null);
/// <summary>
/// 查询数据列表
/// </summary>
/// <param name="sql"></param>
/// <param name="transaction"></param>
/// <param name="commandTimeout"></param>
/// <returns></returns>
IEnumerable<T> Query<T>(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null) where T : class;
/// <summary>
/// 查询数据列表
/// </summary>
/// <typeparam name="TFirst"></typeparam>
/// <typeparam name="TSecond"></typeparam>
/// <typeparam name="TReturn"></typeparam>
/// <param name="sql"></param>
/// <param name="map"></param>
/// <param name="transaction"></param>
/// <param name="commandTimeout"></param>
/// <returns></returns>
IEnumerable<TReturn> Query<TFirst, TSecond, TReturn>(string sql, Func<TFirst, TSecond, TReturn> map, object param = null, IDbTransaction transaction = null, string splitOn = "Id", int? commandTimeout = null, CommandType? commandType = null);
IEnumerable<TReturn> Query<TFirst, TSecond, TThird, TReturn>(string sql, Func<TFirst, TSecond, TThird, TReturn> map, object param = null, IDbTransaction transaction = null, bool buffered = true, string splitOn = "Id", int? commandTimeout = null, CommandType? commandType = null);
IEnumerable<TReturn> Query<TFirst, TSecond, TThird, TFourth, TFifth, TReturn>(string sql, Func<TFirst, TSecond, TThird, TFourth, TFifth, TReturn> map, object param = null, IDbTransaction transaction = null, bool buffered = true, string splitOn = "Id", int? commandTimeout = null, CommandType? commandType = null);
IEnumerable<TReturn> Query<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TReturn>(string sql, Func<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TReturn> map, object param = null, IDbTransaction transaction = null, bool buffered = true, string splitOn = "Id", int? commandTimeout = null, CommandType? commandType = null);
IEnumerable<TReturn> Query<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TReturn>(string sql, Func<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TReturn> map, object param = null, IDbTransaction transaction = null, bool buffered = true, string splitOn = "Id", int? commandTimeout = null, CommandType? commandType = null);
/// <summary>
/// 查询数据列表
/// </summary>
/// <typeparam name="TFirst"></typeparam>
/// <typeparam name="TSecond"></typeparam>
/// <typeparam name="TThird"></typeparam>
/// <typeparam name="TFourth"></typeparam>
/// <typeparam name="TReturn"></typeparam>
/// <param name="sql"></param>
/// <param name="map"></param>
/// <param name="param"></param>
/// <param name="transaction"></param>
/// <param name="splitOn"></param>
/// <param name="commandTimeout"></param>
/// <param name="commandType"></param>
/// <returns></returns>
IEnumerable<TReturn> Query<TFirst, TSecond, TThird, TFourth, TReturn>(string sql, Func<TFirst, TSecond, TThird, TFourth, TReturn> map, object param = null, IDbTransaction transaction = null, string splitOn = "Id", int? commandTimeout = null, CommandType? commandType = null);
/// <summary>
/// 执行sql
/// </summary>
/// <param name="sql"></param>
/// <param name="transaction"></param>
/// <param name="commandTimeout"></param>
/// <returns></returns>
int Excute(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null);
/// <summary>
/// 返回单个参数
/// </summary>
/// <param name="sql"></param>
/// <param name="transaction"></param>
/// <param name="commandTimeout"></param>
/// <returns></returns>
object ExcuteScalar(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null);
GridReader QueryMultiple(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null);
}
实现:
public class DapperContext : IDapperContext
{
/// <summary>
/// 连接字符串
/// </summary>
private string _connectionString;
private bool _useMiniProfiling;
/// <summary>
/// 连接
/// </summary>
private IDbConnection _connection;
///// <summary>
///// 节点对象
///// </summary>
//private readonly AppSetting _appSetting;
/// <summary>
/// 构造函数注入IOptions
/// </summary>
/// <param name="appSetting"></param>
public DapperContext(IConfiguration configuration)
{
_connectionString = configuration["AppSetting:ConnectionString"];
_useMiniProfiling = bool.Parse(configuration["AppSetting.UseMiniProfiling"]);
}
/// <summary>
/// 连接字符串,用于各个公司
/// </summary>
/// <param name="connectionString"></param>
public DapperContext(string connectionString)
{
_connectionString = connectionString;
}
/// <summary>
/// 获取连接
/// </summary>
public IDbConnection Connection
{
get
{
if (_connection == null || _connection.State == ConnectionState.Closed)
{
if (_useMiniProfiling)
{
_connection = new ProfiledDbConnection(new SqlConnection(_connectionString), MiniProfiler.Current);
}
else
{
_connection = new SqlConnection(_connectionString);
}
}
if (_connection.State != ConnectionState.Open)
{
//Console.WriteLine("数据库连接:" + _connectionString);
_connection.Open();
}
return _connection;
}
}
/// <summary>
/// 释放连接
/// </summary>
public void Dispose()
{
if (_connection != null && _connection.State == ConnectionState.Open)
_connection.Close();
}
}
public class Repository<T> : IRepository<T> where T : class
{
public IDbConnection Connection
{
get
{
return Context.Connection;
}
}
/// <summary>
/// 存储appsetting.json里的数据库连接字符串
/// </summary>
private string _connectionString;
public IDapperContext Context { get; private set; }
public Repository(IDapperContext context)
{
Context = context;
_connectionString = context.Connection.ConnectionString;
}
/// <summary>
/// 设置上下文连接字符串
/// </summary>
/// <param name="connectionString"></param>
public void SetContext(string connectionString)
{
Context.Dispose();
Context = new DapperContext(connectionString);
}
/// <summary>
/// 重置上下文,用appSetting.json里的数据库连接串
/// </summary>
public void ResetContext()
{
SetContext(_connectionString);
}
public PageDataView<TEntity> GetPageData<TEntity>(PageCriteria criteria, object param = null) where TEntity : class
{
var p = new DynamicParameters();
string proName = "CCHRWebApiProcGetPageData";
p.Add("TableName", criteria.TableName);
p.Add("PrimaryKey", criteria.PrimaryKey);
p.Add("Fields", criteria.Fields);
p.Add("Condition", criteria.Condition);
p.Add("CurrentPage", criteria.CurrentPage);
p.Add("PageSize", criteria.PageSize);
p.Add("Sort", criteria.Sort);
p.Add("RecordCount", dbType: DbType.Int32, direction: ParameterDirection.Output);
var pageData = new PageDataView<TEntity>();
int excuteTimes = 0;
//QUERY:
try
{
pageData.Items = Connection.Query<TEntity>(proName, p, commandType: CommandType.StoredProcedure, commandTimeout:300).ToList();
pageData.TotalNum = p.Get<int>("RecordCount");
pageData.TotalPageCount = Convert.ToInt32(Math.Ceiling(pageData.TotalNum * 1.0 / criteria.PageSize));
pageData.CurrentPage = criteria.CurrentPage > pageData.TotalPageCount ? pageData.TotalPageCount : criteria.CurrentPage;
}
catch (Exception e)
{
excuteTimes++;
if (e.Message.Contains("找不到存储过程 'CCHRWebApiProcGetPageData'") && excuteTimes <= 3)
{
FileStream fileStream = new FileStream(@"SqlCCHRWebApiProcGetPageData.sql", FileMode.Open);
StreamReader sr = new StreamReader(fileStream);
string sql = sr.ReadToEnd();
if (fileStream != null)
fileStream.Close();
if (sr != null)
sr.Close();
if (!string.IsNullOrEmpty(sql))
{
Connection.Execute(sql);
// goto QUERY;
}
throw;
}
else if ((e.Message.Contains("远程主机强迫关闭了一个现有的连接") || e.Message.Contains("指定的网络名不再可用")) && excuteTimes <= 3)
{
System.Threading.Thread.Sleep(excuteTimes * 1000);
//goto QUERY;
}
else
{
throw;
}
}
return pageData;
}
public virtual T GetByKey<T>(object id, IDbTransaction transaction = null, int? commandTimeout = null) where T : class
{
if (id == null)
{
throw new ArgumentNullException("id");
}
return Connection.Get<T>(id, transaction: transaction, commandTimeout: commandTimeout);
}
public long Add(T entity, IDbTransaction transaction = null, int? commandTimeout = null)
{
if (entity == null)
{
throw new ArgumentNullException("entity", "Add to DB null entity");
}
var res = Connection.Insert(entity, transaction: transaction, commandTimeout: commandTimeout);
return res;
}
public virtual void Update(T entity, IDbTransaction transaction = null, int? commandTimeout = null)
{
if (entity == null)
{
throw new ArgumentNullException("entity", "Update in DB null entity");
}
Connection.Update(entity, transaction: transaction, commandTimeout: commandTimeout);
}
public virtual void Remove(T entity, IDbTransaction transaction = null, int? commandTimeout = null)
{
if (entity == null)
{
throw new ArgumentNullException("entity", "Remove in DB null entity");
}
Connection.Delete(entity, transaction: transaction, commandTimeout: commandTimeout);
}
public virtual T GetByKey(object id, IDbTransaction transaction = null, int? commandTimeout = null)
{
if (id == null)
{
throw new ArgumentNullException("id");
}
return Connection.Get<T>(id, transaction: transaction, commandTimeout: commandTimeout);
}
public virtual IEnumerable<T> GetAll(IDbTransaction transaction = null, int? commandTimeout = null)
{
return Connection.GetAll<T>(transaction: transaction, commandTimeout: commandTimeout);
}
public virtual T QuerySingleOrDefault<T>(string sql = null, object param = null, IDbTransaction transaction = null, int? commandTimeout = null) where T : class
{
return Connection.QuerySingleOrDefault<T>(sql, param, transaction: transaction, commandTimeout: commandTimeout);
}
public virtual IEnumerable<T> GetBy(object where = null, object order = null, IDbTransaction transaction = null, int? commandTimeout = null)
{
return Connection.Query<T>(where.ToString(), commandTimeout:commandTimeout);
}
public virtual IEnumerable<T> GetBy<T>(object sql = null, object param = null, IDbTransaction transaction = null, int? commandTimeout = null) where T : class
{
return Connection.Query<T>(sql.ToString(), param: param, transaction: transaction, commandTimeout: commandTimeout);
}
public IEnumerable<dynamic> Query(string sql, IDbTransaction transaction = null, int? commandTimeout = null)
{
return Connection.Query<dynamic>(sql);
}
public IEnumerable<T> Query<T>(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null) where T : class
{
return Connection.Query<T>(sql, param: param, transaction: transaction);
}
public IEnumerable<TReturn> Query<TFirst, TSecond, TReturn>(string sql, Func<TFirst, TSecond, TReturn> map, object param = null, IDbTransaction transaction = null, string splitOn = "Id", int? commandTimeout = null, CommandType? commandType = null)
{
return Connection.Query<TFirst, TSecond, TReturn>(sql, map, param: param, transaction: transaction, splitOn: splitOn, commandType: commandType);
}
public IEnumerable<TReturn> Query<TFirst, TSecond, TThird, TReturn>(string sql, Func<TFirst, TSecond, TThird, TReturn> map, object param = null, IDbTransaction transaction = null, bool buffered = true, string splitOn = "Id", int? commandTimeout = null, CommandType? commandType = null)
{
return Connection.Query<TFirst, TSecond, TThird, TReturn>(sql, map, param: param, transaction: transaction, splitOn: splitOn, commandType: commandType);
}
public IEnumerable<TReturn> Query<TFirst, TSecond, TThird, TFourth, TReturn>(string sql, Func<TFirst, TSecond, TThird, TFourth, TReturn> map, object param = null, IDbTransaction transaction = null, string splitOn = "Id", int? commandTimeout = null, CommandType? commandType = null)
{
return Connection.Query<TFirst, TSecond, TThird, TFourth, TReturn>(sql, map, param: param, transaction: transaction, splitOn: splitOn, commandType: commandType);
}
public IEnumerable<TReturn> Query<TFirst, TSecond, TThird, TFourth, TFifth, TReturn>(string sql, Func<TFirst, TSecond, TThird, TFourth, TFifth, TReturn> map, object param = null, IDbTransaction transaction = null, bool buffered = true, string splitOn = "Id", int? commandTimeout = null, CommandType? commandType = null)
{
return Connection.Query<TFirst, TSecond, TThird, TFourth, TFifth, TReturn>(sql, map, param: param, transaction: transaction, splitOn: splitOn, commandType: commandType);
}
public IEnumerable<TReturn> Query<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TReturn>(string sql, Func<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TReturn> map, object param = null, IDbTransaction transaction = null, bool buffered = true, string splitOn = "Id", int? commandTimeout = null, CommandType? commandType = null)
{
return Connection.Query<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TReturn>(sql, map, param: param, transaction: transaction, splitOn: splitOn, commandType: commandType);
}
public IEnumerable<TReturn> Query<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TReturn>(string sql, Func<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TReturn> map, object param = null, IDbTransaction transaction = null, bool buffered = true, string splitOn = "Id", int? commandTimeout = null, CommandType? commandType = null)
{
return Connection.Query<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TReturn>(sql, map, param: param, transaction: transaction, splitOn: splitOn, commandType: commandType);
}
public int Excute(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null)
{
return Connection.Execute(sql, param: param, transaction: transaction);
}
public object ExcuteScalar(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null)
{
return Connection.ExecuteScalar(sql, param: param, transaction: transaction, commandTimeout: commandTimeout);
}
public GridReader QueryMultiple(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null) {
return Connection.QueryMultiple(sql, param: param, transaction: transaction, commandTimeout: commandTimeout);
}
}