MSSqlQueryCommandBuilder.cs 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Data;
  5. using Ant.Frame;
  6. using System.Linq;
  7. using System.Linq.Expressions;
  8. using Ant.Data;
  9. using System.Reflection;
  10. using Ant.DbExpressions;
  11. using Ant.Common;
  12. using Ant.Descriptors;
  13. namespace Ant.ORM
  14. {
  15. public class MSSqlQueryCommandBuilder : QueryCommandBuilder
  16. {
  17. public override QueryCommand GetQueryCommand()
  18. {
  19. QueryCommand cmd = null;
  20. EntityPersistType strtype = (!PersistType.IsNull()) ? PersistType : Md.PersistType;//如果PersistType不为空说明方法赋了操作方式,否则到实体中获取操作方式
  21. switch (strtype)
  22. {
  23. case EntityPersistType.Save:
  24. cmd = ParserInsertCommand();
  25. break;
  26. case EntityPersistType.Update:
  27. cmd = ParserUpdateEntyCommand();
  28. break;
  29. case EntityPersistType.Delete:
  30. cmd = ParserDeleteCommand();
  31. break;
  32. case EntityPersistType.Query://查询
  33. cmd = ParserSelectCommand();
  34. break;
  35. case EntityPersistType.Sum://统计记录数
  36. cmd = ParserSumCommand();
  37. break;
  38. case EntityPersistType.eNonDelete://假删除
  39. cmd = ParserEXCommand();
  40. break;
  41. case EntityPersistType.QueryPage://查询分页
  42. cmd = ParserQueryPageCommand();
  43. break;
  44. }
  45. return cmd;
  46. }
  47. #region 解析假删除
  48. private QueryCommand ParserEXCommand()
  49. {
  50. QueryCommand qc = new QueryCommand();
  51. //StringBuilder sql = new StringBuilder(); var FM = Md.FiledMeta;//列属性
  52. //if (SqlType == SqlEnum.MainSql)
  53. //{
  54. // foreach (string key in Md.Fields.Keys)
  55. // {
  56. // if (!FM.FieldMeteDatas[key].IsAutoincrement)
  57. // {
  58. // QueryParameter parameter = new QueryParameter();
  59. // parameter.ParameterName = "@" + FM.FieldMeteDatas[key].ColumnName;
  60. // parameter.DbType = FM.FieldMeteDatas[key].ColumnType;
  61. // parameter.Value = Md.Fields[key];
  62. // qc.Parameters.Add(parameter);
  63. // }
  64. // }
  65. //}
  66. //if (SqlType == SqlEnum.ChildSql)
  67. //{
  68. // foreach (ChildMataData childmod in FM.ChildObjects.Values)
  69. // {
  70. // }
  71. //}
  72. //if (SqlType == SqlEnum.ReferenceSql)
  73. //{
  74. // foreach (ReferenceMataData refermod in FM.ReferenceObjects.Values)
  75. // {
  76. // }
  77. //}
  78. //qc.CommandText = sql.ToString();
  79. return qc;
  80. }
  81. #endregion
  82. #region 解析Insert SQL
  83. /// <summary>
  84. /// 解析Insert SQL
  85. /// </summary>
  86. /// <returns></returns>
  87. private QueryCommand ParserInsertCommand()
  88. {
  89. QueryCommand qc = new QueryCommand();
  90. List<string> columnlist = new List<string>();
  91. List<string> paramlist = new List<string>();
  92. List<string> valuelist = new List<string>();
  93. bool IsAutoincrement = false;
  94. var typedesc = Md.FiledMeta.MemberColumnMap;
  95. foreach (var kv in typedesc)
  96. {
  97. MemberInfo member = kv.Key;
  98. //Md.FiledMeta.Fields.Add(member);
  99. MappingMemberDescriptor memberDescriptor = MetaDataManager.TryGetMappingMemberDescriptor(kv.Key, Md.FiledMeta);
  100. var val = (Md.FieldsColumns.Keys.Contains(member.Name)) ? Md.FieldsColumns[member.Name].Value : null;
  101. if (!MetaDataManager.IsAutoIncrement(memberDescriptor, Md))
  102. {
  103. columnlist.Add(string.Format("[{0}]", memberDescriptor.Column.Name));
  104. paramlist.Add("@" + memberDescriptor.Column.Name);
  105. QueryParameter parameter = new QueryParameter();
  106. parameter.ParameterName = "@" + memberDescriptor.Column.Name;
  107. parameter.DbType = (DbType)AntUtils.TryGetDbType(memberDescriptor.Column.Type);
  108. parameter.Direction = ParameterDirection.Input;
  109. if (val.IsNull())
  110. val = SetDefaultValue(parameter.DbType);
  111. parameter.Value = val;
  112. valuelist.Add("'" + val + "'");
  113. qc.Parameters.Add(parameter);
  114. }
  115. }
  116. string sqlstr = string.Format(ConstSql.SQL_INSERT_TABLE, Md.FiledMeta.Table.Name, columnlist.AppendStrings(), paramlist.AppendStrings(),
  117. IsAutoincrement ? ConstSql.SQL_SCOPE_IDENTITY : string.Empty);
  118. qc.CommandText = sqlstr;
  119. qc.SqlString = string.Format(ConstSql.SQL_INSERT_TABLE, Md.FiledMeta.Table.Name, columnlist.AppendStrings(),
  120. valuelist.AppendStrings(), IsAutoincrement ? ConstSql.SQL_SCOPE_IDENTITY : string.Empty);
  121. return qc;
  122. }
  123. #endregion
  124. /// <summary>
  125. /// 获取自增长ID
  126. /// </summary>
  127. /// <returns></returns>
  128. public string GetLastInsertID()
  129. {
  130. return "SELECT ISNULL(SCOPE_IDENTITY(),@@rowcount)";
  131. }
  132. #region 解析Update SQL语句
  133. /// <summary>
  134. /// 解析Update SQL语句
  135. /// </summary>
  136. /// <returns></returns>
  137. private QueryCommand ParserUpdateEntyCommand()
  138. {
  139. //string strsql = string.Format(" UPDATE {0} SET {1} WHERE {2} ", Md.TableName, "", "");
  140. QueryCommand qc = new QueryCommand(); string strwhere = string.Empty;
  141. StringBuilder sql = new StringBuilder();//SQL语句
  142. StringBuilder sqlstr = new StringBuilder();
  143. List<string> updateColumns = new List<string>();//更新列
  144. List<string> StrupdateColumns = new List<string>();
  145. List<string> WhereColumn = new List<string>();//条件列
  146. List<string> StrWhereColumn = new List<string>();//条件列
  147. sql.AppendFormat("UPDATE [{0}] SET ", Md.FiledMeta.Table.Name);
  148. List<string> condition = new List<string>();
  149. #region 更新字段
  150. if (Md.UpdateColumns.IsNull())
  151. {
  152. var typedesc = Md.FiledMeta.MemberColumnMap;
  153. if (Md.FiledMeta.AutoIncrement.IfNotNull())
  154. {
  155. //IsAutoincrement = true;
  156. typedesc.Remove(Md.FiledMeta.AutoIncrement.MemberInfo);
  157. }
  158. foreach (var kv in typedesc)
  159. {
  160. MemberInfo member = kv.Key;
  161. MappingMemberDescriptor memberDescriptor = MetaDataManager.TryGetMappingMemberDescriptor(member, Md.FiledMeta);
  162. var column = memberDescriptor.Column;
  163. updateColumns.Add(string.Format("[{0}]=@{0}", column.Name));
  164. qc.Parameters.Add("@" + column.Name, (DbType)AntUtils.TryGetDbType(column.Type), column.Value);
  165. StrupdateColumns.Add(string.Format("[{0}]='{1}'", column.Name, column.Value));
  166. }
  167. }
  168. else
  169. {
  170. foreach (var column in Md.UpdateColumns)
  171. {
  172. if (column.Value.Value.IfNotNull())
  173. {
  174. updateColumns.Add(string.Format("[{0}]=@{0}", column.Key));
  175. qc.Parameters.Add("@" + column.Key, (DbType)AntUtils.TryGetDbType(column.Value.Type), column.Value.Value);
  176. StrupdateColumns.Add(string.Format("[{0}]='{1}'", column.Key, column.Value.Value));
  177. }
  178. }
  179. }
  180. #endregion
  181. if (Md.FiledMeta.PrimaryKey.Column.Value.IfNotNull())//通过主键作用查询条件
  182. {
  183. WhereColumn.Add(string.Format("[{0}]=@{0}", Md.FiledMeta.PrimaryKey.MemberInfo.Name));
  184. qc.Parameters.Add("@" + Md.FiledMeta.PrimaryKey.Column.Name, (DbType)AntUtils.TryGetDbType(Md.FiledMeta.PrimaryKey.Column.Type), Md.FiledMeta.PrimaryKey.Column.Value);
  185. StrWhereColumn.Add(string.Format("[{0}]='{1}'", Md.FiledMeta.PrimaryKey.Column.Name, Md.FiledMeta.PrimaryKey.Column.Value));
  186. }
  187. else
  188. {//通过查询实体进行查询
  189. #region 给实体赋值的查询条件更新
  190. foreach (var key in Md.WhereColumns.Values)
  191. {
  192. WhereColumn.Add(string.Format("[{0}]=@{0}", key.Name));
  193. qc.Parameters.Add("@" + key.Name, (DbType)AntUtils.TryGetDbType(key.Type), key.Value);
  194. StrWhereColumn.Add(string.Format("[{0}]={1}", key.Name, key.Value));
  195. }
  196. #endregion
  197. }
  198. if (updateColumns.Count > 0)//更新字段
  199. {
  200. #region 带时间戳
  201. if (Md.FieldsColumns.ContainsKey("Version"))
  202. {
  203. //WhereColumn.Add(string.Format(" {0}+0=@{0}", Md.FieldMeteDatas["Version"].ColumnName));
  204. WhereColumn.Add(string.Format(" CONVERT(bigint,{0})=@{0}", Md.FieldsColumns["Version"].Name));
  205. qc.Parameters.Add("@" + Md.FieldsColumns["Version"].Name, (DbType)AntUtils.TryGetDbType(Md.FieldsColumns["Version"].Type), Md.FieldsColumns["Version"].Value);
  206. StrWhereColumn.Add(string.Format(" CONVERT(bigint,{0})='{1}'", Md.FieldsColumns["Version"].Name, Md.FieldsColumns["Version"].Value));
  207. }
  208. #endregion
  209. sql.Append(string.Join(",", updateColumns.ToArray())).Append(" WHERE ").Append(string.Join(" AND ", WhereColumn.ToArray()));
  210. if (!string.IsNullOrEmpty(Md.WhereSql))
  211. {//有自定义查询条件的时候
  212. if (Md.WhereSql.Trim().Length > 0) WhereColumn.Add(Md.WhereSql);
  213. }
  214. if (Predicate.IfNotNull())
  215. {
  216. var FlieldWhere = new FieldValueCollection();
  217. strwhere = Predicate.GetSql(FlieldWhere, qc);//拼接SQL语句
  218. if (!strwhere.IsEmpty())
  219. {
  220. sql.AppendFormat(" and {0} ", strwhere);
  221. foreach (string key in FlieldWhere.Keys)
  222. {
  223. strwhere = strwhere.Replace(key.ToString(), "'" + FlieldWhere[key].ToString() + "'");
  224. }
  225. sqlstr.AppendFormat(" and {0} ", strwhere);
  226. }
  227. }
  228. qc.CommandText = sql.ToString();
  229. qc.SqlString = string.Format(ConstSql.SQL_UPDATE_TABLE, Md.FiledMeta.Table.Name, string.Join(",", StrupdateColumns.ToArray()), string.Join(" AND ", StrWhereColumn.ToArray()) + (strwhere.IsEmpty() ? strwhere : " and " + strwhere));
  230. }
  231. return qc;
  232. }
  233. #endregion
  234. #region 解析 Delete SQL语句
  235. /// <summary>
  236. /// 解析 Delete SQL语句
  237. /// </summary>
  238. /// <returns></returns>
  239. private QueryCommand ParserDeleteCommand()
  240. {
  241. QueryCommand qc = new QueryCommand();
  242. StringBuilder sql = new StringBuilder();
  243. StringBuilder sqlstr = new StringBuilder();
  244. List<string> WhereColumn = new List<string>();//条件列集合
  245. List<string> WhereColumnStr = new List<string>();
  246. if (!Md.FieldsColumns.IsNull())
  247. {
  248. foreach (string key in Md.FieldsColumns.Keys)//查询条件
  249. {
  250. //if (!Object.Equals(Md.Fields[key], null) || !Object.Equals(Md.Fields[key], DBNull.Value))
  251. if (!(Md.FieldsColumns[key].IsNull()))
  252. {
  253. if (!Md.FieldsColumns[key].Value.ToString().IsEmpty())
  254. {
  255. WhereColumn.Add(string.Format(" [{0}].{1}=@{2} ", Md.FiledMeta.Table.Name, Md.FieldsColumns[key].Name, Md.FieldsColumns[key].Name));
  256. qc.Parameters.Add("@" + Md.FieldsColumns[key].Name, (DbType)AntUtils.TryGetDbType(Md.FieldsColumns[key].Type), Md.FieldsColumns[key].Value);
  257. WhereColumnStr.Add(string.Format(" [{0}].{1}={2} ", Md.FiledMeta.Table.Name, Md.FieldsColumns[key].Name, Md.FieldsColumns[key].Value));
  258. }
  259. }
  260. }
  261. }
  262. if (!Md.WhereSql.IsNull())
  263. {
  264. if (Md.WhereSql.Trim().Length > 0)
  265. {
  266. string sqlwherestr = (Md.WhereSql.StartsWith("(") && Md.WhereSql.EndsWith(")")) ? Md.WhereSql : " (" + Md.WhereSql + ") ";
  267. WhereColumn.Add(sqlwherestr);
  268. WhereColumnStr.Add(sqlwherestr);
  269. }
  270. }
  271. sql.AppendFormat(ConstSql.SQL_DELETE_DATA, Md.FiledMeta.Table.Name, (WhereColumn.Count > 0) ? string.Format(" and {0}", string.Join(" AND ", WhereColumn.ToArray())) : string.Empty);
  272. sqlstr.AppendFormat(ConstSql.SQL_DELETE_DATA, Md.FiledMeta.Table.Name, (WhereColumnStr.Count > 0) ? string.Format(" and {0}", string.Join(" AND ", WhereColumnStr.ToArray())) : string.Empty);
  273. if (Predicate.IfNotNull())
  274. {
  275. var FlieldWhere = new FieldValueCollection();
  276. string strwhere = Predicate.GetSql(FlieldWhere, qc);//拼接SQL语句
  277. if (!strwhere.IsEmpty())
  278. {
  279. sql.AppendFormat(" and {0} ", strwhere);
  280. foreach (string key in FlieldWhere.Keys)
  281. {
  282. strwhere = strwhere.Replace(key.ToString(), "'" + FlieldWhere[key].ToString() + "'");
  283. }
  284. sqlstr.AppendFormat(" and {0} ", strwhere);
  285. }
  286. }
  287. qc.CommandText = sql.ToString();
  288. qc.SqlString = sqlstr.ToString();
  289. return qc;
  290. }
  291. #endregion
  292. #region 解析 Select SQL语句
  293. /// <summary>
  294. /// 解析 Select SQL语句
  295. /// </summary>
  296. /// <returns></returns>
  297. private QueryCommand ParserSelectCommand()
  298. {
  299. QueryCommand qc = new QueryCommand() { DbParmChar = DbParmChar };
  300. StringBuilder sql = new StringBuilder();
  301. StringBuilder sqlstr = new StringBuilder();
  302. switch (SqlType)
  303. {
  304. case SqlEnum.MainSql:
  305. {
  306. string topnum = Top.IsEmpty() ? string.Empty : " top " + Top;
  307. sql.AppendFormat(ConstSql.SQL_GET_VALUE, topnum, FieldColumn(), Md.FiledMeta.Table.Name);//显示自定义的字段
  308. List<string> WhereColumn = new List<string>();//条件列集合
  309. List<string> WhereColumnStr = new List<string>();//条件列集合
  310. if (Md.FieldsColumns.IfNotNull())//查询条件
  311. {
  312. foreach (string key in Md.FieldsColumns.Keys)
  313. {
  314. var field = Md.FieldsColumns[key];
  315. if (!(field.Value.IsNull()))
  316. {
  317. if (!field.Value.ToString().IsEmpty())
  318. {
  319. WhereColumn.Add(string.Format(" [{0}].{1}=@{2} ", Md.FiledMeta.Table.Name, field.Name,
  320. field.Name));
  321. qc.Parameters.Add("@" + field.Name, (DbType)AntUtils.TryGetDbType(field.Type), field.Value);
  322. WhereColumnStr.Add(string.Format(" [{0}].{1}='{2}' ", Md.FiledMeta.Table.Name, field.Name, field.Value));
  323. }
  324. }
  325. }
  326. }
  327. else
  328. {
  329. if (!Md.WhereSql.IsEmpty()) sql.AppendFormat(" and {0} ", Md.WhereSql);
  330. }
  331. sqlstr.Append(sql.ToString());
  332. if (WhereColumn.Count > 0) sql.AppendFormat(" and {0} ", string.Join(" AND ", WhereColumn.ToArray()));
  333. if (WhereColumnStr.Count > 0) sqlstr.AppendFormat(" and {0} ", string.Join(" AND ", WhereColumnStr.ToArray()));
  334. if (Predicate.IfNotNull())
  335. {
  336. var FlieldWhere = new FieldValueCollection();
  337. string strwhere = Predicate.GetSql(FlieldWhere, qc);//拼接SQL语句
  338. if (!strwhere.IsEmpty())
  339. {
  340. sql.AppendFormat(" and {0} ", strwhere);
  341. foreach (string key in FlieldWhere.Keys)
  342. {
  343. strwhere = strwhere.Replace(key.ToString(), "'" + FlieldWhere[key].ToString() + "'");
  344. }
  345. sqlstr.AppendFormat(" and {0} ", strwhere);
  346. }
  347. }
  348. string orderstr = GetOrderBy();
  349. sql.Append(orderstr);
  350. sqlstr.Append(orderstr);
  351. WhereColumn = null; WhereColumnStr = null;
  352. }
  353. break;
  354. }
  355. qc.CommandText = sql.ToString();
  356. qc.SqlString = sqlstr.ToString();
  357. sqlstr = null; sql = null;
  358. return qc;
  359. }
  360. /// <summary>
  361. /// 获取排序
  362. /// </summary>
  363. /// <returns></returns>
  364. public string GetOrderBy()
  365. {
  366. string orderbystr = string.Empty;
  367. if (Sort.IsNull())
  368. {
  369. orderbystr = (orderbystr.Trim().IndexOf("order by", StringComparison.InvariantCultureIgnoreCase) != -1) ? string.Format(" {0} ", Md.FiledMeta.PrimaryKey.MemberInfo.Name) : string.Format(" order by {0}", Md.FiledMeta.PrimaryKey.MemberInfo.Name);
  370. }
  371. else
  372. {
  373. string orderby = string.Empty;
  374. foreach (ISort sort in Sort)
  375. {
  376. if (orderby.IsEmpty())
  377. {
  378. orderby = sort.PropertyName + (sort.Ascending ? " ASC" : " DESC");
  379. }
  380. else
  381. {
  382. orderby += " ," + sort.PropertyName + (sort.Ascending ? " ASC" : " DESC");
  383. }
  384. }
  385. orderbystr = string.Format(" ORDER BY {0} ", orderby);
  386. }
  387. return orderbystr;
  388. }
  389. /// <summary>
  390. /// 解析 Select 所有记录 SQL语句
  391. /// </summary>
  392. /// <returns></returns>
  393. private QueryCommand ParserSumCommand()
  394. {
  395. QueryCommand qc = new QueryCommand();
  396. StringBuilder sql = new StringBuilder();
  397. StringBuilder sqlstr = new StringBuilder();
  398. sql.AppendFormat(" SELECT COUNT(1) FROM [{0}] with(nolock) WHERE 1=1 ", Md.FiledMeta.Table.Name);
  399. sqlstr.AppendFormat(" SELECT COUNT(1) FROM [{0}] with(nolock) WHERE 1=1 ", Md.FiledMeta.Table.Name);
  400. List<string> WhereColumn = new List<string>();//条件列集合
  401. List<string> WhereColumnStr = new List<string>();//条件列集合
  402. if (!Md.FiledMeta.Fields.IsNull())
  403. {
  404. foreach (string key in Md.FieldsColumns.Keys)//查询条件
  405. {
  406. //if (!Object.Equals(Md.Fields[key], null) || !Object.Equals(Md.Fields[key], DBNull.Value))
  407. if (!(Md.FieldsColumns[key].IsNull()))
  408. {
  409. if (!Md.FieldsColumns[key].Value.ToString().IsEmpty())
  410. {
  411. WhereColumn.Add(string.Format(" [{0}].{1}=@{2} ", Md.FiledMeta.Table.Name, Md.FieldsColumns[key].Name, Md.FieldsColumns[key].Name));
  412. qc.Parameters.Add("@" + Md.FieldsColumns[key].Name, (DbType)AntUtils.TryGetDbType(Md.FieldsColumns[key].Type), Md.FieldsColumns[key].Value);
  413. WhereColumnStr.Add(string.Format(" [{0}].{1}='{2}' ", Md.FiledMeta.Table.Name, Md.FieldsColumns[key].Name, Md.FieldsColumns[key].Value));
  414. }
  415. }
  416. }
  417. }
  418. if (!Md.WhereSql.IsNull())
  419. {
  420. if (Md.WhereSql.Trim().Length > 0)
  421. {
  422. string sqlwherestr = (Md.WhereSql.StartsWith("(") && Md.WhereSql.EndsWith(")")) ? Md.WhereSql : " (" + Md.WhereSql + ") ";
  423. WhereColumn.Add(sqlwherestr);
  424. WhereColumnStr.Add(sqlwherestr);
  425. }
  426. }
  427. if (WhereColumn.Count > 0) sql.AppendFormat(" and {0} ", string.Join(" AND ", WhereColumn.ToArray()));
  428. if (WhereColumnStr.Count > 0) sqlstr.AppendFormat(" and {0} ", string.Join(" AND ", WhereColumnStr.ToArray()));
  429. if (Predicate.IfNotNull())
  430. {
  431. var FlieldWhere = new FieldValueCollection();
  432. string strwhere = Predicate.GetSql(FlieldWhere, qc);//拼接SQL语句
  433. if (!strwhere.IsEmpty())
  434. {
  435. sql.AppendFormat(" and {0} ", strwhere);
  436. foreach (string key in FlieldWhere.Keys)
  437. {
  438. strwhere = strwhere.Replace(key.ToString(), "'" + FlieldWhere[key].ToString() + "'");
  439. }
  440. sqlstr.AppendFormat(" and {0} ", strwhere);
  441. }
  442. }
  443. qc.CommandText = sql.ToString();
  444. qc.SqlString = sqlstr.ToString();
  445. sqlstr = null; sql = null; WhereColumn = null; WhereColumnStr = null;
  446. return qc;
  447. }
  448. #endregion
  449. #region 解析 查询分页 SQL语句
  450. /// <summary>
  451. /// 解析 Select SQL语句
  452. /// </summary>
  453. /// <returns></returns>
  454. private QueryCommand ParserQueryPageCommand()
  455. {
  456. List<string> WhereColumn = new List<string>();
  457. List<string> WhereColumnStr = new List<string>();//条件列集合
  458. QueryCommand qc = new QueryCommand() { DbParmChar = DbParmChar };
  459. StringBuilder sql = new StringBuilder();
  460. if (Md.FieldsColumns.IfNotNull())//查询条件
  461. {
  462. foreach (string key in Md.FieldsColumns.Keys)
  463. {
  464. var field = Md.FieldsColumns[key];
  465. if (!(field.Value.IsNull()))
  466. {
  467. if (!field.Value.ToString().IsEmpty())
  468. {
  469. string parmname = string.Format("@{0}_{1}", field.Name, qc.Parameters.Count);
  470. WhereColumn.Add(string.Format(" [{0}].{1}=@{2} ", Md.FiledMeta.Table.Name, field.Name,
  471. parmname));
  472. qc.Parameters.Add("@" + parmname, (DbType)AntUtils.TryGetDbType(field.Type), field.Value);
  473. WhereColumnStr.Add(string.Format(" [{0}].{1}='{2}' ", Md.FiledMeta.Table.Name, field.Name, field.Value));
  474. }
  475. }
  476. }
  477. }
  478. sql.AppendFormat(" select {0} ", "*");
  479. sql.AppendFormat(" from ( select top {0} {1} ,ROW_Number() OVER ( order by [{2}].{3} ) AS r", PageNo * PageSize, FieldColumn(), Md.FiledMeta.Table.Name, "");
  480. sql.AppendFormat(" FROM [{0}] with(nolock) WHERE 1=1 ", Md.FiledMeta.Table.Name);
  481. if (WhereColumn.Count > 0) sql.AppendFormat(" and {0}", string.Join(" AND ", WhereColumn.ToArray()));
  482. //if (Predicate.IfNotNull())
  483. //{
  484. // string strwhere = Predicate.GetSql(Md, qc);//拼接SQL语句
  485. // sql.AppendFormat(" and {0}", strwhere);
  486. //}
  487. if (Predicate.IfNotNull())
  488. {
  489. var FlieldWhere = new FieldValueCollection();
  490. string strwhere = Predicate.GetSql(FlieldWhere, qc);//拼接SQL语句
  491. if (!strwhere.IsEmpty())
  492. {
  493. sql.AppendFormat(" and {0} ", strwhere);
  494. //foreach (string key in FlieldWhere.Keys)
  495. //{
  496. // strwhere = strwhere.Replace(key.ToString(), "'" + FlieldWhere[key].ToString() + "'");
  497. //}
  498. //sqlstr.AppendFormat(" and {0} ", strwhere);
  499. }
  500. }
  501. if (Md.WhereSql.Length > 0) sql.AppendFormat(" {0}", Md.WhereSql);
  502. sql.AppendFormat(" ) A where A.r BETWEEN '{0}' AND '{1}'", (((PageNo - 1) * PageSize) + 1), (PageNo * PageSize));
  503. if (!qc.SqlNotes.IsNull())
  504. qc.CommandText = sql.ToString();
  505. else
  506. qc.CommandText = sql.ToString();
  507. string sqlstr = sql.ToString();
  508. qc.SqlString = sqlstr;
  509. return qc;
  510. }
  511. #endregion
  512. /// <summary>
  513. /// 获取显示字段列
  514. /// </summary>
  515. /// <returns></returns>
  516. private string FieldColumn()
  517. {
  518. List<string> columns = new List<string>();
  519. string fieldcolumn = string.Empty;
  520. if (!ShowField.IsEmpty())
  521. {
  522. fieldcolumn = ShowField;
  523. }
  524. else
  525. {
  526. foreach (MemberInfo df in Md.FiledMeta.MemberColumnMap.Keys)//显示字段
  527. {
  528. columns.Add(string.Format("{0}", "[" + Md.FiledMeta.Table.Name + "]." + df.Name));
  529. }
  530. fieldcolumn = string.Join(",", columns.ToArray());
  531. }
  532. fieldcolumn = fieldcolumn.IsEmpty() ? " * " : fieldcolumn;
  533. return fieldcolumn;
  534. }
  535. private QueryCommand ParserRightQueryCommand()
  536. {
  537. List<string> columns = new List<string>(); List<string> WhereColumn = new List<string>();
  538. QueryCommand qc = new QueryCommand();
  539. StringBuilder sql = new StringBuilder();
  540. return qc;
  541. }
  542. /// <summary>
  543. /// 通配符转换
  544. /// </summary>
  545. /// <param name="str"></param>
  546. /// <returns></returns>
  547. protected static string GetEscape(string str)
  548. {
  549. return str.Replace("!", "!!").Replace("%", "!%").Replace("_", "!_");
  550. }
  551. /// <summary>
  552. /// 判断是否有记录
  553. /// </summary>
  554. /// <returns></returns>
  555. private bool IsMdValuesCount()
  556. {
  557. //if (!Object.Equals(Md.Values, null) && !Object.Equals(Md.Values, DBNull.Value))
  558. //{
  559. // if (Md.Values.Count > 0)
  560. // return true;
  561. //}
  562. return false;
  563. }
  564. /// <summary>
  565. /// 判断是否有值
  566. /// </summary>
  567. /// <param name="fieldvalue"></param>
  568. /// <returns></returns>
  569. private bool IsFieldValue(FieldValueCollection fieldvalue)
  570. {
  571. if (!Object.Equals(fieldvalue, null) && !Object.Equals(fieldvalue, DBNull.Value))
  572. {
  573. if (fieldvalue.Count > 0)
  574. {
  575. return true;
  576. }
  577. }
  578. return false;
  579. }
  580. /// <summary>
  581. /// 获取默认值
  582. /// </summary>
  583. /// <param name="key"></param>
  584. /// <returns></returns>
  585. private object SetDefaultValue(DbType ColumnType)
  586. {
  587. object value = null;
  588. switch (ColumnType)
  589. {
  590. case DbType.String:
  591. {
  592. value = "";
  593. }
  594. break;
  595. case DbType.Boolean:
  596. {
  597. value = false;
  598. }
  599. break;
  600. case DbType.Decimal:
  601. case DbType.Double:
  602. case DbType.Int32:
  603. case DbType.Int16:
  604. case DbType.Int64:
  605. {
  606. value = 0;
  607. }
  608. break;
  609. case DbType.DateTime:
  610. {
  611. value = DateTime.Now;
  612. }
  613. break;
  614. }
  615. //if (Md.FieldMeteDatas[key].ColumnType == DbType.String)
  616. // value = "";
  617. //if (Md.FieldMeteDatas[key].ColumnType == DbType.Boolean)
  618. // value = false;
  619. //if (Md.FieldMeteDatas[key].ColumnType == DbType.Decimal || Md.FieldMeteDatas[key].ColumnType == DbType.Double)
  620. // value = 0;
  621. //if (Md.FieldMeteDatas[key].ColumnType == DbType.Int32)
  622. // value = 0;
  623. //if (Md.FieldMeteDatas[key].ColumnType == DbType.Int16)
  624. // value = 0;
  625. //if (Md.FieldMeteDatas[key].ColumnType == DbType.Int64)
  626. // value = 0;
  627. //if (Md.FieldMeteDatas[key].ColumnType == DbType.DateTime)
  628. // value = DateTime.Now;
  629. //if (Md.FieldMeteDatas[key].ColumnType == DbType.Guid)
  630. // value = Guid.NewGuid();
  631. return value;
  632. }
  633. }
  634. }