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
}
}