From 9fcd783640c40ad7e4e2b2c84d5443dddc33bb81 Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Sat, 6 Aug 2022 19:52:12 +0800 Subject: [PATCH] Update .net core project --- .../CodeFirstProvider/CodeFirstProvider.cs | 4 + .../Abstract/FastestProvider/Private.cs | 2 +- .../Subquery/Items/SubOrderBy.cs | 10 +- .../ExpressionsToSql/Subquery/SubResolve.cs | 90 ++++++---- .../SqlSugar/Realization/Dm/DmProvider.cs | 17 +- .../Realization/Dm/SqlBuilder/DmBlukCopy.cs | 154 ++++++++++++++++++ .../Dm/SqlBuilder/DmFastBuilder.cs | 56 +++++++ 7 files changed, 291 insertions(+), 42 deletions(-) create mode 100644 Src/Asp.NetCore2/SqlSugar/Realization/Dm/SqlBuilder/DmBlukCopy.cs create mode 100644 Src/Asp.NetCore2/SqlSugar/Realization/Dm/SqlBuilder/DmFastBuilder.cs diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/CodeFirstProvider/CodeFirstProvider.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/CodeFirstProvider/CodeFirstProvider.cs index 019a51604..0731ef3fa 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/CodeFirstProvider/CodeFirstProvider.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/CodeFirstProvider/CodeFirstProvider.cs @@ -502,6 +502,10 @@ namespace SqlSugar { return false; } + if (properyTypeName?.ToLower() == "int" && dataType?.ToLower() == "int32") + { + return false; + } if (properyTypeName?.ToLower() == "date" && dataType?.ToLower() == "datetime") { return false; diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/FastestProvider/Private.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/FastestProvider/Private.cs index a44725d9b..9cecf255f 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/FastestProvider/Private.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/FastestProvider/Private.cs @@ -30,7 +30,7 @@ namespace SqlSugar resultConnector.CharacterSet = this.CharacterSet; return resultConnector; case DbType.Dm: - break; + return new DmFastBuilder(); case DbType.Kdbndp: break; case DbType.Oscar: diff --git a/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Subquery/Items/SubOrderBy.cs b/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Subquery/Items/SubOrderBy.cs index f71ee7159..5b5e91ec4 100644 --- a/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Subquery/Items/SubOrderBy.cs +++ b/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Subquery/Items/SubOrderBy.cs @@ -8,6 +8,7 @@ namespace SqlSugar { public class SubOrderBy : ISubOperation { + public int OrderIndex { get; set; } = 0; public bool HasWhere { get; set; @@ -27,7 +28,7 @@ namespace SqlSugar { get { - return 480; + return 480+OrderIndex; } } @@ -44,7 +45,7 @@ namespace SqlSugar } var exp = expression as MethodCallExpression; var argExp = exp.Arguments[0]; - var result = "ORDER BY " + SubTools.GetMethodValue(this.Context, argExp, ResolveExpressType.FieldSingle); + var result =(OrderIndex==0? "ORDER BY ":",") + SubTools.GetMethodValue(this.Context, argExp, ResolveExpressType.FieldSingle); var selfParameterName = this.Context.GetTranslationColumnName((argExp as LambdaExpression).Parameters.First().Name) + UtilConstants.Dot; result = result.Replace(selfParameterName, SubTools.GetSubReplace(this.Context)); return result; @@ -52,6 +53,7 @@ namespace SqlSugar } public class SubOrderByDesc : ISubOperation { + public int OrderIndex { get; set; } = 0; public bool HasWhere { get; set; @@ -71,7 +73,7 @@ namespace SqlSugar { get { - return 480; + return 480+OrderIndex; } } @@ -84,7 +86,7 @@ namespace SqlSugar { var exp = expression as MethodCallExpression; var argExp = exp.Arguments[0]; - var result = "ORDER BY " + SubTools.GetMethodValue(this.Context, argExp, ResolveExpressType.FieldSingle)+" DESC"; + var result = (OrderIndex == 0 ? "ORDER BY " : ",") + SubTools.GetMethodValue(this.Context, argExp, ResolveExpressType.FieldSingle)+" DESC"; var selfParameterName = this.Context.GetTranslationColumnName((argExp as LambdaExpression).Parameters.First().Name) + UtilConstants.Dot; result = result.Replace(selfParameterName, string.Empty); return result; diff --git a/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Subquery/SubResolve.cs b/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Subquery/SubResolve.cs index 429645828..a278c4206 100644 --- a/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Subquery/SubResolve.cs +++ b/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Subquery/SubResolve.cs @@ -168,41 +168,42 @@ namespace SqlSugar { var isSubSubQuery = this.allMethods.Select(it => it.ToString()).Any(it => Regex.Matches(it, "Subquery").Count > 1); var isubList = this.allMethods.Select(exp => - { - if (isSubSubQuery) - { - this.context.JoinIndex = 1; - this.context.SubQueryIndex = 0; - } - var methodName = exp.Method.Name; - var items = SubTools.SubItems(this.context); - var item = items.First(s => s.Name == methodName); - if (item is SubWhere && hasWhere == false) - { - hasWhere = true; - } - else if (item is SubWhere) - { - item = items.First(s => s is SubAnd); - } + { + if (isSubSubQuery) + { + this.context.JoinIndex = 1; + this.context.SubQueryIndex = 0; + } + var methodName = exp.Method.Name; + var items = SubTools.SubItems(this.context); + var item = items.First(s => s.Name == methodName); + if (item is SubWhere && hasWhere == false) + { + hasWhere = true; + } + else if (item is SubWhere) + { + item = items.First(s => s is SubAnd); + } - if (item is SubWhereIF && hasWhere == false) - { - hasWhere = true; - } - else if (item is SubWhereIF) - { - item = items.First(s => s is SubAndIF); - } - else if (item is SubSelectStringJoin) - { - isXmlPath = true; - } + if (item is SubWhereIF && hasWhere == false) + { + hasWhere = true; + } + else if (item is SubWhereIF) + { + item = items.First(s => s is SubAndIF); + } + else if (item is SubSelectStringJoin) + { + isXmlPath = true; + } - item.Context = this.context; - item.Expression = exp; - return item; - }).ToList(); + item.Context = this.context; + item.Expression = exp; + return item; + }).ToList(); + SetOrderByIndex(isubList); isubList.Insert(0, new SubBegin()); if (isubList.Any(it => it is SubSelect)) { @@ -229,5 +230,28 @@ namespace SqlSugar this.context.JoinIndex = 0; return result; } + + private static void SetOrderByIndex(List isubList) + { + var orderByIndex = 0; + var orderByList = isubList.Where(it => it is SubOrderBy || it is SubOrderByDesc).ToList(); + if (orderByList.Count > 1) + { + orderByList.Reverse(); + foreach (var item in orderByList) + { + if (item is SubOrderBy) + { + (item as SubOrderBy).OrderIndex = orderByIndex; + orderByIndex++; + } + else if (item is SubOrderByDesc) + { + (item as SubOrderByDesc).OrderIndex = orderByIndex; + orderByIndex++; + } + } + } + } } } diff --git a/Src/Asp.NetCore2/SqlSugar/Realization/Dm/DmProvider.cs b/Src/Asp.NetCore2/SqlSugar/Realization/Dm/DmProvider.cs index 2bf1446ee..38756af35 100644 --- a/Src/Asp.NetCore2/SqlSugar/Realization/Dm/DmProvider.cs +++ b/Src/Asp.NetCore2/SqlSugar/Realization/Dm/DmProvider.cs @@ -16,23 +16,28 @@ namespace SqlSugar public DmProvider() { this.FormatSql = sql => { - var guid = Guid.NewGuid(); sql = sql.Replace("+@", "+:"); - sql = sql.Replace("select @@identity", guid.ToString()); if (sql.HasValue() && sql.Contains("@")) { - var exceptionalCaseInfo = Regex.Matches(sql, @"\'.*?\@.*?\'| [\.,\w]+\@[\.,\w]+ | [\.,\w]+\@[\.,\w]+"); + var exceptionalCaseInfo = Regex.Matches(sql, @"\'[^\=]*?\@.*?\'|[\.,\w]+\@[\.,\w]+ | [\.,\w]+\@[\.,\w]+|[\.,\w]+\@[\.,\w]+ |\d+\@\d|\@\@"); if (exceptionalCaseInfo != null) { foreach (var item in exceptionalCaseInfo.Cast()) { + if (item.Value != null && item.Value.IndexOf(",") == 1 && Regex.IsMatch(item.Value, @"^ \,\@\w+$")) + { + break; + } + else if (item.Value != null && Regex.IsMatch(item.Value.Trim(), @"^\w+\,\@\w+\,$")) + { + break; + } sql = sql.Replace(item.Value, item.Value.Replace("@", UtilConstants.ReplaceKey)); } } sql = sql.Replace("@", ":"); sql = sql.Replace(UtilConstants.ReplaceKey, "@"); } - sql = sql.Replace(guid.ToString(), "select @@identity"); return sql; }; } @@ -118,6 +123,10 @@ namespace SqlSugar sqlParameter.Size = parameter.Size; sqlParameter.Value = parameter.Value; sqlParameter.DbType = parameter.DbType; + if (sqlParameter.ParameterName[0] == '@') + { + sqlParameter.ParameterName = ':' + sqlParameter.ParameterName.Substring(1, sqlParameter.ParameterName.Length - 1); + } if (sqlParameter.DbType == System.Data.DbType.Guid) { sqlParameter.DbType = System.Data.DbType.String; diff --git a/Src/Asp.NetCore2/SqlSugar/Realization/Dm/SqlBuilder/DmBlukCopy.cs b/Src/Asp.NetCore2/SqlSugar/Realization/Dm/SqlBuilder/DmBlukCopy.cs new file mode 100644 index 000000000..a1d59330b --- /dev/null +++ b/Src/Asp.NetCore2/SqlSugar/Realization/Dm/SqlBuilder/DmBlukCopy.cs @@ -0,0 +1,154 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.SqlClient; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SqlSugar +{ + public class DmBlukCopy + { + internal List> DbColumnInfoList { get; set; } + internal SqlSugarProvider Context { get; set; } + internal ISqlBuilder Builder { get; set; } + internal InsertBuilder InsertBuilder { get; set; } + internal object[] Inserts { get; set; } + + public int ExecuteBulkCopy() + { + if (DbColumnInfoList == null || DbColumnInfoList.Count == 0) return 0; + + if (Inserts.First().GetType() == typeof(DataTable)) + { + return WriteToServer(); + } + DataTable dt = GetCopyData(); + SqlBulkCopy bulkCopy = GetBulkCopyInstance(); + bulkCopy.DestinationTableName = InsertBuilder.GetTableNameString; + try + { + bulkCopy.WriteToServer(dt); + } + catch (Exception ex) + { + CloseDb(); + throw ex; + } + CloseDb(); + return DbColumnInfoList.Count; + } + + public async Task ExecuteBulkCopyAsync() + { + if (DbColumnInfoList == null || DbColumnInfoList.Count == 0) return 0; + + if (Inserts.First().GetType() == typeof(DataTable)) + { + return WriteToServer(); + } + DataTable dt=GetCopyData(); + SqlBulkCopy bulkCopy = GetBulkCopyInstance(); + bulkCopy.DestinationTableName = InsertBuilder.GetTableNameString; + try + { + await bulkCopy.WriteToServerAsync(dt); + } + catch (Exception ex) + { + CloseDb(); + throw ex; + } + CloseDb(); + return DbColumnInfoList.Count; + } + + private int WriteToServer() + { + var dt = this.Inserts.First() as DataTable; + if (dt == null) + return 0; + Check.Exception(dt.TableName == "Table", "dt.TableName can't be null "); + dt = GetCopyWriteDataTable(dt); + SqlBulkCopy copy = GetBulkCopyInstance(); + copy.DestinationTableName = this.Builder.GetTranslationColumnName(dt.TableName); + copy.WriteToServer(dt); + CloseDb(); + return dt.Rows.Count; + } + private DataTable GetCopyWriteDataTable(DataTable dt) + { + var result = this.Context.Ado.GetDataTable("select top 0 * from " + this.Builder.GetTranslationColumnName(dt.TableName)); + foreach (DataRow item in dt.Rows) + { + DataRow dr= result.NewRow(); + foreach (DataColumn column in result.Columns) + { + + if (dt.Columns.Cast().Select(it => it.ColumnName.ToLower()).Contains(column.ColumnName.ToLower())) + { + dr[column.ColumnName] = item[column.ColumnName]; + if (dr[column.ColumnName] == null) + { + dr[column.ColumnName] = DBNull.Value; + } + } + } + result.Rows.Add(dr); + } + result.TableName = dt.TableName; + return result; + } + private SqlBulkCopy GetBulkCopyInstance() + { + SqlBulkCopy copy; + if (this.Context.Ado.Transaction == null) + { + copy = new SqlBulkCopy((SqlConnection)this.Context.Ado.Connection); + } + else + { + copy = new SqlBulkCopy((SqlConnection)this.Context.Ado.Connection, SqlBulkCopyOptions.CheckConstraints, (SqlTransaction)this.Context.Ado.Transaction); + } + if (this.Context.Ado.Connection.State == ConnectionState.Closed) + { + this.Context.Ado.Connection.Open(); + } + copy.BulkCopyTimeout = this.Context.Ado.CommandTimeOut; + return copy; + } + private DataTable GetCopyData() + { + var dt = this.Context.Ado.GetDataTable("select top 0 * from " + InsertBuilder.GetTableNameString); + foreach (var rowInfos in DbColumnInfoList) + { + var dr = dt.NewRow(); + foreach (var value in rowInfos) + { + if (value.Value != null && UtilMethods.GetUnderType(value.Value.GetType()) == UtilConstants.DateType) + { + if (value.Value != null && value.Value.ToString() == DateTime.MinValue.ToString()) + { + value.Value = Convert.ToDateTime("1753/01/01"); + } + } + if (value.Value == null) + { + value.Value = DBNull.Value; + } + dr[value.DbColumnName] = value.Value; + } + dt.Rows.Add(dr); + } + return dt; + } + private void CloseDb() + { + if (this.Context.CurrentConnectionConfig.IsAutoCloseConnection && this.Context.Ado.Transaction == null) + { + this.Context.Ado.Connection.Close(); + } + } + } +} diff --git a/Src/Asp.NetCore2/SqlSugar/Realization/Dm/SqlBuilder/DmFastBuilder.cs b/Src/Asp.NetCore2/SqlSugar/Realization/Dm/SqlBuilder/DmFastBuilder.cs new file mode 100644 index 000000000..0a1e1318a --- /dev/null +++ b/Src/Asp.NetCore2/SqlSugar/Realization/Dm/SqlBuilder/DmFastBuilder.cs @@ -0,0 +1,56 @@ +using Dm; +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SqlSugar +{ + + public class DmFastBuilder:FastBuilder,IFastBuilder + { + public override bool IsActionUpdateColumns { get; set; } = true; + public override DbFastestProperties DbFastestProperties { get; set; } = new DbFastestProperties() { + HasOffsetTime=true + }; + public async Task ExecuteBulkCopyAsync(DataTable dt) + { + + DmBulkCopy bulkCopy = GetBulkCopyInstance(); + bulkCopy.DestinationTableName = dt.TableName; + try + { + bulkCopy.WriteToServer(dt); + await Task.Delay(0);//No Support Async + } + catch (Exception ex) + { + CloseDb(); + throw ex; + } + CloseDb(); + return dt.Rows.Count; + } + public DmBulkCopy GetBulkCopyInstance() + { + DmBulkCopy copy; + if (this.Context.Ado.Transaction == null) + { + copy = new DmBulkCopy((DmConnection)this.Context.Ado.Connection); + } + else + { + copy = new DmBulkCopy((DmConnection)this.Context.Ado.Connection, DmBulkCopyOptions.Default, (DmTransaction)this.Context.Ado.Transaction); + } + if (this.Context.Ado.Connection.State == ConnectionState.Closed) + { + this.Context.Ado.Connection.Open(); + } + copy.BulkCopyTimeout = this.Context.Ado.CommandTimeOut; + return copy; + } + + } +}