using Ant.Common;
using Ant.Data;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Reflection;
using System.Text;
namespace Ant.ORM
{
///
/// 自定义SQL执行类
///
public class SqlHelp
{
static readonly Dictionary typeMap;
///
///
///
static SqlHelp()
{
typeMap = new Dictionary();
typeMap[typeof(byte)] = DbType.Byte;
typeMap[typeof(sbyte)] = DbType.SByte;
typeMap[typeof(short)] = DbType.Int16;
typeMap[typeof(ushort)] = DbType.UInt16;
typeMap[typeof(int)] = DbType.Int32;
typeMap[typeof(uint)] = DbType.UInt32;
typeMap[typeof(long)] = DbType.Int64;
typeMap[typeof(ulong)] = DbType.UInt64;
typeMap[typeof(float)] = DbType.Single;
typeMap[typeof(double)] = DbType.Double;
typeMap[typeof(decimal)] = DbType.Decimal;
typeMap[typeof(bool)] = DbType.Boolean;
typeMap[typeof(string)] = DbType.String;
typeMap[typeof(char)] = DbType.StringFixedLength;
typeMap[typeof(Guid)] = DbType.Guid;
typeMap[typeof(DateTime)] = DbType.DateTime;
typeMap[typeof(DateTimeOffset)] = DbType.DateTimeOffset;
typeMap[typeof(TimeSpan)] = DbType.Time;
typeMap[typeof(byte[])] = DbType.Binary;
typeMap[typeof(byte?)] = DbType.Byte;
typeMap[typeof(sbyte?)] = DbType.SByte;
typeMap[typeof(short?)] = DbType.Int16;
typeMap[typeof(ushort?)] = DbType.UInt16;
typeMap[typeof(int?)] = DbType.Int32;
typeMap[typeof(uint?)] = DbType.UInt32;
typeMap[typeof(long?)] = DbType.Int64;
typeMap[typeof(ulong?)] = DbType.UInt64;
typeMap[typeof(float?)] = DbType.Single;
typeMap[typeof(double?)] = DbType.Double;
typeMap[typeof(decimal?)] = DbType.Decimal;
typeMap[typeof(bool?)] = DbType.Boolean;
typeMap[typeof(char?)] = DbType.StringFixedLength;
typeMap[typeof(Guid?)] = DbType.Guid;
typeMap[typeof(DateTime?)] = DbType.DateTime;
typeMap[typeof(DateTimeOffset?)] = DbType.DateTimeOffset;
typeMap[typeof(TimeSpan?)] = DbType.Time;
typeMap[typeof(Object)] = DbType.Object;
}
///
/// 添加映射
///
///
///
public static void AddTypeMap(Type type, DbType dbType)
{
typeMap[type] = dbType;
}
internal const string LinqBinary = "System.Data.Linq.Binary";
///
/// 通过C#的实体属性的类型返回数据库中的类型
///
///
///
///
internal static DbType LookupDbType(Type type, string name)
{
DbType dbType;
var nullUnderlyingType = Nullable.GetUnderlyingType(type);
if (nullUnderlyingType != null) type = nullUnderlyingType;
if (type.IsEnum && !typeMap.ContainsKey(type))
{
type = Enum.GetUnderlyingType(type);
}
if (typeMap.TryGetValue(type, out dbType))
{
return dbType;
}
if (type.FullName == LinqBinary)
{
return DbType.Binary;
}
if (typeof(IEnumerable).IsAssignableFrom(type))
{
return (DbType)(-1);
}
throw new NotSupportedException(string.Format("类型{1}的成员{0}不能用作参数值", name, type));
}
///
/// 获取DataTable数据
///
///
///
public static ResponseModel GetDataTable(RequestItemSqlModel mod)
{
DataAccess db = mod.db; ResponseModel res = new ResponseModel(); QueryCommand cmd = new QueryCommand();
db = (db.IsNull()) ? DataAccessFactory.GetWriteDataDefault : mod.db;//创建数据库连接
if (db.IsNull())
{
res.IsSuccess = false;
res.Message = "数据库配置不正确";
return res;
}
try
{
res = GetSQLParameter(cmd, mod);
var dtt = db.ExecuteDataTable(res.StrSql, cmd.Parameters);
res.DataTable = dtt;
res.IsSuccess = dtt.Rows.Count > 0;
res.Message = (res.IsSuccess) ? "返回成功" : "没有查询到数据";
}
catch (Exception ex)
{
res.IsSuccess = false;
res.Message = ex.Message;
}
return res;
}
///
/// 获取实体对象
///
///
///
///
public ResponseModel GetModelList(RequestItemSqlModel mod)
{
DataAccess db = mod.db; ResponseModel res = new ResponseModel(); QueryCommand cmd = new QueryCommand();
db = (db.IsNull()) ? DataAccessFactory.GetWriteDataDefault : mod.db;//创建数据库连接
if (db.IsNull())
{
res.IsSuccess = false;
res.Message = "数据库配置不正确";
return res;
}
try
{
res = GetSQLParameter(cmd, mod);
var drr = db.ExecuteDataReader(res.StrSql, cmd.Parameters);
var list = DataToModel.Dr2EnList(drr);
res.ResultModel = list;
res.IsSuccess = list.Count > 0;
res.Message = (res.IsSuccess) ? "返回成功" : "没有查询到数据";
}
catch (Exception ex)
{
res.IsSuccess = false;
res.Message = ex.Message;
}
finally
{
if (!db.IsNull()) db.Close();
}
return res;
}
///
/// 获取数据库表返回的第一个值
///
/// 执行的sql查询
///
public ResponseModel GetFirst(RequestItemSqlModel mod)
{
DataAccess db = mod.db; ResponseModel res = new ResponseModel(); QueryCommand cmd = new QueryCommand();
try
{
if (db.ExecuteScalar(mod.StrSql) != null)
{
var obj = db.ExecuteScalar(mod.StrSql);
}
else
{
return res;
}
}
catch (Exception ex)
{
return null;
}
finally
{
db.Close();
}
return res;
}
///
/// 获取参数和SQL语句
///
///
///
///
internal static ResponseModel GetSQLParameter(QueryCommand cmds, RequestItemSqlModel mods)
{
ResponseModel res = new ResponseModel();
cmds.CommandText = mods.StrSql; PropertyInfo[] pInfos;
var para = mods.Parameter;
if (para.IfNotNull())
{
Type t = para.GetType();
pInfos = (!object.Equals(para, null)) ? para.GetType().GetProperties() : t.GetProperties();
foreach (PropertyInfo pinfo in pInfos)
{
if (!Object.Equals(para, null))//enty不等空时,并进行赋值
{
object obj = pinfo.GetValue(para, null);//列的值
if (!Object.Equals(obj, null))
{
var dbtype = pinfo.PropertyType;
QueryParameter parameter = new QueryParameter();
parameter.ParameterName = "@" + pinfo.Name;
parameter.DbType = GetDbType(dbtype);
parameter.Value = obj;
cmds.Parameters.Add(parameter);
}
}
}
}
System.Diagnostics.StackFrame[] sfs = mods.newSt.NewSt.GetFrames();
string sqlWithComment = string.Empty;
if (sfs.Count() > 0)
{
System.Diagnostics.StackFrame infos = sfs[0];
System.Reflection.MethodBase mb = infos.GetMethod();
var filename = infos.GetFileName();
sqlWithComment = string.Format(ConstSql.SQL_WITH_COMMENT, "自定义SQL执行", mods.newSt.Author, mods.newSt.SqlDesc, filename, mb.Name, mb.DeclaringType.FullName);
}
res.StrSql = string.Format(@"{0}{1}", cmds.CommandText, sqlWithComment);
return res;
}
///
/// Type类型转DbType
///
///
///
internal static DbType GetDbType(Type dbtype)
{
DbType dts;
if (dbtype == typeof(Int64) || dbtype == typeof(Int64?))
{
dts = DbType.Int64; return dts;
}
else if (dbtype == typeof(Int32) || dbtype == typeof(Int32?))
{
dts = DbType.Int32; return dts;
}
else if (dbtype == typeof(DateTime) || dbtype == typeof(DateTime?))
{
dts = DbType.DateTime; return dts;
}
else if (dbtype == typeof(Boolean) || dbtype == typeof(Boolean?))
{
dts = DbType.Boolean; return dts;
}
else if (dbtype == typeof(Single) || dbtype == typeof(Single?))
{
dts = DbType.Single; return dts;
}
else if (dbtype == typeof(Double) || dbtype == typeof(Double?))
{
dts = DbType.Double; return dts;
}
else if (dbtype == typeof(Decimal) || dbtype == typeof(Decimal?))
{
dts = DbType.Decimal; return dts;
}
else if (dbtype == typeof(Guid) || dbtype == typeof(Guid?))
{
dts = DbType.Guid; return dts;
}
else if (dbtype == typeof(Byte) || dbtype == typeof(Byte?))
{
dts = DbType.Byte; return dts;
}
else if (dbtype == typeof(SByte) || dbtype == typeof(SByte?))
{
dts = DbType.Byte; return dts;
}
else if (dbtype == typeof(Int16) || dbtype == typeof(Int16?))
{
dts = DbType.Int16; return dts;
}
else if (dbtype == typeof(Char) || dbtype == typeof(Char?))
{
dts = DbType.String; return dts;
}
else
dts = SQL.DataType.GetDbType(dbtype);
return dts;
}
///
/// C#数据类型转换为DbType这种方法类型不带?可以用这种,例如(Int32?)就不适用
///
///
///
internal static DbType TypeToDbType(Type t)
{
DbType dbt;
try
{
dbt = (DbType)Enum.Parse(typeof(DbType), t.Name);
}
catch
{
dbt = DbType.Object;
}
return dbt;
}
}
}