SqlHelp.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. using Ant.Common;
  2. using Ant.Data;
  3. using System;
  4. using System.Collections;
  5. using System.Collections.Generic;
  6. using System.Data;
  7. using System.Data.SqlClient;
  8. using System.Linq;
  9. using System.Reflection;
  10. using System.Text;
  11. namespace Ant.ORM
  12. {
  13. /// <summary>
  14. /// 自定义SQL执行类
  15. /// </summary>
  16. public class SqlHelp
  17. {
  18. static readonly Dictionary<Type, DbType> typeMap;
  19. /// <summary>
  20. ///
  21. /// </summary>
  22. static SqlHelp()
  23. {
  24. typeMap = new Dictionary<Type, DbType>();
  25. typeMap[typeof(byte)] = DbType.Byte;
  26. typeMap[typeof(sbyte)] = DbType.SByte;
  27. typeMap[typeof(short)] = DbType.Int16;
  28. typeMap[typeof(ushort)] = DbType.UInt16;
  29. typeMap[typeof(int)] = DbType.Int32;
  30. typeMap[typeof(uint)] = DbType.UInt32;
  31. typeMap[typeof(long)] = DbType.Int64;
  32. typeMap[typeof(ulong)] = DbType.UInt64;
  33. typeMap[typeof(float)] = DbType.Single;
  34. typeMap[typeof(double)] = DbType.Double;
  35. typeMap[typeof(decimal)] = DbType.Decimal;
  36. typeMap[typeof(bool)] = DbType.Boolean;
  37. typeMap[typeof(string)] = DbType.String;
  38. typeMap[typeof(char)] = DbType.StringFixedLength;
  39. typeMap[typeof(Guid)] = DbType.Guid;
  40. typeMap[typeof(DateTime)] = DbType.DateTime;
  41. typeMap[typeof(DateTimeOffset)] = DbType.DateTimeOffset;
  42. typeMap[typeof(TimeSpan)] = DbType.Time;
  43. typeMap[typeof(byte[])] = DbType.Binary;
  44. typeMap[typeof(byte?)] = DbType.Byte;
  45. typeMap[typeof(sbyte?)] = DbType.SByte;
  46. typeMap[typeof(short?)] = DbType.Int16;
  47. typeMap[typeof(ushort?)] = DbType.UInt16;
  48. typeMap[typeof(int?)] = DbType.Int32;
  49. typeMap[typeof(uint?)] = DbType.UInt32;
  50. typeMap[typeof(long?)] = DbType.Int64;
  51. typeMap[typeof(ulong?)] = DbType.UInt64;
  52. typeMap[typeof(float?)] = DbType.Single;
  53. typeMap[typeof(double?)] = DbType.Double;
  54. typeMap[typeof(decimal?)] = DbType.Decimal;
  55. typeMap[typeof(bool?)] = DbType.Boolean;
  56. typeMap[typeof(char?)] = DbType.StringFixedLength;
  57. typeMap[typeof(Guid?)] = DbType.Guid;
  58. typeMap[typeof(DateTime?)] = DbType.DateTime;
  59. typeMap[typeof(DateTimeOffset?)] = DbType.DateTimeOffset;
  60. typeMap[typeof(TimeSpan?)] = DbType.Time;
  61. typeMap[typeof(Object)] = DbType.Object;
  62. }
  63. /// <summary>
  64. /// 添加映射
  65. /// </summary>
  66. /// <param name="type"></param>
  67. /// <param name="dbType"></param>
  68. public static void AddTypeMap(Type type, DbType dbType)
  69. {
  70. typeMap[type] = dbType;
  71. }
  72. internal const string LinqBinary = "System.Data.Linq.Binary";
  73. /// <summary>
  74. /// 通过C#的实体属性的类型返回数据库中的类型
  75. /// </summary>
  76. /// <param name="type"></param>
  77. /// <param name="name"></param>
  78. /// <returns></returns>
  79. internal static DbType LookupDbType(Type type, string name)
  80. {
  81. DbType dbType;
  82. var nullUnderlyingType = Nullable.GetUnderlyingType(type);
  83. if (nullUnderlyingType != null) type = nullUnderlyingType;
  84. if (type.IsEnum && !typeMap.ContainsKey(type))
  85. {
  86. type = Enum.GetUnderlyingType(type);
  87. }
  88. if (typeMap.TryGetValue(type, out dbType))
  89. {
  90. return dbType;
  91. }
  92. if (type.FullName == LinqBinary)
  93. {
  94. return DbType.Binary;
  95. }
  96. if (typeof(IEnumerable).IsAssignableFrom(type))
  97. {
  98. return (DbType)(-1);
  99. }
  100. throw new NotSupportedException(string.Format("类型{1}的成员{0}不能用作参数值", name, type));
  101. }
  102. /// <summary>
  103. /// 获取DataTable数据
  104. /// </summary>
  105. /// <param name="mod"></param>
  106. /// <returns></returns>
  107. public static ResponseModel GetDataTable(RequestItemSqlModel mod)
  108. {
  109. DataAccess db = mod.db; ResponseModel res = new ResponseModel(); QueryCommand cmd = new QueryCommand();
  110. db = (db.IsNull()) ? DataAccessFactory.GetWriteDataDefault : mod.db;//创建数据库连接
  111. if (db.IsNull())
  112. {
  113. res.IsSuccess = false;
  114. res.Message = "数据库配置不正确";
  115. return res;
  116. }
  117. try
  118. {
  119. res = GetSQLParameter(cmd, mod);
  120. var dtt = db.ExecuteDataTable(res.StrSql, cmd.Parameters);
  121. res.DataTable = dtt;
  122. res.IsSuccess = dtt.Rows.Count > 0;
  123. res.Message = (res.IsSuccess) ? "返回成功" : "没有查询到数据";
  124. }
  125. catch (Exception ex)
  126. {
  127. res.IsSuccess = false;
  128. res.Message = ex.Message;
  129. }
  130. return res;
  131. }
  132. /// <summary>
  133. /// 获取实体对象
  134. /// </summary>
  135. /// <typeparam name="T"></typeparam>
  136. /// <param name="mod"></param>
  137. /// <returns></returns>
  138. public ResponseModel GetModelList<T>(RequestItemSqlModel mod)
  139. {
  140. DataAccess db = mod.db; ResponseModel res = new ResponseModel(); QueryCommand cmd = new QueryCommand();
  141. db = (db.IsNull()) ? DataAccessFactory.GetWriteDataDefault : mod.db;//创建数据库连接
  142. if (db.IsNull())
  143. {
  144. res.IsSuccess = false;
  145. res.Message = "数据库配置不正确";
  146. return res;
  147. }
  148. try
  149. {
  150. res = GetSQLParameter(cmd, mod);
  151. var drr = db.ExecuteDataReader(res.StrSql, cmd.Parameters);
  152. var list = DataToModel.Dr2EnList<T>(drr);
  153. res.ResultModel = list;
  154. res.IsSuccess = list.Count > 0;
  155. res.Message = (res.IsSuccess) ? "返回成功" : "没有查询到数据";
  156. }
  157. catch (Exception ex)
  158. {
  159. res.IsSuccess = false;
  160. res.Message = ex.Message;
  161. }
  162. finally
  163. {
  164. if (!db.IsNull()) db.Close();
  165. }
  166. return res;
  167. }
  168. /// <summary>
  169. /// 获取数据库表返回的第一个值
  170. /// </summary>
  171. /// <param name="comText">执行的sql查询</param>
  172. /// <returns></returns>
  173. public ResponseModel GetFirst(RequestItemSqlModel mod)
  174. {
  175. DataAccess db = mod.db; ResponseModel res = new ResponseModel(); QueryCommand cmd = new QueryCommand();
  176. try
  177. {
  178. if (db.ExecuteScalar(mod.StrSql) != null)
  179. {
  180. var obj = db.ExecuteScalar(mod.StrSql);
  181. }
  182. else
  183. {
  184. return res;
  185. }
  186. }
  187. catch (Exception ex)
  188. {
  189. return null;
  190. }
  191. finally
  192. {
  193. db.Close();
  194. }
  195. return res;
  196. }
  197. /// <summary>
  198. /// 获取参数和SQL语句
  199. /// </summary>
  200. /// <param name="cmd"></param>
  201. /// <param name="mod"></param>
  202. /// <returns></returns>
  203. internal static ResponseModel GetSQLParameter(QueryCommand cmds, RequestItemSqlModel mods)
  204. {
  205. ResponseModel res = new ResponseModel();
  206. cmds.CommandText = mods.StrSql; PropertyInfo[] pInfos;
  207. var para = mods.Parameter;
  208. if (para.IfNotNull())
  209. {
  210. Type t = para.GetType();
  211. pInfos = (!object.Equals(para, null)) ? para.GetType().GetProperties() : t.GetProperties();
  212. foreach (PropertyInfo pinfo in pInfos)
  213. {
  214. if (!Object.Equals(para, null))//enty不等空时,并进行赋值
  215. {
  216. object obj = pinfo.GetValue(para, null);//列的值
  217. if (!Object.Equals(obj, null))
  218. {
  219. var dbtype = pinfo.PropertyType;
  220. QueryParameter parameter = new QueryParameter();
  221. parameter.ParameterName = "@" + pinfo.Name;
  222. parameter.DbType = GetDbType(dbtype);
  223. parameter.Value = obj;
  224. cmds.Parameters.Add(parameter);
  225. }
  226. }
  227. }
  228. }
  229. System.Diagnostics.StackFrame[] sfs = mods.newSt.NewSt.GetFrames();
  230. string sqlWithComment = string.Empty;
  231. if (sfs.Count() > 0)
  232. {
  233. System.Diagnostics.StackFrame infos = sfs[0];
  234. System.Reflection.MethodBase mb = infos.GetMethod();
  235. var filename = infos.GetFileName();
  236. sqlWithComment = string.Format(ConstSql.SQL_WITH_COMMENT, "自定义SQL执行", mods.newSt.Author, mods.newSt.SqlDesc, filename, mb.Name, mb.DeclaringType.FullName);
  237. }
  238. res.StrSql = string.Format(@"{0}{1}", cmds.CommandText, sqlWithComment);
  239. return res;
  240. }
  241. /// <summary>
  242. /// Type类型转DbType
  243. /// </summary>
  244. /// <param name="dbtype"></param>
  245. /// <returns></returns>
  246. internal static DbType GetDbType(Type dbtype)
  247. {
  248. DbType dts;
  249. if (dbtype == typeof(Int64) || dbtype == typeof(Int64?))
  250. {
  251. dts = DbType.Int64; return dts;
  252. }
  253. else if (dbtype == typeof(Int32) || dbtype == typeof(Int32?))
  254. {
  255. dts = DbType.Int32; return dts;
  256. }
  257. else if (dbtype == typeof(DateTime) || dbtype == typeof(DateTime?))
  258. {
  259. dts = DbType.DateTime; return dts;
  260. }
  261. else if (dbtype == typeof(Boolean) || dbtype == typeof(Boolean?))
  262. {
  263. dts = DbType.Boolean; return dts;
  264. }
  265. else if (dbtype == typeof(Single) || dbtype == typeof(Single?))
  266. {
  267. dts = DbType.Single; return dts;
  268. }
  269. else if (dbtype == typeof(Double) || dbtype == typeof(Double?))
  270. {
  271. dts = DbType.Double; return dts;
  272. }
  273. else if (dbtype == typeof(Decimal) || dbtype == typeof(Decimal?))
  274. {
  275. dts = DbType.Decimal; return dts;
  276. }
  277. else if (dbtype == typeof(Guid) || dbtype == typeof(Guid?))
  278. {
  279. dts = DbType.Guid; return dts;
  280. }
  281. else if (dbtype == typeof(Byte) || dbtype == typeof(Byte?))
  282. {
  283. dts = DbType.Byte; return dts;
  284. }
  285. else if (dbtype == typeof(SByte) || dbtype == typeof(SByte?))
  286. {
  287. dts = DbType.Byte; return dts;
  288. }
  289. else if (dbtype == typeof(Int16) || dbtype == typeof(Int16?))
  290. {
  291. dts = DbType.Int16; return dts;
  292. }
  293. else if (dbtype == typeof(Char) || dbtype == typeof(Char?))
  294. {
  295. dts = DbType.String; return dts;
  296. }
  297. else
  298. dts = SQL.DataType.GetDbType(dbtype);
  299. return dts;
  300. }
  301. /// <summary>
  302. /// C#数据类型转换为DbType这种方法类型不带?可以用这种,例如(Int32?)就不适用
  303. /// </summary>
  304. /// <param name="t"></param>
  305. /// <returns></returns>
  306. internal static DbType TypeToDbType(Type t)
  307. {
  308. DbType dbt;
  309. try
  310. {
  311. dbt = (DbType)Enum.Parse(typeof(DbType), t.Name);
  312. }
  313. catch
  314. {
  315. dbt = DbType.Object;
  316. }
  317. return dbt;
  318. }
  319. }
  320. }