300 lines
11 KiB
C#
300 lines
11 KiB
C#
using Dapper;
|
||
using Learun.Util;
|
||
using Newtonsoft.Json.Linq;
|
||
using System;
|
||
using System.Collections;
|
||
using System.Collections.Generic;
|
||
using System.ComponentModel.DataAnnotations.Schema;
|
||
using System.Data;
|
||
using System.Reflection;
|
||
using System.Text;
|
||
using System.Text.RegularExpressions;
|
||
|
||
namespace Learun.DataBase
|
||
{
|
||
/// <summary>
|
||
/// 版 本 PIT-ADMS V7.0.3 敏捷开发框架
|
||
/// Copyright (c) 2013-2018 Hexagon PPM
|
||
/// 创建人:研发部
|
||
/// 日 期:2017.03.04
|
||
/// 描 述:数据访问扩展
|
||
/// </summary>
|
||
public static class SqlHelper
|
||
{
|
||
#region 转换扩展类
|
||
/// <summary>
|
||
/// 将IDataReader转换为DataTable
|
||
/// </summary>
|
||
/// <param name="dr">数据读取接口</param>
|
||
/// <returns></returns>
|
||
public static DataTable IDataReaderToDataTable(IDataReader reader)
|
||
{
|
||
using (reader)
|
||
{
|
||
DataTable objDataTable = new DataTable("Table");
|
||
int intFieldCount = reader.FieldCount;
|
||
for (int intCounter = 0; intCounter < intFieldCount; ++intCounter)
|
||
{
|
||
objDataTable.Columns.Add(reader.GetName(intCounter).ToLower(), reader.GetFieldType(intCounter));
|
||
}
|
||
objDataTable.BeginLoadData();
|
||
object[] objValues = new object[intFieldCount];
|
||
while (reader.Read())
|
||
{
|
||
reader.GetValues(objValues);
|
||
objDataTable.LoadDataRow(objValues, true);
|
||
}
|
||
reader.Close();
|
||
reader.Dispose();
|
||
objDataTable.EndLoadData();
|
||
return objDataTable;
|
||
}
|
||
}
|
||
/// <summary>
|
||
/// 获取实体类键值(缓存)
|
||
/// </summary>
|
||
/// <typeparam name="T">类型</typeparam>
|
||
/// <param name="entity">实体对象</param>
|
||
/// <returns></returns>
|
||
public static Hashtable GetPropertyInfo<T>(T entity)
|
||
{
|
||
Type type = entity.GetType();
|
||
//object CacheEntity = CacheHelper.GetCache("CacheEntity_" + EntityAttribute.GetEntityTable<T>());
|
||
object CacheEntity = null;
|
||
if (CacheEntity == null)
|
||
{
|
||
Hashtable ht = new Hashtable();
|
||
PropertyInfo[] props = type.GetProperties();
|
||
foreach (PropertyInfo prop in props)
|
||
{
|
||
bool flag = true;
|
||
foreach (Attribute attr in prop.GetCustomAttributes(true))
|
||
{
|
||
NotMappedAttribute notMapped = attr as NotMappedAttribute;
|
||
if (notMapped != null)
|
||
{
|
||
flag = false;
|
||
break;
|
||
}
|
||
|
||
}
|
||
|
||
if (flag)
|
||
{
|
||
string name = prop.Name;
|
||
object value = prop.GetValue(entity, null);
|
||
ht[name] = value;
|
||
}
|
||
}
|
||
//CacheHelper.SetCache("CacheEntity_" + EntityAttribute.GetEntityTable<T>(), ht);
|
||
return ht;
|
||
}
|
||
else
|
||
{
|
||
return (Hashtable)CacheEntity;
|
||
}
|
||
}
|
||
/// <summary>
|
||
/// 将json对象转化成Dapper可认的参数
|
||
/// </summary>
|
||
/// <param name="jObject">json对象</param>
|
||
/// <returns></returns>
|
||
public static DynamicParameters JObjectToParameter(JObject jObject)
|
||
{
|
||
try
|
||
{
|
||
var args = new DynamicParameters(new { });
|
||
foreach (var item in jObject)
|
||
{
|
||
args.Add(item.Key.ToString(), item.Value.ToString());
|
||
}
|
||
return args;
|
||
}
|
||
catch (Exception)
|
||
{
|
||
throw;
|
||
}
|
||
}
|
||
/// <summary>
|
||
/// 将对象转化成Dapper可认的参数
|
||
/// </summary>
|
||
/// <param name="fieldValueParams">对象</param>
|
||
/// <returns></returns>
|
||
public static DynamicParameters FieldValueParamToParameter(List<FieldValueParam> fieldValueParams)
|
||
{
|
||
try
|
||
{
|
||
var args = new DynamicParameters(new { });
|
||
foreach (var item in fieldValueParams)
|
||
{
|
||
args.Add(item.name, item.value, (DbType)item.type);
|
||
}
|
||
return args;
|
||
}
|
||
catch (Exception)
|
||
{
|
||
throw;
|
||
}
|
||
}
|
||
#endregion
|
||
|
||
#region 分页语句
|
||
/// <summary>
|
||
/// sql分页语句
|
||
/// </summary>
|
||
/// <param name="strSql">sql语句</param>
|
||
/// <param name="orderField">排序字段</param>
|
||
/// <param name="isAsc">排序类型</param>
|
||
/// <param name="pageSize">每页数据条数</param>
|
||
/// <param name="pageIndex">页码</param>
|
||
/// <returns></returns>
|
||
public static StringBuilder SqlPageSql(string strSql, string orderField, bool isAsc, int pageSize, int pageIndex)
|
||
{
|
||
StringBuilder sb = new StringBuilder();
|
||
if (pageIndex == 0)
|
||
{
|
||
pageIndex = 1;
|
||
}
|
||
int num = (pageIndex - 1) * pageSize;
|
||
int num1 = (pageIndex) * pageSize;
|
||
string OrderBy = "";
|
||
|
||
if (!string.IsNullOrEmpty(orderField))
|
||
{
|
||
if (orderField.ToUpper().IndexOf("ASC") + orderField.ToUpper().IndexOf("DESC") > 0)
|
||
{
|
||
orderField = FilterFiled(orderField);
|
||
if (!string.IsNullOrEmpty(orderField))
|
||
{
|
||
OrderBy = " Order By " + orderField;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
orderField = FilterFiled(orderField);
|
||
if (!string.IsNullOrEmpty(orderField))
|
||
{
|
||
OrderBy = " Order By " + orderField + " " + (isAsc ? "ASC" : "DESC");
|
||
}
|
||
}
|
||
}
|
||
if (string.IsNullOrEmpty(OrderBy))
|
||
{
|
||
OrderBy = "order by (select 0)";
|
||
}
|
||
sb.Append("Select * From (Select ROW_NUMBER() Over (" + OrderBy + ")");
|
||
sb.Append(" As rowNum, * From (" + strSql + ") T ) As N Where rowNum > " + num + " And rowNum <= " + num1 + "");
|
||
return sb;
|
||
}
|
||
/// <summary>
|
||
/// oracle分页语句
|
||
/// </summary>
|
||
/// <param name="strSql">sql语句</param>
|
||
/// <param name="orderField">排序字段</param>
|
||
/// <param name="isAsc">排序类型</param>
|
||
/// <param name="pageSize">每页数据条数</param>
|
||
/// <param name="pageIndex">页码</param>
|
||
/// <returns></returns>
|
||
public static StringBuilder OraclePageSql(string strSql, string orderField, bool isAsc, int pageSize, int pageIndex)
|
||
{
|
||
StringBuilder sb = new StringBuilder();
|
||
if (pageIndex == 0)
|
||
{
|
||
pageIndex = 1;
|
||
}
|
||
int num = (pageIndex - 1) * pageSize;
|
||
int num1 = (pageIndex) * pageSize;
|
||
string OrderBy = "";
|
||
|
||
if (!string.IsNullOrEmpty(orderField))
|
||
{
|
||
if (orderField.ToUpper().IndexOf("ASC") + orderField.ToUpper().IndexOf("DESC") > 0)
|
||
{
|
||
orderField = FilterFiled(orderField);
|
||
if (!string.IsNullOrEmpty(orderField))
|
||
{
|
||
OrderBy = " Order By " + orderField;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
orderField = FilterFiled(orderField);
|
||
if (!string.IsNullOrEmpty(orderField))
|
||
{
|
||
OrderBy = " Order By " + orderField + " " + (isAsc ? "ASC" : "DESC");
|
||
}
|
||
}
|
||
}
|
||
sb.Append("Select * From (Select ROWNUM lrrn,");
|
||
sb.Append(" T.* From (" + strSql + ") T " + OrderBy + " ) N Where lrrn > " + num + " And lrrn <= " + num1 + "");
|
||
return sb;
|
||
}
|
||
/// <summary>
|
||
/// mysql分页语句。从基础sql,叠加上分页 排序的sql
|
||
/// </summary>
|
||
/// <param name="strSql">sql语句</param>
|
||
/// <param name="orderField">排序字段</param>
|
||
/// <param name="isAsc">排序类型</param>
|
||
/// <param name="pageSize">每页数据条数</param>
|
||
/// <param name="pageIndex">页码</param>
|
||
/// <returns></returns>
|
||
public static StringBuilder MySqlPageSql(string strSql, string orderField, bool isAsc, int pageSize, int pageIndex)
|
||
{
|
||
StringBuilder sb = new StringBuilder();
|
||
if (pageIndex == 0)
|
||
{
|
||
pageIndex = 1;
|
||
}
|
||
int num = (pageIndex - 1) * pageSize;
|
||
string OrderBy = "";
|
||
|
||
if (!string.IsNullOrEmpty(orderField))
|
||
{
|
||
if (orderField.ToUpper().IndexOf("ASC") + orderField.ToUpper().IndexOf("DESC") > 0)
|
||
{
|
||
orderField = FilterFiled(orderField);
|
||
if (!string.IsNullOrEmpty(orderField))
|
||
{
|
||
OrderBy = " Order By " + orderField;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
orderField = FilterFiled(orderField);
|
||
if (!string.IsNullOrEmpty(orderField))
|
||
{
|
||
OrderBy = " Order By " + orderField + " " + (isAsc ? "ASC" : "DESC");
|
||
}
|
||
}
|
||
}
|
||
sb.Append(strSql + OrderBy);
|
||
sb.Append(" limit " + num + "," + pageSize + "");
|
||
return sb;
|
||
}
|
||
#endregion
|
||
|
||
/// <summary>
|
||
/// SQL注入处理
|
||
/// </summary>
|
||
/// <param name="str"></param>
|
||
/// <returns></returns>
|
||
public static string FilterFiled(string str)
|
||
{
|
||
if (Regex.IsMatch(str, @"[-|;|\/|\(|\)|\[|\]|\}|\{|%|@|\*|!|\']")) return "";
|
||
string SQLInjection = Config.GetValue("SQLInjection");
|
||
if (!string.IsNullOrEmpty(SQLInjection))
|
||
{
|
||
string[] array = SQLInjection.Split('|');
|
||
for (var i = 0; i < array.Length; i++)
|
||
{
|
||
if (!string.IsNullOrEmpty(array[i]) && str.ToUpper().Contains(array[i].ToUpper()))
|
||
{
|
||
return "";
|
||
}
|
||
}
|
||
}
|
||
return str;
|
||
}
|
||
}
|
||
}
|