300 lines
11 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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