From 5c87dc97382aa79422ff05b29abbadd035a72b62 Mon Sep 17 00:00:00 2001 From: Wei Date: Sat, 2 May 2020 07:25:12 +0800 Subject: [PATCH] SqlBuilder Support Update Set (#1404) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I add update `Set` method and unit test. e.g: ```C# var sb = new SqlBuilder() .Set("vip = @vip", new { vip }) .Set("updatetime = @updatetime", new { updatetime }) .Where("id = @id", new { id }) ; var template = sb.AddTemplate("update #Users /**set**/ /**where**/"); connection.Execute(template.RawSql, template.Parameters); ``` RawSql will generate :  ``` update #Users Set vip = @vip , updatetime = @updatetime\n WHERE id = @id\n ``` using Dapper Execute in sqlserver it'll reqeust by below sql command ``` exec sp_executesql N'update #Users Set vip = @vip , updatetime = @updatetime WHERE id = @id ',N'@vip bit,@updatetime datetime,@id int',@vip=1,@updatetime='2020-01-01 00:00:00',@id=1 ``` Co-authored-by: Nick Craver Co-authored-by: Nick Craver --- Dapper.SqlBuilder/SqlBuilder.cs | 4 ++++ Dapper.Tests/SqlBuilderTests.cs | 40 ++++++++++++++++++++++++++++++++- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/Dapper.SqlBuilder/SqlBuilder.cs b/Dapper.SqlBuilder/SqlBuilder.cs index c83097f4..ad7b1602 100644 --- a/Dapper.SqlBuilder/SqlBuilder.cs +++ b/Dapper.SqlBuilder/SqlBuilder.cs @@ -149,5 +149,9 @@ namespace Dapper public SqlBuilder Having(string sql, dynamic parameters = null) => AddClause("having", sql, parameters, "\nAND ", "HAVING ", "\n", false); + + public SqlBuilder Set(string sql, dynamic parameters = null) => + AddClause("set", sql, parameters, " , ", "SET ", "\n", false); + } } diff --git a/Dapper.Tests/SqlBuilderTests.cs b/Dapper.Tests/SqlBuilderTests.cs index ab448242..83587ecd 100644 --- a/Dapper.Tests/SqlBuilderTests.cs +++ b/Dapper.Tests/SqlBuilderTests.cs @@ -1,4 +1,5 @@ -using System.Linq; +using System; +using System.Linq; using Xunit; namespace Dapper.Tests @@ -42,5 +43,42 @@ namespace Dapper.Tests connection.Execute("drop table #Users"); } } + + [Fact] + public void TestSqlBuilderUpdateSet() + { + var id = 1; + var vip = true; + var updatetime = DateTime.Parse("2020/01/01"); + + var sb = new SqlBuilder() + .Set("vip = @vip", new { vip }) + .Set("updatetime = @updatetime", new { updatetime }) + .Where("id = @id", new { id }) + ; + var template = sb.AddTemplate("update #Users /**set**/ /**where**/"); + + const string createSql = @" + create table #Users (Id int,Name varchar(20),Age int,Country nvarchar(5),Vip bit,Updatetime datetime); + insert #Users (Id,Name,Age,Country) values(1,'Sam',16,'USA'),(2,'Tom',25,'UK'),(3,'Henry',14,'UK')"; + try + { + connection.Execute(createSql); + + var effectCount = connection.Execute(template.RawSql, template.Parameters); + + var result = connection.QueryFirst("select * from #Users where Id = 1"); + + Assert.Equal("update #Users SET vip = @vip , updatetime = @updatetime\n WHERE id = @id\n", template.RawSql); + + + Assert.True((bool)result.Vip); + Assert.Equal(updatetime, (DateTime)result.Updatetime); + } + finally + { + connection.Execute("drop table #Users"); + } + } } }