From 391fb59fb520210b270fad6da2dc28b440f29a24 Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Wed, 20 Apr 2022 17:59:01 +0800 Subject: [PATCH] Update SqlServer BulkCopyUpdate --- .../Abstract/FastestProvider/FastBuilder.cs | 1 + .../FastestProvider/FastestProvider.cs | 29 +++++++++++++++++++ .../SqlSugar/Interface/IFastBuilder.cs | 1 + .../SqlSugar/OnlyNet/OracleFastBuilder.cs | 1 + .../SqlBuilder/SqlServerFastBuilder.cs | 1 + .../Sqlite/SqlBuilder/SqliteFastBuilder.cs | 1 + 6 files changed, 34 insertions(+) diff --git a/Src/Asp.Net/SqlSugar/Abstract/FastestProvider/FastBuilder.cs b/Src/Asp.Net/SqlSugar/Abstract/FastestProvider/FastBuilder.cs index 441e7a6cb..89c46e37c 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/FastestProvider/FastBuilder.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/FastestProvider/FastBuilder.cs @@ -9,6 +9,7 @@ namespace SqlSugar { public class FastBuilder { + public virtual bool IsActionUpdateColumns { get; set; } public SqlSugarProvider Context { get; set; } public virtual string CharacterSet { get; set; } public virtual string UpdateSql { get; set; } = @"UPDATE TM diff --git a/Src/Asp.Net/SqlSugar/Abstract/FastestProvider/FastestProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/FastestProvider/FastestProvider.cs index e8fa15590..03c7d5515 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/FastestProvider/FastestProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/FastestProvider/FastestProvider.cs @@ -128,6 +128,7 @@ namespace SqlSugar this.context.CurrentConnectionConfig.IsAutoCloseConnection = false; DataTable dt = ToDdateTable(datas); IFastBuilder buider = GetBuider(); + ActionIgnoreColums(whereColumns, updateColumns, dt, buider.IsActionUpdateColumns); buider.Context = context; await buider.CreateTempAsync(dt); await buider.ExecuteBulkCopyAsync(dt); @@ -142,6 +143,34 @@ namespace SqlSugar End(datas, false); return result; } + + private void ActionIgnoreColums(string[] whereColumns, string[] updateColumns, DataTable dt,bool IsActionUpdateColumns) + { + if (entityInfo.Columns.Where(it => it.IsIgnore == false).Count() > whereColumns.Length + updateColumns.Length &&IsActionUpdateColumns) + { + var ignoreColums = dt.Columns.Cast() + .Where(it => !whereColumns.Any(y => y.EqualCase(it.ColumnName))) + .Where(it => !updateColumns.Any(y => y.EqualCase(it.ColumnName))).ToList(); + foreach (DataRow item in dt.Rows) + { + foreach (var col in ignoreColums) + { + if (item[col.ColumnName].IsNullOrEmpty()) + { + if (col.DataType == UtilConstants.StringType) + { + item[col.ColumnName] = string.Empty; + } + else + { + item[col.ColumnName] = Activator.CreateInstance(col.DataType); + } + } + } + } + } + } + private async Task _BulkUpdate(string tableName,DataTable dataTable, string[] whereColumns, string[] updateColumns) { var datas = new string[dataTable.Rows.Count].ToList(); diff --git a/Src/Asp.Net/SqlSugar/Interface/IFastBuilder.cs b/Src/Asp.Net/SqlSugar/Interface/IFastBuilder.cs index c36eb3276..3a68de8a2 100644 --- a/Src/Asp.Net/SqlSugar/Interface/IFastBuilder.cs +++ b/Src/Asp.Net/SqlSugar/Interface/IFastBuilder.cs @@ -9,6 +9,7 @@ namespace SqlSugar { public interface IFastBuilder { + bool IsActionUpdateColumns { get; set; } SqlSugarProvider Context { get; set; } string CharacterSet { get; set; } Task UpdateByTempAsync(string tableName,string tempName,string [] updateColumns,string[] whereColumns); diff --git a/Src/Asp.Net/SqlSugar/OnlyNet/OracleFastBuilder.cs b/Src/Asp.Net/SqlSugar/OnlyNet/OracleFastBuilder.cs index bf3b0e6ff..da5da74fa 100644 --- a/Src/Asp.Net/SqlSugar/OnlyNet/OracleFastBuilder.cs +++ b/Src/Asp.Net/SqlSugar/OnlyNet/OracleFastBuilder.cs @@ -16,6 +16,7 @@ namespace SqlSugar } public SqlSugarProvider Context { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + public bool IsActionUpdateColumns { get; set; } public void CloseDb() { diff --git a/Src/Asp.Net/SqlSugar/Realization/SqlServer/SqlBuilder/SqlServerFastBuilder.cs b/Src/Asp.Net/SqlSugar/Realization/SqlServer/SqlBuilder/SqlServerFastBuilder.cs index a3e65ca17..01db7ac50 100644 --- a/Src/Asp.Net/SqlSugar/Realization/SqlServer/SqlBuilder/SqlServerFastBuilder.cs +++ b/Src/Asp.Net/SqlSugar/Realization/SqlServer/SqlBuilder/SqlServerFastBuilder.cs @@ -11,6 +11,7 @@ namespace SqlSugar public class SqlServerFastBuilder:FastBuilder,IFastBuilder { + public override bool IsActionUpdateColumns { get; set; } = true; public async Task ExecuteBulkCopyAsync(DataTable dt) { diff --git a/Src/Asp.Net/SqlSugar/Realization/Sqlite/SqlBuilder/SqliteFastBuilder.cs b/Src/Asp.Net/SqlSugar/Realization/Sqlite/SqlBuilder/SqliteFastBuilder.cs index 10a00abab..2e6908fa7 100644 --- a/Src/Asp.Net/SqlSugar/Realization/Sqlite/SqlBuilder/SqliteFastBuilder.cs +++ b/Src/Asp.Net/SqlSugar/Realization/Sqlite/SqlBuilder/SqliteFastBuilder.cs @@ -14,6 +14,7 @@ namespace SqlSugar private bool IsUpdate = false; public string CharacterSet { get; set; } private DataTable UpdateDataTable { get; set; } + public bool IsActionUpdateColumns { get; set; } public SqliteFastBuilder(EntityInfo entityInfo) { this.entityInfo = entityInfo;