using System; using System.Collections.Generic; using System.Data.Common; using System.Linq; using System.Text; using System.Threading.Tasks; using Dapper; using HH.WMS.Entitys; using System.Data; using HH.WMS.Common; using Newtonsoft.Json; using HH.WMS.Common.External; namespace HH.WMS.DAL { public class ErpDapperBaseDAL : ErpBaseDAL { #region 执行查询-返回动态列List /// /// 查询-返回动态列List /// /// /// /// public List ExecuteDynamicList(string sql, object param = null) { using (DbConnection conn = this.DataAccess.CreateConnection()) { return conn.Query(sql, param).ToList(); } } #endregion #region 执行查询-返回datatable /// /// 执行查询-返回datatable /// /// /// /// public DataTable ExecuteDataTable(string sql, object param = null) { using (DbConnection conn = this.DataAccess.CreateConnection()) { DataTable dt = new DataTable(); dt.Load(conn.ExecuteReader(sql, param)); return dt; } } #endregion #region 执行查询-返回单个实体 /// /// 执行查询-返回单个实体 /// /// /// /// public T ExecuteSingleEntity(string sql, object param = null) { using (DbConnection conn = this.DataAccess.CreateConnection()) { return conn.QueryFirstOrDefault(sql, param); } } #endregion #region 执行查询-返回动态列单个实体 /// /// 执行查询-返回动态列单个实体 /// /// /// /// public dynamic ExecuteSingleDynamic(string sql, object param = null) { using (DbConnection conn = this.DataAccess.CreateConnection()) { return conn.QueryFirstOrDefault(sql, param); } } #endregion #region 执行查询-返回List /// /// 执行查询-返回List /// /// /// /// public List ExecuteQuery(string sql, object param = null) { using (DbConnection conn = this.DataAccess.CreateConnection()) { return conn.Query(sql, param).ToList(); } } #endregion #region 分页-datable /// /// 分页-datable /// /// 多表格式(select * from tn_wm_out_mst) t where 1=1 /// /// /// /// /// 注入参数 /// public OperateResult ExecutePagingResult(string tableName, int pageIndex, int pageSize, string orderBy = "", object param = null) { try { long total; DataTable dt = ExecutePagingData(tableName, pageIndex, pageSize, out total, orderBy, param); return OperateResult.Succeed(null, new { rows = dt, total = total }); } catch (Exception ex) { return OperateResult.Error(ex.Message); } } #endregion #region 分页返回数据 /// /// 分页返回数据 /// /// /// /// /// /// /// /// public DataTable ExecutePagingData(string tableName, int pageIndex, int pageSize, out long total, string orderBy = "", object param = null) { string countSql = "SELECT COUNT(1) FROM " + tableName; string pagingSql = string.Empty; switch (NowDbType) { case DBTYPE.MSSQL: if (string.IsNullOrEmpty(orderBy)) orderBy = "ORDER BY CN_T_MODIFY DESC"; pagingSql = @"SELECT * FROM (SELECT ROW_NUMBER() OVER({0}) AS ROWID,* FROM {1} ) AS SP WHERE ROWID BETWEEN STR(({2}-1)*{3}+1) AND STR({4}*{5})"; pagingSql = string.Format(pagingSql, orderBy, tableName, pageIndex, pageSize, pageIndex, pageSize); break; case DBTYPE.MYSQL: pagingSql = @"SELECT T.* FROM (SELECT * FROM {0}) T LIMIT {1},{2} {3}"; pagingSql = string.Format(pagingSql, tableName, pageIndex, pageSize, orderBy); break; } total = ExecuteCountSql(countSql, param); HH.WMS.Common.Log.Info("DapperBaseDAL", countSql); return ExecuteDataTable(pagingSql, param); } #endregion public DataTable ExecuteSqlDataTable(string tableName, object param = null) { string sql = @"SELECT * FROM " + tableName; return ExecuteDataTable(sql, param); } #region 执行sql,返回数量 /// /// 执行sql,返回数量 /// /// /// /// public long ExecuteCountSql(string sql, object param = null) { try { using (DbConnection conn = this.DataAccess.CreateConnection()) { object obj = conn.ExecuteScalar(sql, param); return Convert.ToUInt32(obj); } } catch { return 0; } } #endregion #region 执行sql 事务,单条 /// /// 执行sql 事务,单条 /// /// /// /// /// public OperateResult ExecuteTranSql(string sql, object param, IDbTransaction trans) { if (trans == null) { return UseTransaction(tran => { Log.Detail(new LogPara("执行sql 事务"), "当前连接字符串:" + JsonConvert.SerializeObject(tran.Connection)); return tran.Connection.Execute(sql, param, tran); }); } else { try { int affectedRows = trans.Connection.Execute(sql, param, trans); return OperateResult.Succeed(affectedRows); } catch (Exception exception) { throw exception; } } } #endregion #region 执行sql 事务,多条 /// /// 执行sql 事务,多条 /// /// /// /// /// public OperateResult ExecuteTranSql(string sql, IList list, IDbTransaction trans = null) { if (trans == null) { return UseTransaction(tran => { foreach (var entity in list) { tran.Connection.Execute(sql, entity, tran); } }); } else { try { foreach (var entity in list) { trans.Connection.Execute(sql, entity, trans); } return OperateResult.Succeed(); } catch (Exception exception) { throw exception; } } } #endregion #region 使用事务 /// /// 使用事务 /// /// /// public OperateResult UseTransaction(Action action) { using (DbConnection conn = this.DataAccess.CreateConnection()) { conn.Open(); using (var tran = conn.BeginTransaction(IsolationLevel.ReadCommitted)) { try { action(tran); tran.Commit(); return OperateResult.Succeed(); } catch (Exception exception) { tran.Rollback(); return OperateResult.Error(exception.Message); } finally { tran.Dispose(); } } } } /// /// 带返回值事务(用于单条事务返回影响行数) /// /// /// public OperateResult UseTransaction(Func action) { using (DbConnection conn = this.DataAccess.CreateConnection()) { conn.Open(); using (var tran = conn.BeginTransaction(IsolationLevel.ReadCommitted)) { try { int affectedRows = action(tran); tran.Commit(); return OperateResult.Succeed(affectedRows); } catch (Exception exception) { tran.Rollback(); return OperateResult.Error(exception.Message); } finally { tran.Dispose(); } } } } #endregion } }