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;
namespace HH.WMS.DAL
{
public class DapperBaseDAL : BaseDAL
{
#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} {3}) T LIMIT {1},{2} ";
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 =>
{
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
#region 过滤查询条件
///
/// 过滤查询条件
///
///
///
///
///
public string GetFilterField(string field, object value, string opt = "=")
{
string _value = WMS.Common.Util.ToStringInput(value);
if (string.IsNullOrEmpty(_value))
return string.Empty;
string result = string.Empty;
field = " AND " + field + " ";
switch (opt)
{
case "=":
result = field + opt + "'" + _value + "' ";
break;
case "like":
result = field + opt + " '%" + _value + "%' ";
break;
case "in":
result = field + opt + " ('" + _value.Replace(",", "','") + "') ";
break;
case "dateArray":
string[] date = new string[2];
date = value as string[];
if (date.Length == 2)
{
string startDate = date[0];
if (!string.IsNullOrEmpty(startDate))
{
result += (field + ">= '" + startDate + "' ");
}
string endDate = date[1];
if (!string.IsNullOrEmpty(endDate))
{
result += (field + "< '" + Convert.ToDateTime(endDate).AddDays(1).ToString() + "' ");
}
}
break;
default: return string.Empty;
}
return result;
}
#endregion
}
}