OracleUpdateBuilder.cs 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace SqlSugar
  7. {
  8. public class OracleUpdateBuilder : UpdateBuilder
  9. {
  10. public override string ReSetValueBySqlExpListType { get; set; } = "oracle";
  11. protected override string TomultipleSqlString(List<IGrouping<int, DbColumnInfo>> groupList)
  12. {
  13. if (groupList.Count == 0)
  14. {
  15. return " select 0 from dual";
  16. }
  17. StringBuilder sb = new StringBuilder();
  18. sb.AppendLine("Begin");
  19. sb.AppendLine(string.Join("\r\n", groupList.Select(t =>
  20. {
  21. var updateTable = string.Format("UPDATE {0} SET", base.GetTableNameStringNoWith);
  22. var setValues = string.Join(",", t.Where(s => !s.IsPrimarykey).Select(m => GetOracleUpdateColums(m)).ToArray());
  23. var pkList = t.Where(s => s.IsPrimarykey).ToList();
  24. List<string> whereList = new List<string>();
  25. foreach (var item in pkList)
  26. {
  27. var isFirst = pkList.First() == item;
  28. var whereString = isFirst ? " " : " AND ";
  29. whereString += GetOracleUpdateColums(item);
  30. whereList.Add(whereString);
  31. }
  32. return string.Format("{0} {1} WHERE {2};", updateTable, setValues, string.Join("",whereList));
  33. }).ToArray()));
  34. sb.AppendLine("End;");
  35. return sb.ToString();
  36. }
  37. private string GetOracleUpdateColums(DbColumnInfo m)
  38. {
  39. return string.Format("\"{0}\"={1}", m.DbColumnName.ToUpper(IsUppper), base.GetDbColumn(m,FormatValue(m.Value,m.IsPrimarykey,m.PropertyName)));
  40. }
  41. int i = 0;
  42. public object FormatValue(object value,bool isPrimaryKey,string name)
  43. {
  44. if (value == null)
  45. {
  46. return "NULL";
  47. }
  48. else
  49. {
  50. string N =this.Context.GetN();
  51. if (isPrimaryKey)
  52. {
  53. N = "";
  54. }
  55. var type = UtilMethods.GetUnderType(value.GetType());
  56. if (type == UtilConstants.DateType)
  57. {
  58. var date = value.ObjToDate();
  59. if (date < UtilMethods.GetMinDate(this.Context.CurrentConnectionConfig))
  60. {
  61. date = UtilMethods.GetMinDate(this.Context.CurrentConnectionConfig);
  62. }
  63. if (this.Context.CurrentConnectionConfig?.MoreSettings?.DisableMillisecond == true)
  64. {
  65. return "to_date('" + date.ToString("yyyy-MM-dd HH:mm:ss") + "', 'YYYY-MM-DD HH24:MI:SS') ";
  66. }
  67. else
  68. {
  69. return "to_timestamp('" + date.ToString("yyyy-MM-dd HH:mm:ss.ffffff") + "', 'YYYY-MM-DD HH24:MI:SS.FF') ";
  70. }
  71. }
  72. else if (type.IsEnum())
  73. {
  74. return Convert.ToInt64(value);
  75. }
  76. else if (type.IsIn(UtilConstants.IntType,UtilConstants.LongType,UtilConstants.ShortType))
  77. {
  78. return value;
  79. }
  80. else if (type==UtilConstants.GuidType)
  81. {
  82. return "'" + value.ToString() + "'";
  83. }
  84. else if (type == UtilConstants.ByteArrayType)
  85. {
  86. string bytesString = "0x" + BitConverter.ToString((byte[])value).Replace("-", "");
  87. return bytesString;
  88. }
  89. else if (type == UtilConstants.BoolType)
  90. {
  91. return value.ObjToBool() ? "1" : "0";
  92. }
  93. else if (type == UtilConstants.DateTimeOffsetType)
  94. {
  95. var date = UtilMethods.ConvertFromDateTimeOffset((DateTimeOffset)value);
  96. return "to_timestamp('" + date.ToString("yyyy-MM-dd HH:mm:ss.ffffff") + "', 'YYYY-MM-DD HH24:MI:SS.FF') ";
  97. }
  98. else if (type == UtilConstants.StringType || type == UtilConstants.ObjType)
  99. {
  100. if (value.ToString().Length > 1000)
  101. {
  102. ++i;
  103. var parameterName = this.Builder.SqlParameterKeyWord + name + i;
  104. this.Parameters.Add(new SugarParameter(parameterName, value));
  105. return parameterName;
  106. }
  107. else
  108. {
  109. return N + "'" + value.ToString().ToSqlFilter() + "'";
  110. }
  111. }
  112. else
  113. {
  114. return N + "'" + value.ToString() + "'";
  115. }
  116. }
  117. }
  118. protected override string GetJoinUpdate(string columnsString, ref string whereString)
  119. {
  120. var joinString = $" {Builder.GetTranslationColumnName(this.TableName)} {Builder.GetTranslationColumnName(this.ShortName)} ";
  121. foreach (var item in this.JoinInfos)
  122. {
  123. joinString += $"\r\n USING {Builder.GetTranslationColumnName(item.TableName)} {Builder.GetTranslationColumnName(item.ShortName)} ON {item.JoinWhere} ";
  124. }
  125. var tableName = joinString + "\r\n ";
  126. var newTemp = SqlTemplate.Replace("UPDATE", "MERGE INTO").Replace("SET", "WHEN MATCHED THEN \r\nUPDATE SET");
  127. return string.Format(newTemp, tableName, columnsString, whereString);
  128. }
  129. #region Helper
  130. public bool IsUppper
  131. {
  132. get
  133. {
  134. if (this.Context.CurrentConnectionConfig.MoreSettings == null)
  135. {
  136. return true;
  137. }
  138. else
  139. {
  140. return this.Context.CurrentConnectionConfig.MoreSettings.IsAutoToUpper == true;
  141. }
  142. }
  143. }
  144. #endregion
  145. }
  146. }