OracleQueryCommandBuilder.cs 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546
  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 OracleQueryCommandBuilder : 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. }
  36. return cmd;
  37. }
  38. /// <summary>
  39. /// 解析Insert SQL
  40. /// </summary>
  41. /// <returns></returns>
  42. private QueryCommand ParserInsertCommand()
  43. {
  44. QueryCommand qc = new QueryCommand(); bool IsAutoincrement = false;
  45. List<string> columnlist = new List<string>();
  46. List<string> paramlist = new List<string>();
  47. List<string> valuelist = new List<string>();
  48. var typedesc = Md.FiledMeta.MemberColumnMap;
  49. if (Md.FiledMeta.AutoIncrement.IfNotNull())
  50. {
  51. IsAutoincrement = true;
  52. typedesc.Remove(Md.FiledMeta.AutoIncrement.MemberInfo);
  53. }
  54. foreach (var kv in typedesc)
  55. {
  56. MemberInfo member = kv.Key;
  57. Md.FiledMeta.Fields.Add(member);
  58. MappingMemberDescriptor memberDescriptor = MetaDataManager.TryGetMappingMemberDescriptor(kv.Key, Md.FiledMeta);
  59. var val = memberDescriptor.Column.Value;
  60. if (!MetaDataManager.IsAutoIncrement(memberDescriptor, Md))
  61. {
  62. columnlist.Add(string.Format("[{0}]", memberDescriptor.Column.Name));
  63. paramlist.Add("@" + memberDescriptor.Column.Name);
  64. QueryParameter parameter = new QueryParameter();
  65. parameter.ParameterName = "@" + memberDescriptor.Column.Name;
  66. parameter.DbType = (DbType)AntUtils.TryGetDbType(memberDescriptor.Column.Type);
  67. parameter.Direction = ParameterDirection.Input;
  68. if (val.IsNull())
  69. val = SetDefaultValue(parameter.DbType);
  70. parameter.Value = val;
  71. valuelist.Add("'" + val + "'");
  72. qc.Parameters.Add(parameter);
  73. }
  74. }
  75. string sqlstr = string.Format(ConstSql.SQL_INSERT_TABLE, Md.FiledMeta.Table.Name, columnlist.AppendStrings(), paramlist.AppendStrings(),
  76. IsAutoincrement ? GetLastInsertID() : string.Empty);
  77. qc.CommandText = sqlstr;
  78. qc.SqlString = string.Format(ConstSql.SQL_INSERT_TABLE, Md.FiledMeta.Table.Name, columnlist.AppendStrings(),
  79. valuelist.AppendStrings(), IsAutoincrement ? GetLastInsertID() : string.Empty);
  80. return qc;
  81. }
  82. private QueryCommand ParserUpdateCommand()
  83. {
  84. QueryCommand qc = new QueryCommand(); string strwhere = string.Empty;
  85. StringBuilder sql = new StringBuilder();//SQL语句
  86. StringBuilder sqlstr = new StringBuilder();
  87. List<string> updateColumns = new List<string>();//更新列
  88. List<string> StrupdateColumns = new List<string>();
  89. List<string> WhereColumn = new List<string>();//条件列
  90. List<string> StrWhereColumn = new List<string>();//条件列
  91. sql.AppendFormat("UPDATE [{0}] SET ", Md.FiledMeta.Table.Name);
  92. List<string> condition = new List<string>();
  93. #region 更新字段
  94. if (Md.UpdateColumns.IsNull())
  95. {
  96. var typedesc = Md.FiledMeta.MemberColumnMap;
  97. //if (Md.FiledMeta.AutoIncrement.IfNotNull())
  98. //{
  99. // //IsAutoincrement = true;
  100. // typedesc.Remove(Md.FiledMeta.AutoIncrement.MemberInfo);
  101. //}
  102. foreach (var kv in typedesc)
  103. {
  104. MemberInfo member = kv.Key;
  105. MappingMemberDescriptor memberDescriptor = MetaDataManager.TryGetMappingMemberDescriptor(member, Md.FiledMeta);
  106. if (!MetaDataManager.IsAutoIncrement(memberDescriptor, Md))
  107. {
  108. var column = memberDescriptor.Column;
  109. updateColumns.Add(string.Format("[{0}]=:{0}", column.Name));
  110. qc.Parameters.Add(":" + column.Name, (DbType)AntUtils.TryGetDbType(column.Type), column.Value);
  111. StrupdateColumns.Add(string.Format("[{0}]='{1}'", column.Name, column.Value));
  112. }
  113. }
  114. }
  115. else
  116. {
  117. foreach (var column in Md.UpdateColumns)
  118. {
  119. if (column.Value.Value.IfNotNull())
  120. {
  121. updateColumns.Add(string.Format("[{0}]=:{0}", column.Key));
  122. qc.Parameters.Add(":" + column.Key, (DbType)AntUtils.TryGetDbType(column.Value.Type), column.Value.Value);
  123. StrupdateColumns.Add(string.Format("[{0}]='{1}'", column.Key, column.Value.Value));
  124. }
  125. }
  126. }
  127. #endregion
  128. if (Md.FiledMeta.PrimaryKey.Column.Value.IfNotNull())//通过主键作用查询条件
  129. {
  130. WhereColumn.Add(string.Format("[{0}]=:{0}", Md.FiledMeta.PrimaryKey.MemberInfo.Name));
  131. qc.Parameters.Add(":" + Md.FiledMeta.PrimaryKey.Column.Name, (DbType)AntUtils.TryGetDbType(Md.FiledMeta.PrimaryKey.Column.Type), Md.FiledMeta.PrimaryKey.Column.Value);
  132. StrWhereColumn.Add(string.Format("[{0}]='{1}'", Md.FiledMeta.PrimaryKey.Column.Name, Md.FiledMeta.PrimaryKey.Column.Value));
  133. }
  134. else
  135. {//通过查询实体进行查询
  136. #region 给实体赋值的查询条件更新
  137. foreach (var key in Md.WhereColumns.Values)
  138. {
  139. WhereColumn.Add(string.Format("[{0}]=:{0}", key.Name));
  140. qc.Parameters.Add(":" + key.Name, (DbType)AntUtils.TryGetDbType(key.Type), key.Value);
  141. StrWhereColumn.Add(string.Format("[{0}]={1}", key.Name, key.Value));
  142. }
  143. #endregion
  144. }
  145. if (updateColumns.Count > 0)//更新字段
  146. {
  147. #region 带时间戳
  148. if (Md.FieldsColumns.ContainsKey("Version"))
  149. {
  150. //WhereColumn.Add(string.Format(" {0}+0=@{0}", Md.FieldMeteDatas["Version"].ColumnName));
  151. WhereColumn.Add(string.Format(" CONVERT(bigint,{0})=:{0}", Md.FieldsColumns["Version"].Name));
  152. qc.Parameters.Add(":" + Md.FieldsColumns["Version"].Name, (DbType)AntUtils.TryGetDbType(Md.FieldsColumns["Version"].Type), Md.FieldsColumns["Version"].Value);
  153. StrWhereColumn.Add(string.Format(" CONVERT(bigint,{0})='{1}'", Md.FieldsColumns["Version"].Name, Md.FieldsColumns["Version"].Value));
  154. }
  155. #endregion
  156. sql.Append(string.Join(",", updateColumns.ToArray())).Append(" WHERE ").Append(string.Join(" AND ", WhereColumn.ToArray()));
  157. if (!string.IsNullOrEmpty(Md.WhereSql))
  158. {//有自定义查询条件的时候
  159. if (Md.WhereSql.Trim().Length > 0) WhereColumn.Add(Md.WhereSql);
  160. }
  161. if (Predicate.IfNotNull())
  162. {
  163. var FlieldWhere = new FieldValueCollection();
  164. strwhere = Predicate.GetSql(FlieldWhere, qc);//拼接SQL语句
  165. if (!strwhere.IsEmpty())
  166. {
  167. sql.AppendFormat(" and {0} ", strwhere);
  168. foreach (string key in FlieldWhere.Keys)
  169. {
  170. strwhere = strwhere.Replace(key.ToString(), "'" + FlieldWhere[key].ToString() + "'");
  171. }
  172. sqlstr.AppendFormat(" and {0} ", strwhere);
  173. }
  174. }
  175. qc.CommandText = sql.ToString();
  176. 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));
  177. }
  178. return qc;
  179. }
  180. private QueryCommand ParserDeleteCommand()
  181. {
  182. QueryCommand qc = new QueryCommand();
  183. StringBuilder sql = new StringBuilder();
  184. StringBuilder sqlstr = new StringBuilder();
  185. List<string> WhereColumn = new List<string>();//条件列集合
  186. List<string> WhereColumnStr = new List<string>();
  187. if (!Md.FieldsColumns.IsNull())
  188. {
  189. foreach (string key in Md.FieldsColumns.Keys)//查询条件
  190. {
  191. //if (!Object.Equals(Md.Fields[key], null) || !Object.Equals(Md.Fields[key], DBNull.Value))
  192. if (!(Md.FieldsColumns[key].IsNull()))
  193. {
  194. if (!Md.FieldsColumns[key].Value.ToString().IsEmpty())
  195. {
  196. WhereColumn.Add(string.Format(" [{0}].{1}=:{2} ", Md.FiledMeta.Table.Name, Md.FieldsColumns[key].Name, Md.FieldsColumns[key].Name));
  197. qc.Parameters.Add(":" + Md.FieldsColumns[key].Name, (DbType)AntUtils.TryGetDbType(Md.FieldsColumns[key].Type), Md.FieldsColumns[key].Value);
  198. WhereColumnStr.Add(string.Format(" [{0}].{1}={2} ", Md.FiledMeta.Table.Name, Md.FieldsColumns[key].Name, Md.FieldsColumns[key].Value));
  199. }
  200. }
  201. }
  202. }
  203. if (!Md.WhereSql.IsNull())
  204. {
  205. if (Md.WhereSql.Trim().Length > 0)
  206. {
  207. string sqlwherestr = (Md.WhereSql.StartsWith("(") && Md.WhereSql.EndsWith(")")) ? Md.WhereSql : " (" + Md.WhereSql + ") ";
  208. WhereColumn.Add(sqlwherestr);
  209. WhereColumnStr.Add(sqlwherestr);
  210. }
  211. }
  212. sql.AppendFormat(ConstSql.SQL_DELETE_DATA, Md.FiledMeta.Table.Name, (WhereColumn.Count > 0) ? string.Format(" and {0}", string.Join(" AND ", WhereColumn.ToArray())) : string.Empty);
  213. sqlstr.AppendFormat(ConstSql.SQL_DELETE_DATA, Md.FiledMeta.Table.Name, (WhereColumnStr.Count > 0) ? string.Format(" and {0}", string.Join(" AND ", WhereColumnStr.ToArray())) : string.Empty);
  214. if (Predicate.IfNotNull())
  215. {
  216. var FlieldWhere = new FieldValueCollection();
  217. string 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 = sqlstr.ToString();
  230. return qc;
  231. }
  232. #region 解析 Select SQL语句
  233. /// <summary>
  234. /// 解析 Select SQL语句
  235. /// </summary>
  236. /// <returns></returns>
  237. private QueryCommand ParserSelectCommand()
  238. {
  239. QueryCommand qc = new QueryCommand() { DbParmChar = DbParmChar };
  240. StringBuilder sql = new StringBuilder();
  241. StringBuilder sqlstr = new StringBuilder();
  242. switch (SqlType)
  243. {
  244. case SqlEnum.MainSql:
  245. {
  246. string topnum = Top.IsEmpty() ? string.Empty : " limit " + Top;
  247. sql.AppendFormat(ConstSql.MYSQL_GET_VALUE, topnum, FieldColumn(), Md.FiledMeta.Table.Name);//显示自定义的字段
  248. List<string> WhereColumn = new List<string>();//条件列集合
  249. List<string> WhereColumnStr = new List<string>();//条件列集合
  250. if (Md.FieldsColumns.IfNotNull())//查询条件
  251. {
  252. foreach (string key in Md.FieldsColumns.Keys)
  253. {
  254. var field = Md.FieldsColumns[key];
  255. if (!(field.Value.IsNull()))
  256. {
  257. if (!field.Value.ToString().IsEmpty())
  258. {
  259. WhereColumn.Add(string.Format(" [{0}].{1}=:{2} ", Md.FiledMeta.Table.Name, field.Name,
  260. field.Name));
  261. qc.Parameters.Add(":" + field.Name, (DbType)AntUtils.TryGetDbType(field.Type), field.Value);
  262. WhereColumnStr.Add(string.Format(" [{0}].{1}='{2}' ", Md.FiledMeta.Table.Name, field.Name, field.Value));
  263. }
  264. }
  265. }
  266. }
  267. else
  268. {
  269. if (!Md.WhereSql.IsEmpty()) sql.AppendFormat(" and {0} ", Md.WhereSql);
  270. }
  271. sqlstr.Append(sql.ToString());
  272. if (WhereColumn.Count > 0) sql.AppendFormat(" and {0} ", string.Join(" AND ", WhereColumn.ToArray()));
  273. if (WhereColumnStr.Count > 0) sqlstr.AppendFormat(" and {0} ", string.Join(" AND ", WhereColumnStr.ToArray()));
  274. if (Predicate.IfNotNull())
  275. {
  276. var FlieldWhere = new FieldValueCollection();
  277. string strwhere = Predicate.GetSql(FlieldWhere, qc);//拼接SQL语句
  278. if (!strwhere.IsEmpty())
  279. {
  280. sql.AppendFormat(" and {0} ", strwhere);
  281. foreach (string key in FlieldWhere.Keys)
  282. {
  283. strwhere = strwhere.Replace(key.ToString(), "'" + FlieldWhere[key].ToString() + "'");
  284. }
  285. sqlstr.AppendFormat(" and {0} ", strwhere);
  286. }
  287. }
  288. string orderstr = GetOrderBy();
  289. sql.Append(orderstr);
  290. sqlstr.Append(orderstr);
  291. WhereColumn = null; WhereColumnStr = null;
  292. }
  293. break;
  294. }
  295. qc.CommandText = sql.ToString();
  296. qc.SqlString = sqlstr.ToString();
  297. sqlstr = null; sql = null;
  298. return qc;
  299. }
  300. #region 解析 查询分页 SQL语句
  301. /// <summary>
  302. /// 解析 Select SQL语句
  303. /// </summary>
  304. /// <returns></returns>
  305. private QueryCommand ParserQueryPageCommand()
  306. {
  307. List<string> WhereColumn = new List<string>();
  308. List<string> WhereColumnStr = new List<string>();//条件列集合
  309. QueryCommand qc = new QueryCommand() { DbParmChar = DbParmChar };
  310. StringBuilder sql = new StringBuilder();
  311. if (Md.FieldsColumns.IfNotNull())//查询条件
  312. {
  313. foreach (string key in Md.FieldsColumns.Keys)
  314. {
  315. var field = Md.FieldsColumns[key];
  316. if (!(field.Value.IsNull()))
  317. {
  318. if (!field.Value.ToString().IsEmpty())
  319. {
  320. string parmname = string.Format("@{0}_{1}", field.Name, qc.Parameters.Count);
  321. WhereColumn.Add(string.Format(" [{0}].{1}=:{2} ", Md.FiledMeta.Table.Name, field.Name,
  322. parmname));
  323. qc.Parameters.Add(":" + parmname, (DbType)AntUtils.TryGetDbType(field.Type), field.Value);
  324. WhereColumnStr.Add(string.Format(" [{0}].{1}='{2}' ", Md.FiledMeta.Table.Name, field.Name, field.Value));
  325. }
  326. }
  327. }
  328. }
  329. string strsqlwhere = string.Join(" AND ", WhereColumn.ToArray());
  330. if (Md.WhereSql.Length > 0) strsqlwhere = strsqlwhere + " and " + Md.WhereSql;
  331. if (Predicate.IfNotNull())
  332. {
  333. var FlieldWhere = new FieldValueCollection();
  334. string strwhere = Predicate.GetSql(FlieldWhere, qc);//拼接SQL语句
  335. if (!strwhere.IsEmpty())
  336. {
  337. strsqlwhere = strsqlwhere + " and " + strwhere;
  338. }
  339. }
  340. sql.AppendFormat(ConstSql.MYSQL_PAGE_VALUE, FieldColumn(), Md.FiledMeta.Table.Name, strsqlwhere, GetOrderBy(), (((PageNo - 1) * PageSize) + 1), (PageNo * PageSize));
  341. if (!qc.SqlNotes.IsNull())
  342. qc.CommandText = sql.ToString();
  343. else
  344. qc.CommandText = sql.ToString();
  345. string sqlstr = sql.ToString();
  346. qc.SqlString = sqlstr;
  347. return qc;
  348. }
  349. #endregion
  350. /// <summary>
  351. /// 获取子对象
  352. /// </summary>
  353. /// <typeparam name="T"></typeparam>
  354. /// <typeparam name="M"></typeparam>
  355. /// <returns></returns>
  356. public QueryCommand GetChildData<T, M>()
  357. {
  358. QueryCommandBuilders sqls = new QueryCommandBuilders();
  359. //Type entityType = typeof(M);
  360. ////MetaData tableMataData = MetaDataManager.GetMetaData(entityType);
  361. //int sqlCount = Md.FiledMeta.ChildObjects.Count;
  362. ////List<string> sKeys = tableMataData.ChildObjects.Keys.ToList<string>();
  363. QueryCommand sql = new QueryCommand();
  364. //foreach (ChildMataData mod in Md.FiledMeta.ChildObjects.Values)
  365. //{
  366. // sql.SqlString = new StringBuilder("select * from " + mod.ChildTable).ToString();
  367. // sql.SqlType = SqlEnum.ChildSql;
  368. // sql.Key = mod.Key;
  369. //}
  370. return sql;
  371. }
  372. #endregion
  373. /// <summary>
  374. /// 通配符转换
  375. /// </summary>
  376. /// <param name="str"></param>
  377. /// <returns></returns>
  378. protected static string GetEscape(string str)
  379. {
  380. return str.Replace("!", "!!").Replace("%", "!%").Replace("_", "!_");
  381. }
  382. /// <summary>
  383. /// 获取排序
  384. /// </summary>
  385. /// <returns></returns>
  386. public string GetOrderBy()
  387. {
  388. string orderbystr = string.Empty;
  389. if (Sort.IsNull())
  390. {
  391. 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);
  392. }
  393. else
  394. {
  395. string orderby = string.Empty;
  396. foreach (ISort sort in Sort)
  397. {
  398. if (orderby.IsEmpty())
  399. {
  400. orderby = sort.PropertyName + (sort.Ascending ? " ASC" : " DESC");
  401. }
  402. else
  403. {
  404. orderby += " ," + sort.PropertyName + (sort.Ascending ? " ASC" : " DESC");
  405. }
  406. }
  407. orderbystr = string.Format(" ORDER BY {0} ", orderby);
  408. }
  409. return orderbystr;
  410. }
  411. /// <summary>
  412. /// 获取显示字段列
  413. /// </summary>
  414. /// <returns></returns>
  415. private string FieldColumn()
  416. {
  417. List<string> columns = new List<string>();
  418. string fieldcolumn = string.Empty;
  419. if (!ShowField.IsEmpty())
  420. {
  421. fieldcolumn = ShowField;
  422. }
  423. else
  424. {
  425. foreach (MemberInfo df in Md.FiledMeta.MemberColumnMap.Keys)//显示字段
  426. {
  427. columns.Add(string.Format("{0}", "[" + Md.FiledMeta.Table.Name + "]." + df.Name));
  428. }
  429. fieldcolumn = string.Join(",", columns.ToArray());
  430. }
  431. fieldcolumn = fieldcolumn.IsEmpty() ? " * " : fieldcolumn;
  432. return fieldcolumn;
  433. }
  434. /// <summary>
  435. /// 自增长
  436. /// </summary>
  437. /// <returns></returns>
  438. public string GetLastInsertID()
  439. {
  440. return "select emp_sequence.nextval from dual;";
  441. }
  442. /// <summary>
  443. /// 获取默认值
  444. /// </summary>
  445. /// <param name="key"></param>
  446. /// <returns></returns>
  447. private object SetDefaultValue(DbType ColumnType)
  448. {
  449. object value = null;
  450. switch (ColumnType)
  451. {
  452. case DbType.String:
  453. {
  454. value = "";
  455. }
  456. break;
  457. case DbType.Boolean:
  458. {
  459. value = false;
  460. }
  461. break;
  462. case DbType.Decimal:
  463. case DbType.Double:
  464. case DbType.Int32:
  465. case DbType.Int16:
  466. case DbType.Int64:
  467. {
  468. value = 0;
  469. }
  470. break;
  471. case DbType.DateTime:
  472. {
  473. value = DateTime.Now;
  474. }
  475. break;
  476. }
  477. return value;
  478. }
  479. private QueryCommand ParserSumCommand()
  480. {
  481. QueryCommand qc = new QueryCommand();
  482. StringBuilder sql = new StringBuilder();
  483. sql.AppendFormat("SELECT COUNT(*) FROM {0}", Md.FiledMeta.Table.Name);
  484. if (!string.IsNullOrEmpty(Md.WhereSql))
  485. {
  486. sql.AppendFormat(" WHERE {0}", Md.WhereSql);
  487. }
  488. qc.CommandText = sql.ToString();
  489. return qc;
  490. }
  491. }
  492. }