MySqlQueryCommandBuilder.cs 28 KB

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