TDengineInsertBuilder.cs 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. using SqlSugar;
  2. using System;
  3. using System.Linq;
  4. using System.Text;
  5. namespace SqlSugar.BzTDengineCore
  6. {
  7. public class TDengineInsertBuilder : InsertBuilder
  8. {
  9. public override string SqlTemplate
  10. {
  11. get
  12. {
  13. if (IsReturnIdentity) return @"INSERT INTO {0} USING {1} TAGS ('1') ({2}) VALUES ({3})";
  14. else return @"INSERT INTO {0} USING {1} TAGS ('1') ({2}) VALUES ({3})";
  15. }
  16. }
  17. public override string SqlTemplateBatch => "INSERT INTO {0} ({1})";
  18. public override string SqlTemplateBatchUnion => " VALUES ";
  19. public override string SqlTemplateBatchSelect => " {0} ";
  20. public override Func<string, string, string> ConvertInsertReturnIdFunc { get; set; } = (name, sql) =>
  21. {
  22. return sql.Trim().TrimEnd(';') + $"returning {name} ";
  23. };
  24. public override string ToSqlString()
  25. {
  26. if (IsNoInsertNull)
  27. {
  28. DbColumnInfoList = DbColumnInfoList.Where(it => it.Value != null).ToList();
  29. }
  30. var groupList = DbColumnInfoList.GroupBy(it => it.TableId).ToList();
  31. var isSingle = groupList.Count() == 1;
  32. string columnsString = string.Join(",", groupList.First().Select(it => Builder.GetTranslationColumnName(it.DbColumnName)));
  33. if (isSingle)
  34. {
  35. string columnParametersString = string.Join(",", DbColumnInfoList.Select(it => base.GetDbColumn(it, Builder.SqlParameterKeyWord + it.DbColumnName)));
  36. ActionMinDate();
  37. var tName = EntityInfo.EntityName.ToLower() + "_" + DbColumnInfoList.First(it => it.DbColumnName == "Code").Value;
  38. return string.Format(SqlTemplate, tName, EntityInfo.EntityName.ToLower(), columnsString, columnParametersString);
  39. }
  40. else
  41. {
  42. StringBuilder batchInsetrSql = new StringBuilder();
  43. int pageSize = 10000000;
  44. int pageIndex = 1;
  45. if (IsNoPage && IsReturnPkList)
  46. {
  47. pageSize = groupList.Count;
  48. }
  49. int totalRecord = groupList.Count;
  50. int pageCount = (totalRecord + pageSize - 1) / pageSize;
  51. while (pageCount >= pageIndex)
  52. {
  53. batchInsetrSql.AppendFormat(SqlTemplateBatch, GetTableNameString, columnsString);
  54. int i = 0;
  55. foreach (var columns in groupList.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList())
  56. {
  57. var isFirst = i == 0;
  58. if (isFirst)
  59. {
  60. batchInsetrSql.Append(SqlTemplateBatchUnion);
  61. }
  62. batchInsetrSql.Append("\r\n ( " + string.Join(",", columns.Select(it =>
  63. {
  64. if (it.InsertServerTime || it.InsertSql.HasValue() || it.SqlParameterDbType is Type || it?.PropertyType?.Name == "DateOnly" || it?.PropertyType?.Name == "TimeOnly")
  65. {
  66. return GetDbColumn(it, null);
  67. }
  68. object value = null;
  69. if (it?.Value is DateTime)
  70. {
  71. value = it.Value.ObjToDate().ToString("yyyy-MM-dd HH:mm:ss.fff");
  72. }
  73. else if (it?.Value is bool)
  74. {
  75. value = it.Value?.ToString()?.ToLower();
  76. }
  77. else if (it.Value is DateTimeOffset)
  78. {
  79. return FormatDateTimeOffset(it.Value);
  80. }
  81. else if (it.IsArray && it.Value != null)
  82. {
  83. return FormatValue(it.Value, it.PropertyName, i, it);
  84. }
  85. else
  86. {
  87. value = it.Value;
  88. }
  89. if (value == null || value == DBNull.Value)
  90. {
  91. return string.Format(SqlTemplateBatchSelect, "NULL");
  92. }
  93. return string.Format(SqlTemplateBatchSelect, "'" + value.ObjToStringNoTrim().ToSqlFilter() + "'");
  94. })) + "),");
  95. ++i;
  96. }
  97. pageIndex++;
  98. batchInsetrSql.Remove(batchInsetrSql.Length - 1, 1).Append("\r\n;\r\n");
  99. }
  100. return batchInsetrSql.ToString();
  101. }
  102. }
  103. public object FormatValue(object value, string name, int i, DbColumnInfo columnInfo)
  104. {
  105. if (value == null)
  106. {
  107. return "NULL";
  108. }
  109. else
  110. {
  111. var type = value.GetType();
  112. if (type == UtilConstants.DateType || columnInfo.IsArray || columnInfo.IsJson)
  113. {
  114. var parameterName = Builder.SqlParameterKeyWord + name + i;
  115. var paramter = new SugarParameter(parameterName, value);
  116. if (columnInfo.IsJson)
  117. {
  118. paramter.IsJson = true;
  119. }
  120. if (columnInfo.IsArray)
  121. {
  122. paramter.IsArray = true;
  123. }
  124. Parameters.Add(paramter);
  125. return parameterName;
  126. }
  127. else if (type == UtilConstants.ByteArrayType)
  128. {
  129. string bytesString = "0x" + BitConverter.ToString((byte[])value);
  130. return bytesString;
  131. }
  132. else if (type.IsEnum())
  133. {
  134. if (Context.CurrentConnectionConfig.MoreSettings?.TableEnumIsString == true)
  135. {
  136. return value.ToSqlValue();
  137. }
  138. else
  139. {
  140. return Convert.ToInt64(value);
  141. }
  142. }
  143. else if (type == UtilConstants.DateTimeOffsetType)
  144. {
  145. return FormatDateTimeOffset(value);
  146. }
  147. else if (type == UtilConstants.BoolType)
  148. {
  149. return value.ObjToBool() ? "1" : "0";
  150. }
  151. else if (type == UtilConstants.StringType || type == UtilConstants.ObjType)
  152. {
  153. return "'" + value.ToString().ToSqlFilter() + "'";
  154. }
  155. else
  156. {
  157. return "'" + value.ToString() + "'";
  158. }
  159. }
  160. }
  161. public override string FormatDateTimeOffset(object value)
  162. {
  163. return "'" + ((DateTimeOffset)value).ToString("o") + "'";
  164. }
  165. }
  166. }