From 0034f2703aa6635b07da3cb3dc326345eaf05687 Mon Sep 17 00:00:00 2001 From: sunkaixuna <610262374@qq.com> Date: Wed, 5 Jan 2022 12:17:01 +0800 Subject: [PATCH] db.Fastest support BulkCopyUpdate --- .../MySqlTest/Demo/Demo2_Updateable.cs | 3 +- .../SqlServerTest/Demo/Demo2_Updateable.cs | 4 +- .../FastestProvider/FastestProvider.cs | 44 +++++++++++++++++++ Src/Asp.Net/SqlSugar/Interface/IFastest.cs | 3 +- 4 files changed, 50 insertions(+), 4 deletions(-) diff --git a/Src/Asp.Net/MySqlTest/Demo/Demo2_Updateable.cs b/Src/Asp.Net/MySqlTest/Demo/Demo2_Updateable.cs index 1c66acad7..08eec174f 100644 --- a/Src/Asp.Net/MySqlTest/Demo/Demo2_Updateable.cs +++ b/Src/Asp.Net/MySqlTest/Demo/Demo2_Updateable.cs @@ -99,7 +99,8 @@ namespace OrmTest //Where Sql //db.Updateable(updateObj).Where("id=@x", new { x = "1" }).ExecuteCommand(); - + var dataTable = db.Queryable().Select("id,name,1 as price").Take(2).ToDataTable(); + db.Fastest().BulkUpdate("Order", dataTable, new string[] { "id" }, new string[] { "name" }); Console.WriteLine("#### Updateable End ####"); } diff --git a/Src/Asp.Net/SqlServerTest/Demo/Demo2_Updateable.cs b/Src/Asp.Net/SqlServerTest/Demo/Demo2_Updateable.cs index bc8899445..9758199c6 100644 --- a/Src/Asp.Net/SqlServerTest/Demo/Demo2_Updateable.cs +++ b/Src/Asp.Net/SqlServerTest/Demo/Demo2_Updateable.cs @@ -109,8 +109,8 @@ namespace OrmTest .AddQueue(); db.SaveQueues(); - - db.Fastest().BulkCopy(updateObjs); + var dataTable = db.Queryable().Select("id,name,1 as price").Take(2).ToDataTable(); + db.Fastest().BulkUpdate("Order", dataTable,new string[] {"id" },new string[] {"name" }); Console.WriteLine("#### Updateable End ####"); } diff --git a/Src/Asp.Net/SqlSugar/Abstract/FastestProvider/FastestProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/FastestProvider/FastestProvider.cs index 78f47f280..5ae276559 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/FastestProvider/FastestProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/FastestProvider/FastestProvider.cs @@ -94,6 +94,28 @@ namespace SqlSugar return await _BulkUpdate(datas, whereColumns, updateColumns); } } + + public int BulkUpdate(string tableName,DataTable dataTable, string[] whereColumns, string[] updateColumns) + { + return BulkUpdateAsync(tableName,dataTable, whereColumns, updateColumns).ConfigureAwait(true).GetAwaiter().GetResult(); + } + public async Task BulkUpdateAsync(string tableName, DataTable dataTable, string[] whereColumns, string[] updateColumns) + { + + if (Size > 0) + { + int resul = 0; + await this.context.Utilities.PageEachAsync(dataTable.Rows.Cast().ToList(), Size, async item => + { + resul += await _BulkUpdate(tableName,item.CopyToDataTable(), whereColumns, updateColumns); + }); + return resul; + } + else + { + return await _BulkUpdate(tableName,dataTable, whereColumns, updateColumns); + } + } #endregion #region Core @@ -117,6 +139,28 @@ namespace SqlSugar End(datas, false); return result; } + private async Task _BulkUpdate(string tableName,DataTable dataTable, string[] whereColumns, string[] updateColumns) + { + var datas = new string[dataTable.Rows.Count].ToList(); + Begin(datas, false); + Check.Exception(whereColumns == null || whereColumns.Count() == 0, "where columns count=0 or need primary key"); + Check.Exception(updateColumns == null || updateColumns.Count() == 0, "set columns count=0"); + var isAuto = this.context.CurrentConnectionConfig.IsAutoCloseConnection; + this.context.CurrentConnectionConfig.IsAutoCloseConnection = false; + dataTable.TableName = this.queryable.SqlBuilder.GetTranslationTableName(tableName); + DataTable dt = GetCopyWriteDataTable(dataTable); + IFastBuilder buider = GetBuider(); + buider.Context = context; + await buider.CreateTempAsync(dt); + await buider.ExecuteBulkCopyAsync(dt); + //var queryTemp = this.context.Queryable().AS(dt.TableName).ToList();//test + var result = await buider.UpdateByTempAsync(GetTableName(), dt.TableName, updateColumns, whereColumns); + this.context.DbMaintenance.DropTable(dt.TableName); + this.context.CurrentConnectionConfig.IsAutoCloseConnection = isAuto; + buider.CloseDb(); + End(datas, false); + return result; + } private async Task _BulkCopy(List datas) { Begin(datas,true); diff --git a/Src/Asp.Net/SqlSugar/Interface/IFastest.cs b/Src/Asp.Net/SqlSugar/Interface/IFastest.cs index 7f91db84f..e51ad16b2 100644 --- a/Src/Asp.Net/SqlSugar/Interface/IFastest.cs +++ b/Src/Asp.Net/SqlSugar/Interface/IFastest.cs @@ -19,7 +19,8 @@ namespace SqlSugar Task BulkUpdateAsync(List datas); int BulkUpdate(List datas, string[] whereColumns, string[] updateColumns); Task BulkUpdateAsync(List datas, string[] whereColumns, string[] updateColumns); - + int BulkUpdate(string tableName,DataTable dataTable, string[] whereColumns, string[] updateColumns); + Task BulkUpdateAsync(string tableName, DataTable dataTable, string[] whereColumns, string[] updateColumns); SplitFastest SplitTable(); } }