MySqlInsertBuilder.cs 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace SqlSugar
  6. {
  7. public class MySqlInsertBuilder : InsertBuilder
  8. {
  9. public override string SqlTemplate
  10. {
  11. get
  12. {
  13. if (IsReturnIdentity)
  14. {
  15. return @"INSERT INTO {0}
  16. ({1})
  17. VALUES
  18. ({2}) ;SELECT LAST_INSERT_ID();";
  19. }
  20. else
  21. {
  22. return @"INSERT INTO {0}
  23. ({1})
  24. VALUES
  25. ({2}) ;";
  26. }
  27. }
  28. }
  29. int i = 0;
  30. public object FormatValue(object value,string name)
  31. {
  32. var n = "N";
  33. if (this.Context.CurrentConnectionConfig.MoreSettings != null && this.Context.CurrentConnectionConfig.MoreSettings.DisableNvarchar)
  34. {
  35. n = "";
  36. }
  37. if (value == null)
  38. {
  39. return "NULL";
  40. }
  41. else
  42. {
  43. var type = UtilMethods.GetUnderType(value.GetType());
  44. if (type == UtilConstants.DateType)
  45. {
  46. return GetDateTimeString(value);
  47. }
  48. else if (value is DateTimeOffset)
  49. {
  50. return GetDateTimeOffsetString(value);
  51. }
  52. else if (type == UtilConstants.ByteArrayType)
  53. {
  54. string bytesString = "0x" + BitConverter.ToString((byte[])value).Replace("-", "");
  55. return bytesString;
  56. }
  57. else if (type.IsEnum())
  58. {
  59. if (this.Context.CurrentConnectionConfig.MoreSettings?.TableEnumIsString == true)
  60. {
  61. return value.ToSqlValue(); ;
  62. }
  63. else
  64. {
  65. return Convert.ToInt64(value);
  66. }
  67. }
  68. else if (type == UtilConstants.BoolType)
  69. {
  70. return value.ObjToBool() ? "1" : "0";
  71. }
  72. else if (type == UtilConstants.StringType || type == UtilConstants.ObjType)
  73. {
  74. ++i;
  75. var parameterName = this.Builder.SqlParameterKeyWord + name +"_"+ i;
  76. this.Parameters.Add(new SugarParameter(parameterName, value));
  77. return parameterName;
  78. }
  79. else
  80. {
  81. return n+"'" + GetString(value) + "'";
  82. }
  83. }
  84. }
  85. private object GetDateTimeOffsetString(object value)
  86. {
  87. var date = UtilMethods.ConvertFromDateTimeOffset((DateTimeOffset)value);
  88. if (date < UtilMethods.GetMinDate(this.Context.CurrentConnectionConfig))
  89. {
  90. date = UtilMethods.GetMinDate(this.Context.CurrentConnectionConfig);
  91. }
  92. return "'" + date.ToString("yyyy-MM-dd HH:mm:ss.fff") + "'";
  93. }
  94. private object GetDateTimeString(object value)
  95. {
  96. var date = value.ObjToDate();
  97. if (date < UtilMethods.GetMinDate(this.Context.CurrentConnectionConfig))
  98. {
  99. date = UtilMethods.GetMinDate(this.Context.CurrentConnectionConfig);
  100. }
  101. return "'" + date.ToString("yyyy-MM-dd HH:mm:ss.fff") + "'";
  102. }
  103. private string GetString(object value)
  104. {
  105. var result = value.ToString();
  106. if (result.HasValue() && result.Contains("\\"))
  107. {
  108. result = result.Replace("\\", "\\\\");
  109. }
  110. return result;
  111. }
  112. public override string ToSqlString()
  113. {
  114. if (IsNoInsertNull)
  115. {
  116. DbColumnInfoList = DbColumnInfoList.Where(it => it.Value != null).ToList();
  117. }
  118. var groupList = DbColumnInfoList.GroupBy(it => it.TableId).ToList();
  119. var isSingle = groupList.Count() == 1;
  120. string columnsString = string.Join(",", groupList.First().Select(it => Builder.GetTranslationColumnName(it.DbColumnName)));
  121. if (isSingle)
  122. {
  123. string columnParametersString = string.Join(",", this.DbColumnInfoList.Select(it =>base.GetDbColumn(it, Builder.SqlParameterKeyWord + it.DbColumnName)));
  124. ActionMinDate();
  125. var result= string.Format(SqlTemplate, GetTableNameString, columnsString, columnParametersString);
  126. result = GetMySqlIgnore(result);
  127. return result;
  128. }
  129. else
  130. {
  131. StringBuilder batchInsetrSql = new StringBuilder();
  132. batchInsetrSql.Append("INSERT INTO " + GetTableNameString + " ");
  133. batchInsetrSql.Append("(");
  134. batchInsetrSql.Append(columnsString);
  135. batchInsetrSql.Append(") VALUES");
  136. string insertColumns = "";
  137. foreach (var item in groupList)
  138. {
  139. batchInsetrSql.Append("(");
  140. insertColumns = string.Join(",", item.Select(it => base.GetDbColumn(it, FormatValue(it.Value, it.PropertyName))));
  141. batchInsetrSql.Append(insertColumns);
  142. if (groupList.Last() == item)
  143. {
  144. batchInsetrSql.Append(") ");
  145. }
  146. else
  147. {
  148. batchInsetrSql.Append("), ");
  149. }
  150. }
  151. batchInsetrSql.AppendLine(";select @@IDENTITY");
  152. var result = batchInsetrSql.ToString();
  153. result = GetMySqlIgnore(result);
  154. return result;
  155. }
  156. }
  157. private string GetMySqlIgnore(string result)
  158. {
  159. if (this.MySqlIgnore)
  160. {
  161. result = result.Replace("INSERT INTO", " INSERT IGNORE INTO");
  162. }
  163. return result;
  164. }
  165. }
  166. }