From 87bf9c0625a31d140df1ebc15a222fff04d4e2b3 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@users.noreply.github.com> Date: Thu, 5 Jan 2023 15:43:21 +0800 Subject: [PATCH 1/8] Update feature-request.md --- .github/ISSUE_TEMPLATE/feature-request.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.github/ISSUE_TEMPLATE/feature-request.md b/.github/ISSUE_TEMPLATE/feature-request.md index 0106f2d6..54d00198 100644 --- a/.github/ISSUE_TEMPLATE/feature-request.md +++ b/.github/ISSUE_TEMPLATE/feature-request.md @@ -16,8 +16,18 @@ assignees: '' #### Feature 特性 +```c# +// c# code +``` #### 简要描述原因 +```c# +// c# code +``` #### 使用场景 + +```c# +// c# code +``` From 3f3dbcad74ee3624deeb9ba10a862e5f216762ae Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@users.noreply.github.com> Date: Thu, 5 Jan 2023 15:44:22 +0800 Subject: [PATCH 2/8] Update bug-report.md --- .github/ISSUE_TEMPLATE/bug-report.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md index 9184a937..a738c3e4 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.md +++ b/.github/ISSUE_TEMPLATE/bug-report.md @@ -17,18 +17,23 @@ assignees: '' #### 问题描述及重现步骤: +```c# +// c# code +``` #### 数据库的具体版本 + ``` ``` #### 安装的包 -``` +``` ``` #### .net framework/. net core? 及具体版本 -``` -``` \ No newline at end of file +```c# +// c# code +``` From dde3decebc1036159071ce152a2a95eafea9001b Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@users.noreply.github.com> Date: Thu, 5 Jan 2023 15:48:34 +0800 Subject: [PATCH 3/8] Update bug-report.md --- .github/ISSUE_TEMPLATE/bug-report.md | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md index a738c3e4..30a7e670 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.md +++ b/.github/ISSUE_TEMPLATE/bug-report.md @@ -11,29 +11,21 @@ assignees: '' 以下为必读项,不仔细阅读会导致你的 Issue 被关闭 1. 该分类下只能提交 Bug,如果要询问使用方法等,请前往讨论区:https://github.com/dotnetcore/FreeSql/discussions -2. FreeSql写了许多文档,在提问题前,麻烦先查看[常见问题](http://freesql.net/reference/faq.html) +2. FreeSql写了许多文档,在提问题前,麻烦先查看[常见问题](https://freesql.net/reference/faq.html) 3. 不完整的信息将不会得到任何回复!发布问题后,请保持对 issue 的关注,有时会有需要进一步沟通的信息,很长时间内没有得到答复的 issue 将被关闭。 4. 提供可重现的代码,至少应描述以下信息 --> -#### 问题描述及重现步骤: +#### 问题描述及重现代码: ```c# // c# code ``` -#### 数据库的具体版本 +#### 数据库版本 -``` -``` +#### 安装的Nuget包 -#### 安装的包 - -``` -``` #### .net framework/. net core? 及具体版本 -```c# -// c# code -``` From 3897da4f4f8ce829ffad2a476a05c5fe16c9571b Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Thu, 5 Jan 2023 16:53:25 +0800 Subject: [PATCH 4/8] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=20pgsql=20OnConflict?= =?UTF-8?q?DoUpdate=20=E4=B8=B4=E6=97=B6=E4=B8=BB=E9=94=AE=E9=97=AE?= =?UTF-8?q?=E9=A2=98=EF=BC=9B#1393?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PostgreSQL/Curd/OnConflictDoUpdateTest.cs | 122 +++++++++++- FreeSql/FreeSql.xml | 183 ------------------ .../CustomPostgreSQLOnConflictDoUpdate.cs | 3 +- .../Curd/KingbaseESOnConflictDoUpdate.cs | 1 + .../Curd/OdbcKingbaseESOnConflictDoUpdate.cs | 1 + .../Curd/OdbcPostgreSQLOnConflictDoUpdate.cs | 1 + .../Curd/OnConflictDoUpdate.cs | 1 + 7 files changed, 127 insertions(+), 185 deletions(-) diff --git a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/OnConflictDoUpdateTest.cs b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/OnConflictDoUpdateTest.cs index 1f54becc..098d29b8 100644 --- a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/OnConflictDoUpdateTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/OnConflictDoUpdateTest.cs @@ -1,7 +1,8 @@ -using FreeSql.DataAnnotations; +using FreeSql.DataAnnotations; using System; using System.Collections.Generic; using System.Linq; +using System.Reflection; using Xunit; namespace FreeSql.Tests.PostgreSQL @@ -16,6 +17,125 @@ namespace FreeSql.Tests.PostgreSQL public DateTime? time { get; set; } } + [Table(Name = "demo_class1"), Index("uk_demo1", "name", true)] + public class DemoClass1 + { + [Column(Name = "id")] + public int Id { get; set; } + + [Column(Name = "name", IsNullable = false)] + public string Name { get; set; } + + [Column(Name = "desc")] + public string Description { get; set; } + + #region 系统非业务基础字段 + //更新操作忽略此字段 只在OnConflictDoUpdate的插入操作时生效 + [Column(Name = "created_id", CanUpdate = false, InsertValueSql = "1")] + public virtual int CreatedId { get; set; } + + //插入操作忽略此字段 只在OnConflictDoUpdate的更新操作时生效 + [Column(Name = "modified_id", CanInsert = false, InsertValueSql = "1")] + [UpdateValueSql("1")] + public virtual int? ModifiedId { get; set; } + + //更新操作忽略此字段 只在OnConflictDoUpdate的插入操作时生效 + [Column(Name = "created_time", CanUpdate = false, ServerTime = DateTimeKind.Local)] + public virtual DateTime CreatedTime { get; set; } + + //插入操作忽略此字段 只在OnConflictDoUpdate的更新操作时生效 + [Column(Name = "modified_time", CanInsert = false, ServerTime = DateTimeKind.Local)] + public virtual DateTime? ModifiedTime { get; set; } + #endregion + } + [Table(Name = "demo_class2")] + public class DemoClass2 + { + [Column(Name = "name", IsNullable = false)] + public string Name { get; set; } + + [Column(Name = "desc")] + public string Description { get; set; } + + #region 系统非业务基础字段 + //更新操作忽略此字段 只在OnConflictDoUpdate的插入操作时生效 + [Column(Name = "created_id", CanUpdate = false, InsertValueSql = "1")] + public virtual int CreatedId { get; set; } + + //插入操作忽略此字段 只在OnConflictDoUpdate的更新操作时生效 + [Column(Name = "modified_id", CanInsert = false, InsertValueSql = "1")] + [UpdateValueSql("1")] + public virtual int? ModifiedId { get; set; } + + //更新操作忽略此字段 只在OnConflictDoUpdate的插入操作时生效 + [Column(Name = "created_time", CanUpdate = false, ServerTime = DateTimeKind.Local)] + public virtual DateTime CreatedTime { get; set; } + + //插入操作忽略此字段 只在OnConflictDoUpdate的更新操作时生效 + [Column(Name = "modified_time", CanInsert = false, ServerTime = DateTimeKind.Local)] + public virtual DateTime? ModifiedTime { get; set; } + #endregion + } + class UpdateValueSqlAttribute : Attribute + { + public string Value { get; set; } + public UpdateValueSqlAttribute(string value) => Value = value; + } + [Fact] + public void Issues1393() + { + var fsql = g.pgsql; + //跟随 FreeSqlBuilder Build 之后初始化,批量设置实体类: + foreach (var entity in new[] { typeof(DemoClass1) }) + { + var table = fsql.CodeFirst.GetTableByEntity(entity); + table.Properties.Values + .Select(a => new { Property = a, UpdateValueSql = a.GetCustomAttribute()?.Value }) + .Where(a => a.UpdateValueSql != null) + .ToList() + .ForEach(a => + { + var col = table.ColumnsByCs[a.Property.Name]; + col.GetType().GetProperty("DbUpdateValue").SetValue(col, a.UpdateValueSql); + }); + } + + var sql = fsql.Insert(Enumerable.Range(1, 5).Select(i => new DemoClass1 { Id = i, Name = $"Name{i}", Description = $"Description{i}" })) + .NoneParameter() + .OnConflictDoUpdate(a => new { a.Name }) + .ToSql(); + Assert.Equal(@"INSERT INTO ""demo_class1""(""id"", ""name"", ""desc"", ""created_id"", ""created_time"") VALUES(1, 'Name1', 'Description1', 1, current_timestamp), (2, 'Name2', 'Description2', 1, current_timestamp), (3, 'Name3', 'Description3', 1, current_timestamp), (4, 'Name4', 'Description4', 1, current_timestamp), (5, 'Name5', 'Description5', 1, current_timestamp) +ON CONFLICT(""name"") DO UPDATE SET +""name"" = EXCLUDED.""name"", +""desc"" = EXCLUDED.""desc"", +""modified_id"" = 1, +""modified_time"" = current_timestamp", sql); + + + sql = fsql.Insert(Enumerable.Range(1, 5).Select(i => new DemoClass2 { Name = $"Name{i}", Description = $"Description{i}", ModifiedId = 1 })) + .NoneParameter() + .OnConflictDoUpdate(a => new { a.Name }) + .ToSql(); + Assert.Equal(@"INSERT INTO ""demo_class2""(""name"", ""desc"", ""created_id"", ""created_time"") VALUES('Name1', 'Description1', 1, current_timestamp), ('Name2', 'Description2', 1, current_timestamp), ('Name3', 'Description3', 1, current_timestamp), ('Name4', 'Description4', 1, current_timestamp), ('Name5', 'Description5', 1, current_timestamp) +ON CONFLICT(""name"") DO UPDATE SET +""name"" = EXCLUDED.""name"", +""desc"" = EXCLUDED.""desc"", +""modified_id"" = CASE EXCLUDED.""name"" +WHEN 'Name1' THEN 1 +WHEN 'Name2' THEN 1 +WHEN 'Name3' THEN 1 +WHEN 'Name4' THEN 1 +WHEN 'Name5' THEN 1 END::int4, +""modified_time"" = current_timestamp", sql); + + //sql = g.pgsql.Insert(data) + // .NoneParameter() + // .OnConflictDoUpdate(a => new { a.Name }) + // .UpdateColumns() + // .ToSql(); + } + + [Fact] public void ExecuteAffrows() { diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 21395735..ec33a9bf 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -3335,177 +3335,6 @@ - - - 测试数据库是否连接正确,本方法执行如下命令: - MySql/SqlServer/PostgreSQL/达梦/人大金仓/神通: SELECT 1 - Oracle: SELECT 1 FROM dual - - 命令超时设置(秒) - - true: 成功, false: 失败 - - - - 查询,若使用读写分离,查询【从库】条件cmdText.StartsWith("SELECT "),否则查询【主库】 - - - - - - - - - - 查询,ExecuteReaderAsync(dr => {}, "select * from user where age > @age", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - - - 查询 - - - - - - - - - 查询,ExecuteArrayAsync("select * from user where age > @age", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - - - 查询 - - - - - - - - - 查询,ExecuteDataSetAsync("select * from user where age > @age; select 2", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - - - 查询 - - - - - - - - - 查询,ExecuteDataTableAsync("select * from user where age > @age", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - - - 在【主库】执行 - - - - - - - - - 在【主库】执行,ExecuteNonQueryAsync("delete from user where age > @age", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - - - 在【主库】执行 - - - - - - - - - 在【主库】执行,ExecuteScalarAsync("select 1 from user where age > @age", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - - - 执行SQL返回对象集合,QueryAsync<User>("select * from user where age > @age", new SqlParameter { ParameterName = "age", Value = 25 }) - - - - - - - - - - - 执行SQL返回对象集合,QueryAsync<User>("select * from user where age > @age", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - - - - 执行SQL返回对象集合,Query<User>("select * from user where age > @age; select * from address", new SqlParameter { ParameterName = "age", Value = 25 }) - - - - - - - - - - - - 执行SQL返回对象集合,Query<User, Address>("select * from user where age > @age; select * from address", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - - 可自定义解析表达式 @@ -4496,12 +4325,6 @@ 超时 - - - 获取资源 - - - 使用完毕后,归还资源 @@ -4577,12 +4400,6 @@ 资源对象 - - - 从对象池获取对象成功的时候触发,通过该方法统计或初始化对象 - - 资源对象 - 归还对象给对象池的时候触发 diff --git a/Providers/FreeSql.Provider.Custom/PostgreSQL/Curd/CustomPostgreSQLOnConflictDoUpdate.cs b/Providers/FreeSql.Provider.Custom/PostgreSQL/Curd/CustomPostgreSQLOnConflictDoUpdate.cs index b7717283..c81d5b51 100644 --- a/Providers/FreeSql.Provider.Custom/PostgreSQL/Curd/CustomPostgreSQLOnConflictDoUpdate.cs +++ b/Providers/FreeSql.Provider.Custom/PostgreSQL/Curd/CustomPostgreSQLOnConflictDoUpdate.cs @@ -24,7 +24,7 @@ namespace FreeSql.Custom.PostgreSQL public CustomPostgreSQLOnConflictDoUpdate(IInsert insert, Expression> columns = null) { _pgsqlInsert = insert as CustomPostgreSQLInsert; - if (_pgsqlInsert == null) throw new Exception(CoreStrings.S_Features_Unique("OnConflictDoUpdate", "Odbc/PostgreSQL")); + if (_pgsqlInsert == null) throw new Exception(CoreStrings.S_Features_Unique("OnConflictDoUpdate", "Custom/PostgreSQL")); if (_pgsqlInsert._noneParameterFlag == "c") _pgsqlInsert._noneParameterFlag = "cu"; if (columns != null) @@ -109,6 +109,7 @@ namespace FreeSql.Custom.PostgreSQL { sb.Append(") DO UPDATE SET\r\n"); + if (_pgsqlUpdate._tempPrimarys.Any() == false) _pgsqlUpdate._tempPrimarys = _tempPrimarys; var sbSetEmpty = _pgsqlUpdate.InternalSbSet.Length == 0; var sbSetIncrEmpty = _pgsqlUpdate.InternalSbSetIncr.Length == 0; if (sbSetEmpty == false || sbSetIncrEmpty == false) diff --git a/Providers/FreeSql.Provider.KingbaseES/Curd/KingbaseESOnConflictDoUpdate.cs b/Providers/FreeSql.Provider.KingbaseES/Curd/KingbaseESOnConflictDoUpdate.cs index 91036fb5..ebe991fa 100644 --- a/Providers/FreeSql.Provider.KingbaseES/Curd/KingbaseESOnConflictDoUpdate.cs +++ b/Providers/FreeSql.Provider.KingbaseES/Curd/KingbaseESOnConflictDoUpdate.cs @@ -109,6 +109,7 @@ namespace FreeSql.KingbaseES { sb.Append(") DO UPDATE SET\r\n"); + if (_update._tempPrimarys.Any() == false) _update._tempPrimarys = _tempPrimarys; var sbSetEmpty = _update.InternalSbSet.Length == 0; var sbSetIncrEmpty = _update.InternalSbSetIncr.Length == 0; if (sbSetEmpty == false || sbSetIncrEmpty == false) diff --git a/Providers/FreeSql.Provider.Odbc/KingbaseES/Curd/OdbcKingbaseESOnConflictDoUpdate.cs b/Providers/FreeSql.Provider.Odbc/KingbaseES/Curd/OdbcKingbaseESOnConflictDoUpdate.cs index e061da85..c676190d 100644 --- a/Providers/FreeSql.Provider.Odbc/KingbaseES/Curd/OdbcKingbaseESOnConflictDoUpdate.cs +++ b/Providers/FreeSql.Provider.Odbc/KingbaseES/Curd/OdbcKingbaseESOnConflictDoUpdate.cs @@ -109,6 +109,7 @@ namespace FreeSql.Odbc.KingbaseES { sb.Append(") DO UPDATE SET\r\n"); + if (_pgsqlUpdate._tempPrimarys.Any() == false) _pgsqlUpdate._tempPrimarys = _tempPrimarys; var sbSetEmpty = _pgsqlUpdate.InternalSbSet.Length == 0; var sbSetIncrEmpty = _pgsqlUpdate.InternalSbSetIncr.Length == 0; if (sbSetEmpty == false || sbSetIncrEmpty == false) diff --git a/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLOnConflictDoUpdate.cs b/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLOnConflictDoUpdate.cs index 474fd73e..23562c66 100644 --- a/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLOnConflictDoUpdate.cs +++ b/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLOnConflictDoUpdate.cs @@ -109,6 +109,7 @@ namespace FreeSql.Odbc.PostgreSQL { sb.Append(") DO UPDATE SET\r\n"); + if (_pgsqlUpdate._tempPrimarys.Any() == false) _pgsqlUpdate._tempPrimarys = _tempPrimarys; var sbSetEmpty = _pgsqlUpdate.InternalSbSet.Length == 0; var sbSetIncrEmpty = _pgsqlUpdate.InternalSbSetIncr.Length == 0; if (sbSetEmpty == false || sbSetIncrEmpty == false) diff --git a/Providers/FreeSql.Provider.PostgreSQL/Curd/OnConflictDoUpdate.cs b/Providers/FreeSql.Provider.PostgreSQL/Curd/OnConflictDoUpdate.cs index 7727ea78..03113e00 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/Curd/OnConflictDoUpdate.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/Curd/OnConflictDoUpdate.cs @@ -109,6 +109,7 @@ namespace FreeSql.PostgreSQL.Curd { sb.Append(") DO UPDATE SET\r\n"); + if (_pgsqlUpdate._tempPrimarys.Any() == false) _pgsqlUpdate._tempPrimarys = _tempPrimarys; var sbSetEmpty = _pgsqlUpdate.InternalSbSet.Length == 0; var sbSetIncrEmpty = _pgsqlUpdate.InternalSbSetIncr.Length == 0; if (sbSetEmpty == false || sbSetIncrEmpty == false) From f647a1909d71d168e591fb1f29566bff7e4575bc Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Thu, 5 Jan 2023 16:56:18 +0800 Subject: [PATCH 5/8] v3.2.686-preview20230105 #1393 #1390 #1389 #1385 #1386 --- Directory.Build.props | 2 +- .../FreeSql.Extensions.BaseEntity.csproj | 2 +- .../FreeSql.Extensions.JsonMap.csproj | 2 +- .../FreeSql.Extensions.LazyLoading.csproj | 2 +- .../FreeSql.Extensions.Linq.csproj | 2 +- .../FreeSql.Generator.csproj | 2 +- FreeSql.All/FreeSql.All.csproj | 2 +- FreeSql.DbContext/FreeSql.DbContext.csproj | 2 +- FreeSql.Repository/FreeSql.Repository.csproj | 2 +- FreeSql/FreeSql.csproj | 2 +- FreeSql/FreeSql.xml | 183 ++++++++++++++++++ .../FreeSql.Provider.ClickHouse.csproj | 2 +- .../FreeSql.Provider.Custom.csproj | 2 +- .../FreeSql.Provider.Dameng.csproj | 2 +- .../FreeSql.Provider.Firebird.csproj | 2 +- .../FreeSql.Provider.GBase.csproj | 2 +- .../FreeSql.Provider.KingbaseES.csproj | 2 +- .../FreeSql.Provider.MsAccess.csproj | 2 +- .../FreeSql.Provider.MySql.csproj | 2 +- .../FreeSql.Provider.MySqlConnector.csproj | 2 +- .../FreeSql.Provider.Odbc.csproj | 2 +- .../FreeSql.Provider.Oracle.csproj | 2 +- .../FreeSql.Provider.OracleOledb.csproj | 2 +- .../FreeSql.Provider.PostgreSQL.csproj | 2 +- .../FreeSql.Provider.ShenTong.csproj | 2 +- .../FreeSql.Provider.SqlServer.csproj | 2 +- ...FreeSql.Provider.SqlServerForSystem.csproj | 2 +- .../FreeSql.Provider.Sqlite.csproj | 2 +- .../FreeSql.Provider.SqliteCore.csproj | 2 +- 29 files changed, 211 insertions(+), 28 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 55ad4bcb..13340d1e 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -11,7 +11,7 @@ diff --git a/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj b/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj index fac5ba51..8984ecb4 100644 --- a/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj +++ b/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj @@ -19,7 +19,7 @@ key.snk false latest - 3.2.686-preview20221226 + 3.2.686-preview20230105 diff --git a/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj b/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj index e4dfe72a..12dcf9f7 100644 --- a/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj +++ b/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.686-preview20221226 + 3.2.686-preview20230105 diff --git a/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj b/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj index 9f5d9bf0..006c39bf 100644 --- a/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj +++ b/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.686-preview20221226 + 3.2.686-preview20230105 diff --git a/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj b/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj index 84211ac8..66af2640 100644 --- a/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj +++ b/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.686-preview20221226 + 3.2.686-preview20230105 diff --git a/Extensions/FreeSql.Generator/FreeSql.Generator.csproj b/Extensions/FreeSql.Generator/FreeSql.Generator.csproj index 0ea57f7f..b3f399eb 100644 --- a/Extensions/FreeSql.Generator/FreeSql.Generator.csproj +++ b/Extensions/FreeSql.Generator/FreeSql.Generator.csproj @@ -13,7 +13,7 @@ https://github.com/2881099/FreeSql https://github.com/2881099/FreeSql FreeSql DbFirst 实体生成器 - 3.2.686-preview20221226 + 3.2.686-preview20230105 diff --git a/FreeSql.All/FreeSql.All.csproj b/FreeSql.All/FreeSql.All.csproj index 88e178e1..92f04253 100644 --- a/FreeSql.All/FreeSql.All.csproj +++ b/FreeSql.All/FreeSql.All.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.686-preview20221226 + 3.2.686-preview20230105 diff --git a/FreeSql.DbContext/FreeSql.DbContext.csproj b/FreeSql.DbContext/FreeSql.DbContext.csproj index 80db1c24..ee9649c8 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.csproj +++ b/FreeSql.DbContext/FreeSql.DbContext.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.686-preview20221226 + 3.2.686-preview20230105 diff --git a/FreeSql.Repository/FreeSql.Repository.csproj b/FreeSql.Repository/FreeSql.Repository.csproj index 03b84467..6a0763be 100644 --- a/FreeSql.Repository/FreeSql.Repository.csproj +++ b/FreeSql.Repository/FreeSql.Repository.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.686-preview20221226 + 3.2.686-preview20230105 diff --git a/FreeSql/FreeSql.csproj b/FreeSql/FreeSql.csproj index 897ae9a1..833b0f0e 100644 --- a/FreeSql/FreeSql.csproj +++ b/FreeSql/FreeSql.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.686-preview20221226 + 3.2.686-preview20230105 diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index ec33a9bf..21395735 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -3335,6 +3335,177 @@ + + + 测试数据库是否连接正确,本方法执行如下命令: + MySql/SqlServer/PostgreSQL/达梦/人大金仓/神通: SELECT 1 + Oracle: SELECT 1 FROM dual + + 命令超时设置(秒) + + true: 成功, false: 失败 + + + + 查询,若使用读写分离,查询【从库】条件cmdText.StartsWith("SELECT "),否则查询【主库】 + + + + + + + + + + 查询,ExecuteReaderAsync(dr => {}, "select * from user where age > @age", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + + 查询 + + + + + + + + + 查询,ExecuteArrayAsync("select * from user where age > @age", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + + 查询 + + + + + + + + + 查询,ExecuteDataSetAsync("select * from user where age > @age; select 2", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + + 查询 + + + + + + + + + 查询,ExecuteDataTableAsync("select * from user where age > @age", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + + 在【主库】执行 + + + + + + + + + 在【主库】执行,ExecuteNonQueryAsync("delete from user where age > @age", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + + 在【主库】执行 + + + + + + + + + 在【主库】执行,ExecuteScalarAsync("select 1 from user where age > @age", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + + 执行SQL返回对象集合,QueryAsync<User>("select * from user where age > @age", new SqlParameter { ParameterName = "age", Value = 25 }) + + + + + + + + + + + 执行SQL返回对象集合,QueryAsync<User>("select * from user where age > @age", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + + + 执行SQL返回对象集合,Query<User>("select * from user where age > @age; select * from address", new SqlParameter { ParameterName = "age", Value = 25 }) + + + + + + + + + + + + 执行SQL返回对象集合,Query<User, Address>("select * from user where age > @age; select * from address", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + 可自定义解析表达式 @@ -4325,6 +4496,12 @@ 超时 + + + 获取资源 + + + 使用完毕后,归还资源 @@ -4400,6 +4577,12 @@ 资源对象 + + + 从对象池获取对象成功的时候触发,通过该方法统计或初始化对象 + + 资源对象 + 归还对象给对象池的时候触发 diff --git a/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj b/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj index fd181fe5..64ecebea 100644 --- a/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj +++ b/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj @@ -19,7 +19,7 @@ False key.snk false - 3.2.686-preview20221226 + 3.2.686-preview20230105 diff --git a/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj b/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj index 409df27a..63422d89 100644 --- a/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj +++ b/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.686-preview20221226 + 3.2.686-preview20230105 diff --git a/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj b/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj index 08efbd25..cf33db45 100644 --- a/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj +++ b/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.686-preview20221226 + 3.2.686-preview20230105 diff --git a/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj b/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj index a41d2e83..faaac6c2 100644 --- a/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj +++ b/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.686-preview20221226 + 3.2.686-preview20230105 diff --git a/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj b/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj index 61330501..f198f616 100644 --- a/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj +++ b/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.686-preview20221226 + 3.2.686-preview20230105 diff --git a/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj b/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj index f2f433d4..381bc142 100644 --- a/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj +++ b/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.686-preview20221226 + 3.2.686-preview20230105 diff --git a/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj b/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj index 304d4d83..58626754 100644 --- a/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj +++ b/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.686-preview20221226 + 3.2.686-preview20230105 diff --git a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj index f2a12a4d..7ef10215 100644 --- a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj +++ b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.686-preview20221226 + 3.2.686-preview20230105 diff --git a/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj b/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj index e0c2a6bd..3e5b6671 100644 --- a/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj +++ b/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.686-preview20221226 + 3.2.686-preview20230105 diff --git a/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj b/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj index 1ed4f3ed..1647b9d0 100644 --- a/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj +++ b/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.686-preview20221226 + 3.2.686-preview20230105 diff --git a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj index 2437cec0..4d5e1093 100644 --- a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj +++ b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.686-preview20221226 + 3.2.686-preview20230105 diff --git a/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj b/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj index c2fbd732..57f1bf9d 100644 --- a/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj +++ b/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.686-preview20221226 + 3.2.686-preview20230105 diff --git a/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj index 9e009d72..7bdc2e76 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj +++ b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.686-preview20221226 + 3.2.686-preview20230105 diff --git a/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj b/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj index ce48a8c2..ac3f1080 100644 --- a/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj +++ b/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.686-preview20221226 + 3.2.686-preview20230105 diff --git a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj index c0c9f961..f356c660 100644 --- a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj +++ b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj @@ -18,7 +18,7 @@ true false key.snk - 3.2.686-preview20221226 + 3.2.686-preview20230105 diff --git a/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj b/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj index 2d1eadc9..8de51633 100644 --- a/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj +++ b/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.686-preview20221226 + 3.2.686-preview20230105 diff --git a/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj index 8a53471e..a24093ad 100644 --- a/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj +++ b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.686-preview20221226 + 3.2.686-preview20230105 diff --git a/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj b/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj index f38c5a97..976dc59b 100644 --- a/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj +++ b/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.686-preview20221226 + 3.2.686-preview20230105 From 1d9cd1f59d3073fceb7f0f0c0b19af9b81f33f45 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Fri, 6 Jan 2023 01:59:28 +0800 Subject: [PATCH 6/8] =?UTF-8?q?-=20=E4=BC=98=E5=8C=96=20IUpdate=20?= =?UTF-8?q?=E6=89=B9=E9=87=8F=20case=20when=20=E5=90=8C=E5=80=BC=E7=9A=84?= =?UTF-8?q?=20SQL=20=E7=94=9F=E6=88=90=EF=BC=9B#1393?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MySql/Curd/MySqlInsertOrUpdateTest.cs | 2 +- .../MySql/Curd/OnDuplicateKeyUpdateTest.cs | 20 +++----------- .../MySql/MySqlAdo/MySqlAdoTest.cs | 4 +-- .../PostgreSQL/Curd/OnConflictDoUpdateTest.cs | 20 +++----------- .../Curd/OnDuplicateKeyUpdateTest.cs | 22 ++++----------- .../MySql/Curd/OnDuplicateKeyUpdateTest.cs | 22 ++++----------- .../PostgreSQL/Curd/OnConflictDoUpdateTest.cs | 22 ++++----------- .../MySql/Curd/OnDuplicateKeyUpdateTest.cs | 22 ++++----------- .../PostgreSQL/Curd/OnConflictDoUpdateTest.cs | 27 ++++--------------- .../Internal/CommonProvider/UpdateProvider.cs | 14 +++++++--- 10 files changed, 46 insertions(+), 129 deletions(-) diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Custom/MySql/Curd/MySqlInsertOrUpdateTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Custom/MySql/Curd/MySqlInsertOrUpdateTest.cs index 0bb8f628..a2ffc382 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Custom/MySql/Curd/MySqlInsertOrUpdateTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Custom/MySql/Curd/MySqlInsertOrUpdateTest.cs @@ -87,7 +87,7 @@ ON DUPLICATE KEY UPDATE Assert.Equal(@"INSERT INTO `tbiou022`(`id`, `name`) VALUES(1, '01'), (2, '02'), (3, '03'), (4, '04') ON DUPLICATE KEY UPDATE `name` = VALUES(`name`)", sql); - Assert.Equal(4, iou.ExecuteAffrows()); + Assert.Equal(5, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().SetSource(new[] { new tbiou022 { id = 1, name = "001" }, new tbiou022 { id = 2, name = "002" }, new tbiou022 { id = 3, name = "003" }, new tbiou022 { id = 4, name = "004" } }); sql = iou.ToSql(); diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Custom/MySql/Curd/OnDuplicateKeyUpdateTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Custom/MySql/Curd/OnDuplicateKeyUpdateTest.cs index bc1dc8b1..29d689af 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Custom/MySql/Curd/OnDuplicateKeyUpdateTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Custom/MySql/Curd/OnDuplicateKeyUpdateTest.cs @@ -59,10 +59,7 @@ ON DUPLICATE KEY UPDATE Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(200, 'title-200'), (201, 'title-201'), (202, 'title-202') ON DUPLICATE KEY UPDATE `title` = VALUES(`title`), -`time` = CASE `id` -WHEN 200 THEN '2000-01-01 00:00:00.000' -WHEN 201 THEN '2000-01-01 00:00:00.000' -WHEN 202 THEN '2000-01-01 00:00:00.000' END", odku2.ToSql()); +`time` = '2000-01-01 00:00:00.000'", odku2.ToSql()); odku2.ExecuteAffrows(); @@ -80,10 +77,7 @@ ON DUPLICATE KEY UPDATE }).IgnoreColumns(a => a.time).NoneParameter().InsertIdentity()).IgnoreColumns(a => a.title); Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(200, 'title-200'), (201, 'title-201'), (202, 'title-202') ON DUPLICATE KEY UPDATE -`time` = CASE `id` -WHEN 200 THEN '2000-01-01 00:00:00.000' -WHEN 201 THEN '2000-01-01 00:00:00.000' -WHEN 202 THEN '2000-01-01 00:00:00.000' END", odku2.ToSql()); +`time` = '2000-01-01 00:00:00.000'", odku2.ToSql()); odku2.ExecuteAffrows(); } @@ -106,10 +100,7 @@ ON DUPLICATE KEY UPDATE Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(300, 'title-300'), (301, 'title-301'), (302, 'title-302') ON DUPLICATE KEY UPDATE `title` = VALUES(`title`), -`time` = CASE `id` -WHEN 300 THEN '2000-01-01 00:00:00.000' -WHEN 301 THEN '2000-01-01 00:00:00.000' -WHEN 302 THEN '2000-01-01 00:00:00.000' END", odku2.ToSql()); +`time` = '2000-01-01 00:00:00.000'", odku2.ToSql()); odku2.ExecuteAffrows(); @@ -127,10 +118,7 @@ ON DUPLICATE KEY UPDATE }).InsertColumns(a => a.title).NoneParameter().InsertIdentity()).UpdateColumns(a => a.time); Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(300, 'title-300'), (301, 'title-301'), (302, 'title-302') ON DUPLICATE KEY UPDATE -`time` = CASE `id` -WHEN 300 THEN '2000-01-01 00:00:00.000' -WHEN 301 THEN '2000-01-01 00:00:00.000' -WHEN 302 THEN '2000-01-01 00:00:00.000' END", odku2.ToSql()); +`time` = '2000-01-01 00:00:00.000'", odku2.ToSql()); odku2.ExecuteAffrows(); } diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Custom/MySql/MySqlAdo/MySqlAdoTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Custom/MySql/MySqlAdo/MySqlAdoTest.cs index d3acac24..ad924380 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Custom/MySql/MySqlAdo/MySqlAdoTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Custom/MySql/MySqlAdo/MySqlAdoTest.cs @@ -1,4 +1,4 @@ -using FreeSql.DataAnnotations; +using FreeSql.DataAnnotations; using System; using System.Data.Odbc; using Xunit; @@ -58,7 +58,7 @@ namespace FreeSql.Tests.Custom.MySql [Fact] public void QueryMultipline() { - Assert.Throws(() => g.mysql.Ado.Query("select * from song; select * from song; select * from song")); + g.mysql.Ado.Query("select * from song; select * from song; select * from song"); } class xxx diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Custom/PostgreSQL/Curd/OnConflictDoUpdateTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Custom/PostgreSQL/Curd/OnConflictDoUpdateTest.cs index c24a1f41..aa839142 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Custom/PostgreSQL/Curd/OnConflictDoUpdateTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Custom/PostgreSQL/Curd/OnConflictDoUpdateTest.cs @@ -59,10 +59,7 @@ ON CONFLICT(""id"") DO UPDATE SET Assert.Equal(@"INSERT INTO ""testonconflictdoupdateinfo""(""id"", ""title"") VALUES(200, 'title-200'), (201, 'title-201'), (202, 'title-202') ON CONFLICT(""id"") DO UPDATE SET ""title"" = EXCLUDED.""title"", -""time"" = CASE EXCLUDED.""id"" -WHEN 200 THEN '2000-01-01 00:00:00.000000' -WHEN 201 THEN '2000-01-01 00:00:00.000000' -WHEN 202 THEN '2000-01-01 00:00:00.000000' END::timestamp", odku2.ToSql()); +""time"" = '2000-01-01 00:00:00.000000'", odku2.ToSql()); odku2.ExecuteAffrows(); @@ -80,10 +77,7 @@ ON CONFLICT(""id"") DO UPDATE SET }).IgnoreColumns(a => a.time).NoneParameter().InsertIdentity()).IgnoreColumns(a => a.title); Assert.Equal(@"INSERT INTO ""testonconflictdoupdateinfo""(""id"", ""title"") VALUES(200, 'title-200'), (201, 'title-201'), (202, 'title-202') ON CONFLICT(""id"") DO UPDATE SET -""time"" = CASE EXCLUDED.""id"" -WHEN 200 THEN '2000-01-01 00:00:00.000000' -WHEN 201 THEN '2000-01-01 00:00:00.000000' -WHEN 202 THEN '2000-01-01 00:00:00.000000' END::timestamp", odku2.ToSql()); +""time"" = '2000-01-01 00:00:00.000000'", odku2.ToSql()); odku2.ExecuteAffrows(); } @@ -106,10 +100,7 @@ ON CONFLICT(""id"") DO UPDATE SET Assert.Equal(@"INSERT INTO ""testonconflictdoupdateinfo""(""id"", ""title"") VALUES(300, 'title-300'), (301, 'title-301'), (302, 'title-302') ON CONFLICT(""id"") DO UPDATE SET ""title"" = EXCLUDED.""title"", -""time"" = CASE EXCLUDED.""id"" -WHEN 300 THEN '2000-01-01 00:00:00.000000' -WHEN 301 THEN '2000-01-01 00:00:00.000000' -WHEN 302 THEN '2000-01-01 00:00:00.000000' END::timestamp", odku2.ToSql()); +""time"" = '2000-01-01 00:00:00.000000'", odku2.ToSql()); odku2.ExecuteAffrows(); @@ -127,10 +118,7 @@ ON CONFLICT(""id"") DO UPDATE SET }).InsertColumns(a => a.title).NoneParameter().InsertIdentity()).UpdateColumns(a => a.time); Assert.Equal(@"INSERT INTO ""testonconflictdoupdateinfo""(""id"", ""title"") VALUES(300, 'title-300'), (301, 'title-301'), (302, 'title-302') ON CONFLICT(""id"") DO UPDATE SET -""time"" = CASE EXCLUDED.""id"" -WHEN 300 THEN '2000-01-01 00:00:00.000000' -WHEN 301 THEN '2000-01-01 00:00:00.000000' -WHEN 302 THEN '2000-01-01 00:00:00.000000' END::timestamp", odku2.ToSql()); +""time"" = '2000-01-01 00:00:00.000000'", odku2.ToSql()); odku2.ExecuteAffrows(); } diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/OnDuplicateKeyUpdateTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/OnDuplicateKeyUpdateTest.cs index e3fa639d..9b1989e1 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/OnDuplicateKeyUpdateTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/OnDuplicateKeyUpdateTest.cs @@ -1,4 +1,4 @@ -using FreeSql.DataAnnotations; +using FreeSql.DataAnnotations; using System; using System.Collections.Generic; using System.Linq; @@ -58,10 +58,7 @@ ON DUPLICATE KEY UPDATE Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(200, 'title-200'), (201, 'title-201'), (202, 'title-202') ON DUPLICATE KEY UPDATE `title` = VALUES(`title`), -`time` = CASE `id` -WHEN 200 THEN '2000-01-01 00:00:00.000' -WHEN 201 THEN '2000-01-01 00:00:00.000' -WHEN 202 THEN '2000-01-01 00:00:00.000' END", odku2.ToSql()); +`time` = '2000-01-01 00:00:00.000'", odku2.ToSql()); odku2.ExecuteAffrows(); @@ -79,10 +76,7 @@ ON DUPLICATE KEY UPDATE }).IgnoreColumns(a => a.time).NoneParameter().OnDuplicateKeyUpdate().IgnoreColumns(a => a.title); Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(200, 'title-200'), (201, 'title-201'), (202, 'title-202') ON DUPLICATE KEY UPDATE -`time` = CASE `id` -WHEN 200 THEN '2000-01-01 00:00:00.000' -WHEN 201 THEN '2000-01-01 00:00:00.000' -WHEN 202 THEN '2000-01-01 00:00:00.000' END", odku2.ToSql()); +`time` = '2000-01-01 00:00:00.000'", odku2.ToSql()); odku2.ExecuteAffrows(); } @@ -105,10 +99,7 @@ ON DUPLICATE KEY UPDATE Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(300, 'title-300'), (301, 'title-301'), (302, 'title-302') ON DUPLICATE KEY UPDATE `title` = VALUES(`title`), -`time` = CASE `id` -WHEN 300 THEN '2000-01-01 00:00:00.000' -WHEN 301 THEN '2000-01-01 00:00:00.000' -WHEN 302 THEN '2000-01-01 00:00:00.000' END", odku2.ToSql()); +`time` = '2000-01-01 00:00:00.000'", odku2.ToSql()); odku2.ExecuteAffrows(); @@ -126,10 +117,7 @@ ON DUPLICATE KEY UPDATE }).InsertColumns(a => a.title).NoneParameter().OnDuplicateKeyUpdate().UpdateColumns(a => a.time); Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(300, 'title-300'), (301, 'title-301'), (302, 'title-302') ON DUPLICATE KEY UPDATE -`time` = CASE `id` -WHEN 300 THEN '2000-01-01 00:00:00.000' -WHEN 301 THEN '2000-01-01 00:00:00.000' -WHEN 302 THEN '2000-01-01 00:00:00.000' END", odku2.ToSql()); +`time` = '2000-01-01 00:00:00.000'", odku2.ToSql()); odku2.ExecuteAffrows(); } diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/Curd/OnDuplicateKeyUpdateTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/Curd/OnDuplicateKeyUpdateTest.cs index 9cbad1ed..9b38b074 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/Curd/OnDuplicateKeyUpdateTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/Curd/OnDuplicateKeyUpdateTest.cs @@ -1,4 +1,4 @@ -using FreeSql.DataAnnotations; +using FreeSql.DataAnnotations; using FreeSql.Odbc.MySql; using System; using System.Collections.Generic; @@ -59,10 +59,7 @@ ON DUPLICATE KEY UPDATE Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(200, 'title-200'), (201, 'title-201'), (202, 'title-202') ON DUPLICATE KEY UPDATE `title` = VALUES(`title`), -`time` = CASE `id` -WHEN 200 THEN '2000-01-01 00:00:00.000' -WHEN 201 THEN '2000-01-01 00:00:00.000' -WHEN 202 THEN '2000-01-01 00:00:00.000' END", odku2.ToSql()); +`time` = '2000-01-01 00:00:00.000'", odku2.ToSql()); odku2.ExecuteAffrows(); @@ -80,10 +77,7 @@ ON DUPLICATE KEY UPDATE }).IgnoreColumns(a => a.time).NoneParameter().InsertIdentity()).IgnoreColumns(a => a.title); Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(200, 'title-200'), (201, 'title-201'), (202, 'title-202') ON DUPLICATE KEY UPDATE -`time` = CASE `id` -WHEN 200 THEN '2000-01-01 00:00:00.000' -WHEN 201 THEN '2000-01-01 00:00:00.000' -WHEN 202 THEN '2000-01-01 00:00:00.000' END", odku2.ToSql()); +`time` = '2000-01-01 00:00:00.000'", odku2.ToSql()); odku2.ExecuteAffrows(); } @@ -106,10 +100,7 @@ ON DUPLICATE KEY UPDATE Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(300, 'title-300'), (301, 'title-301'), (302, 'title-302') ON DUPLICATE KEY UPDATE `title` = VALUES(`title`), -`time` = CASE `id` -WHEN 300 THEN '2000-01-01 00:00:00.000' -WHEN 301 THEN '2000-01-01 00:00:00.000' -WHEN 302 THEN '2000-01-01 00:00:00.000' END", odku2.ToSql()); +`time` = '2000-01-01 00:00:00.000'", odku2.ToSql()); odku2.ExecuteAffrows(); @@ -127,10 +118,7 @@ ON DUPLICATE KEY UPDATE }).InsertColumns(a => a.title).NoneParameter().InsertIdentity()).UpdateColumns(a => a.time); Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(300, 'title-300'), (301, 'title-301'), (302, 'title-302') ON DUPLICATE KEY UPDATE -`time` = CASE `id` -WHEN 300 THEN '2000-01-01 00:00:00.000' -WHEN 301 THEN '2000-01-01 00:00:00.000' -WHEN 302 THEN '2000-01-01 00:00:00.000' END", odku2.ToSql()); +`time` = '2000-01-01 00:00:00.000'", odku2.ToSql()); odku2.ExecuteAffrows(); } diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/Curd/OnConflictDoUpdateTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/Curd/OnConflictDoUpdateTest.cs index 9ce29662..4b504c4e 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/Curd/OnConflictDoUpdateTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/Curd/OnConflictDoUpdateTest.cs @@ -1,4 +1,4 @@ -using FreeSql.DataAnnotations; +using FreeSql.DataAnnotations; using FreeSql.Odbc.PostgreSQL; using System; using System.Collections.Generic; @@ -59,10 +59,7 @@ ON CONFLICT(""id"") DO UPDATE SET Assert.Equal(@"INSERT INTO ""testonconflictdoupdateinfo""(""id"", ""title"") VALUES(200, 'title-200'), (201, 'title-201'), (202, 'title-202') ON CONFLICT(""id"") DO UPDATE SET ""title"" = EXCLUDED.""title"", -""time"" = CASE EXCLUDED.""id"" -WHEN 200 THEN '2000-01-01 00:00:00.000000' -WHEN 201 THEN '2000-01-01 00:00:00.000000' -WHEN 202 THEN '2000-01-01 00:00:00.000000' END::timestamp", odku2.ToSql()); +""time"" = '2000-01-01 00:00:00.000000'", odku2.ToSql()); odku2.ExecuteAffrows(); @@ -80,10 +77,7 @@ ON CONFLICT(""id"") DO UPDATE SET }).IgnoreColumns(a => a.time).NoneParameter().InsertIdentity()).IgnoreColumns(a => a.title); Assert.Equal(@"INSERT INTO ""testonconflictdoupdateinfo""(""id"", ""title"") VALUES(200, 'title-200'), (201, 'title-201'), (202, 'title-202') ON CONFLICT(""id"") DO UPDATE SET -""time"" = CASE EXCLUDED.""id"" -WHEN 200 THEN '2000-01-01 00:00:00.000000' -WHEN 201 THEN '2000-01-01 00:00:00.000000' -WHEN 202 THEN '2000-01-01 00:00:00.000000' END::timestamp", odku2.ToSql()); +""time"" = '2000-01-01 00:00:00.000000'", odku2.ToSql()); odku2.ExecuteAffrows(); } @@ -106,10 +100,7 @@ ON CONFLICT(""id"") DO UPDATE SET Assert.Equal(@"INSERT INTO ""testonconflictdoupdateinfo""(""id"", ""title"") VALUES(300, 'title-300'), (301, 'title-301'), (302, 'title-302') ON CONFLICT(""id"") DO UPDATE SET ""title"" = EXCLUDED.""title"", -""time"" = CASE EXCLUDED.""id"" -WHEN 300 THEN '2000-01-01 00:00:00.000000' -WHEN 301 THEN '2000-01-01 00:00:00.000000' -WHEN 302 THEN '2000-01-01 00:00:00.000000' END::timestamp", odku2.ToSql()); +""time"" = '2000-01-01 00:00:00.000000'", odku2.ToSql()); odku2.ExecuteAffrows(); @@ -127,10 +118,7 @@ ON CONFLICT(""id"") DO UPDATE SET }).InsertColumns(a => a.title).NoneParameter().InsertIdentity()).UpdateColumns(a => a.time); Assert.Equal(@"INSERT INTO ""testonconflictdoupdateinfo""(""id"", ""title"") VALUES(300, 'title-300'), (301, 'title-301'), (302, 'title-302') ON CONFLICT(""id"") DO UPDATE SET -""time"" = CASE EXCLUDED.""id"" -WHEN 300 THEN '2000-01-01 00:00:00.000000' -WHEN 301 THEN '2000-01-01 00:00:00.000000' -WHEN 302 THEN '2000-01-01 00:00:00.000000' END::timestamp", odku2.ToSql()); +""time"" = '2000-01-01 00:00:00.000000'", odku2.ToSql()); odku2.ExecuteAffrows(); } diff --git a/FreeSql.Tests/FreeSql.Tests/MySql/Curd/OnDuplicateKeyUpdateTest.cs b/FreeSql.Tests/FreeSql.Tests/MySql/Curd/OnDuplicateKeyUpdateTest.cs index 8edb9f1c..71b2de94 100644 --- a/FreeSql.Tests/FreeSql.Tests/MySql/Curd/OnDuplicateKeyUpdateTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/MySql/Curd/OnDuplicateKeyUpdateTest.cs @@ -1,4 +1,4 @@ -using FreeSql.DataAnnotations; +using FreeSql.DataAnnotations; using System; using System.Collections.Generic; using System.Linq; @@ -58,10 +58,7 @@ ON DUPLICATE KEY UPDATE Assert.Equal(odku2.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(200, 'title-200'), (201, 'title-201'), (202, 'title-202') ON DUPLICATE KEY UPDATE `title` = VALUES(`title`), -`time` = CASE `id` -WHEN 200 THEN '2000-01-01 00:00:00.000' -WHEN 201 THEN '2000-01-01 00:00:00.000' -WHEN 202 THEN '2000-01-01 00:00:00.000' END"); +`time` = '2000-01-01 00:00:00.000'"); odku2.ExecuteAffrows(); @@ -79,10 +76,7 @@ ON DUPLICATE KEY UPDATE }).IgnoreColumns(a => a.time).NoneParameter().OnDuplicateKeyUpdate().IgnoreColumns(a => a.title); Assert.Equal(odku2.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(200, 'title-200'), (201, 'title-201'), (202, 'title-202') ON DUPLICATE KEY UPDATE -`time` = CASE `id` -WHEN 200 THEN '2000-01-01 00:00:00.000' -WHEN 201 THEN '2000-01-01 00:00:00.000' -WHEN 202 THEN '2000-01-01 00:00:00.000' END"); +`time` = '2000-01-01 00:00:00.000'"); odku2.ExecuteAffrows(); } @@ -105,10 +99,7 @@ ON DUPLICATE KEY UPDATE Assert.Equal(odku2.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(300, 'title-300'), (301, 'title-301'), (302, 'title-302') ON DUPLICATE KEY UPDATE `title` = VALUES(`title`), -`time` = CASE `id` -WHEN 300 THEN '2000-01-01 00:00:00.000' -WHEN 301 THEN '2000-01-01 00:00:00.000' -WHEN 302 THEN '2000-01-01 00:00:00.000' END"); +`time` = '2000-01-01 00:00:00.000'"); odku2.ExecuteAffrows(); @@ -126,10 +117,7 @@ ON DUPLICATE KEY UPDATE }).InsertColumns(a => a.title).NoneParameter().OnDuplicateKeyUpdate().UpdateColumns(a => a.time); Assert.Equal(odku2.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(300, 'title-300'), (301, 'title-301'), (302, 'title-302') ON DUPLICATE KEY UPDATE -`time` = CASE `id` -WHEN 300 THEN '2000-01-01 00:00:00.000' -WHEN 301 THEN '2000-01-01 00:00:00.000' -WHEN 302 THEN '2000-01-01 00:00:00.000' END"); +`time` = '2000-01-01 00:00:00.000'"); odku2.ExecuteAffrows(); } diff --git a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/OnConflictDoUpdateTest.cs b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/OnConflictDoUpdateTest.cs index 098d29b8..7aa4518a 100644 --- a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/OnConflictDoUpdateTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/OnConflictDoUpdateTest.cs @@ -120,12 +120,7 @@ ON CONFLICT(""name"") DO UPDATE SET ON CONFLICT(""name"") DO UPDATE SET ""name"" = EXCLUDED.""name"", ""desc"" = EXCLUDED.""desc"", -""modified_id"" = CASE EXCLUDED.""name"" -WHEN 'Name1' THEN 1 -WHEN 'Name2' THEN 1 -WHEN 'Name3' THEN 1 -WHEN 'Name4' THEN 1 -WHEN 'Name5' THEN 1 END::int4, +""modified_id"" = 1, ""modified_time"" = current_timestamp", sql); //sql = g.pgsql.Insert(data) @@ -178,10 +173,7 @@ ON CONFLICT(""id"") DO UPDATE SET Assert.Equal(odku2.ToSql(), @"INSERT INTO ""testonconflictdoupdateinfo""(""id"", ""title"") VALUES(200, 'title-200'), (201, 'title-201'), (202, 'title-202') ON CONFLICT(""id"") DO UPDATE SET ""title"" = EXCLUDED.""title"", -""time"" = CASE EXCLUDED.""id"" -WHEN 200 THEN '2000-01-01 00:00:00.000000' -WHEN 201 THEN '2000-01-01 00:00:00.000000' -WHEN 202 THEN '2000-01-01 00:00:00.000000' END::timestamp"); +""time"" = '2000-01-01 00:00:00.000000'"); odku2.ExecuteAffrows(); @@ -199,10 +191,7 @@ ON CONFLICT(""id"") DO UPDATE SET }).IgnoreColumns(a => a.time).NoneParameter().OnConflictDoUpdate().IgnoreColumns(a => a.title); Assert.Equal(odku2.ToSql(), @"INSERT INTO ""testonconflictdoupdateinfo""(""id"", ""title"") VALUES(200, 'title-200'), (201, 'title-201'), (202, 'title-202') ON CONFLICT(""id"") DO UPDATE SET -""time"" = CASE EXCLUDED.""id"" -WHEN 200 THEN '2000-01-01 00:00:00.000000' -WHEN 201 THEN '2000-01-01 00:00:00.000000' -WHEN 202 THEN '2000-01-01 00:00:00.000000' END::timestamp"); +""time"" = '2000-01-01 00:00:00.000000'"); odku2.ExecuteAffrows(); } @@ -225,10 +214,7 @@ ON CONFLICT(""id"") DO UPDATE SET Assert.Equal(odku2.ToSql(), @"INSERT INTO ""testonconflictdoupdateinfo""(""id"", ""title"") VALUES(300, 'title-300'), (301, 'title-301'), (302, 'title-302') ON CONFLICT(""id"") DO UPDATE SET ""title"" = EXCLUDED.""title"", -""time"" = CASE EXCLUDED.""id"" -WHEN 300 THEN '2000-01-01 00:00:00.000000' -WHEN 301 THEN '2000-01-01 00:00:00.000000' -WHEN 302 THEN '2000-01-01 00:00:00.000000' END::timestamp"); +""time"" = '2000-01-01 00:00:00.000000'"); odku2.ExecuteAffrows(); @@ -246,10 +232,7 @@ ON CONFLICT(""id"") DO UPDATE SET }).InsertColumns(a => a.title).NoneParameter().OnConflictDoUpdate().UpdateColumns(a => a.time); Assert.Equal(odku2.ToSql(), @"INSERT INTO ""testonconflictdoupdateinfo""(""id"", ""title"") VALUES(300, 'title-300'), (301, 'title-301'), (302, 'title-302') ON CONFLICT(""id"") DO UPDATE SET -""time"" = CASE EXCLUDED.""id"" -WHEN 300 THEN '2000-01-01 00:00:00.000000' -WHEN 301 THEN '2000-01-01 00:00:00.000000' -WHEN 302 THEN '2000-01-01 00:00:00.000000' END::timestamp"); +""time"" = '2000-01-01 00:00:00.000000'"); odku2.ExecuteAffrows(); } diff --git a/FreeSql/Internal/CommonProvider/UpdateProvider.cs b/FreeSql/Internal/CommonProvider/UpdateProvider.cs index 3ed7697e..431664d2 100644 --- a/FreeSql/Internal/CommonProvider/UpdateProvider.cs +++ b/FreeSql/Internal/CommonProvider/UpdateProvider.cs @@ -846,7 +846,9 @@ namespace FreeSql.Internal.CommonProvider var sb = new StringBuilder(); sb.Append(_commonUtils.QuoteSqlName(col.Attribute.Name)).Append(" = "); - var nulls = 0; + string valsqlOld = null; + var valsqlOldStats = 1; //start 1 + var nullStats = 0; var cwsb = new StringBuilder().Append(cw); foreach (var d in _source) { @@ -854,11 +856,15 @@ namespace FreeSql.Internal.CommonProvider ToSqlWhen(cwsb, _tempPrimarys, d); cwsb.Append(" THEN "); var val = col.GetDbValue(d); - cwsb.Append(thenValue(_commonUtils.RewriteColumn(col, _commonUtils.GetNoneParamaterSqlValue(_paramsSource, "u", col, col.Attribute.MapType, val)))); - if (val == null || val == DBNull.Value) nulls++; + var valsql = thenValue(_commonUtils.RewriteColumn(col, _commonUtils.GetNoneParamaterSqlValue(_paramsSource, "u", col, col.Attribute.MapType, val))); + cwsb.Append(valsql); + if (valsqlOld == null) valsqlOld = valsql; + else if (valsqlOld == valsql) valsqlOldStats++; + if (val == null || val == DBNull.Value) nullStats++; } cwsb.Append(" END"); - if (nulls == _source.Count) sb.Append("NULL"); + if (nullStats == _source.Count) sb.Append("NULL"); + else if (valsqlOldStats == _source.Count) sb.Append(valsqlOld); else sb.Append(cwsb); cwsb.Clear(); From 27990563ecd91a196113a5f2c27d06db7f6c3634 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Mon, 9 Jan 2023 12:04:05 +0800 Subject: [PATCH 7/8] =?UTF-8?q?-=20=E5=A2=9E=E5=8A=A0=20IAdo.ExecuteNonQue?= =?UTF-8?q?ry=20=E9=87=8D=E8=BD=BD=E6=96=B9=E6=B3=95=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql/Interface/IAdo.cs | 2 ++ .../CommonProvider/AdoProvider/AdoProvider.cs | 14 ++++++++------ .../AdoProvider/AdoProviderAsync.cs | 18 ++++++++++++------ 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/FreeSql/Interface/IAdo.cs b/FreeSql/Interface/IAdo.cs index 41a6a708..3434b309 100644 --- a/FreeSql/Interface/IAdo.cs +++ b/FreeSql/Interface/IAdo.cs @@ -173,6 +173,7 @@ namespace FreeSql int ExecuteNonQuery(CommandType cmdType, string cmdText, params DbParameter[] cmdParms); int ExecuteNonQuery(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms); int ExecuteNonQuery(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, int cmdTimeout, params DbParameter[] cmdParms); + int ExecuteNonQuery(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, int cmdTimeout, Action cmdAfterHandler, params DbParameter[] cmdParms); /// /// 在【主库】执行,ExecuteNonQuery("delete from user where age > @age", new { age = 25 }) /// 提示:parms 参数还可以传 Dictionary<string, object> @@ -381,6 +382,7 @@ namespace FreeSql Task ExecuteNonQueryAsync(CommandType cmdType, string cmdText, DbParameter[] cmdParms, CancellationToken cancellationToken = default); Task ExecuteNonQueryAsync(DbTransaction transaction, CommandType cmdType, string cmdText, DbParameter[] cmdParms, CancellationToken cancellationToken = default); Task ExecuteNonQueryAsync(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, int cmdTimeout, DbParameter[] cmdParms, CancellationToken cancellationToken = default); + Task ExecuteNonQueryAsync(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, int cmdTimeout, Func cmdAfterHandler, DbParameter[] cmdParms, CancellationToken cancellationToken = default); /// /// 在【主库】执行,ExecuteNonQueryAsync("delete from user where age > @age", new { age = 25 }) /// 提示:parms 参数还可以传 Dictionary<string, object> diff --git a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs index b6ed248c..a7544d1d 100644 --- a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs +++ b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs @@ -790,12 +790,13 @@ namespace FreeSql.Internal.CommonProvider }, cmdType, cmdText, cmdTimeout, cmdParms); return ret; } - public int ExecuteNonQuery(string cmdText, object parms = null) => ExecuteNonQuery(null, null, CommandType.Text, cmdText, 0, GetDbParamtersByObject(cmdText, parms)); - public int ExecuteNonQuery(DbTransaction transaction, string cmdText, object parms = null) => ExecuteNonQuery(null, transaction, CommandType.Text, cmdText, 0, GetDbParamtersByObject(cmdText, parms)); - public int ExecuteNonQuery(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null) => ExecuteNonQuery(connection, transaction, CommandType.Text, cmdText, 0, GetDbParamtersByObject(cmdText, parms)); - public int ExecuteNonQuery(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteNonQuery(null, null, cmdType, cmdText, 0, cmdParms); - public int ExecuteNonQuery(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteNonQuery(null, transaction, cmdType, cmdText, 0, cmdParms); - public int ExecuteNonQuery(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, int cmdTimeout, params DbParameter[] cmdParms) + public int ExecuteNonQuery(string cmdText, object parms = null) => ExecuteNonQuery(null, null, CommandType.Text, cmdText, 0, null, GetDbParamtersByObject(cmdText, parms)); + public int ExecuteNonQuery(DbTransaction transaction, string cmdText, object parms = null) => ExecuteNonQuery(null, transaction, CommandType.Text, cmdText, 0, null, GetDbParamtersByObject(cmdText, parms)); + public int ExecuteNonQuery(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null) => ExecuteNonQuery(connection, transaction, CommandType.Text, cmdText, 0, null, GetDbParamtersByObject(cmdText, parms)); + public int ExecuteNonQuery(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteNonQuery(null, null, cmdType, cmdText, 0, null, cmdParms); + public int ExecuteNonQuery(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteNonQuery(null, transaction, cmdType, cmdText, 0, null, cmdParms); + public int ExecuteNonQuery(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, int cmdTimeout, params DbParameter[] cmdParms) => ExecuteNonQuery(null, transaction, cmdType, cmdText, 0, null, cmdParms); + public int ExecuteNonQuery(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, int cmdTimeout, Action cmdAfterHandler, params DbParameter[] cmdParms) { if (string.IsNullOrEmpty(cmdText)) return 0; var dt = DateTime.Now; @@ -811,6 +812,7 @@ namespace FreeSql.Internal.CommonProvider { if (pc.cmd.Connection == null) pc.cmd.Connection = (conn = this.MasterPool.Get()).Value; val = pc.cmd.ExecuteNonQuery(); + cmdAfterHandler?.Invoke(pc.cmd); } } catch (Exception ex2) diff --git a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderAsync.cs b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderAsync.cs index 2a476453..29132117 100644 --- a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderAsync.cs +++ b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderAsync.cs @@ -709,12 +709,13 @@ namespace FreeSql.Internal.CommonProvider }, cmdType, cmdText, cmdTimeout, cmdParms, cancellationToken); return ret; } - public Task ExecuteNonQueryAsync(string cmdText, object parms = null, CancellationToken cancellationToken = default) => ExecuteNonQueryAsync(null, null, CommandType.Text, cmdText, 0, GetDbParamtersByObject(cmdText, parms), cancellationToken); - public Task ExecuteNonQueryAsync(DbTransaction transaction, string cmdText, object parms = null, CancellationToken cancellationToken = default) => ExecuteNonQueryAsync(null, transaction, CommandType.Text, cmdText, 0, GetDbParamtersByObject(cmdText, parms), cancellationToken); - public Task ExecuteNonQueryAsync(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null, CancellationToken cancellationToken = default) => ExecuteNonQueryAsync(connection, transaction, CommandType.Text, cmdText, 0, GetDbParamtersByObject(cmdText, parms), cancellationToken); - public Task ExecuteNonQueryAsync(CommandType cmdType, string cmdText, DbParameter[] cmdParms, CancellationToken cancellationToken = default) => ExecuteNonQueryAsync(null, null, cmdType, cmdText, 0, cmdParms, cancellationToken); - public Task ExecuteNonQueryAsync(DbTransaction transaction, CommandType cmdType, string cmdText, DbParameter[] cmdParms, CancellationToken cancellationToken = default) => ExecuteNonQueryAsync(null, transaction, cmdType, cmdText, 0, cmdParms, cancellationToken); - async public Task ExecuteNonQueryAsync(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, int cmdTimeout, DbParameter[] cmdParms, CancellationToken cancellationToken = default) + public Task ExecuteNonQueryAsync(string cmdText, object parms = null, CancellationToken cancellationToken = default) => ExecuteNonQueryAsync(null, null, CommandType.Text, cmdText, 0, null, GetDbParamtersByObject(cmdText, parms), cancellationToken); + public Task ExecuteNonQueryAsync(DbTransaction transaction, string cmdText, object parms = null, CancellationToken cancellationToken = default) => ExecuteNonQueryAsync(null, transaction, CommandType.Text, cmdText, 0, null, GetDbParamtersByObject(cmdText, parms), cancellationToken); + public Task ExecuteNonQueryAsync(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null, CancellationToken cancellationToken = default) => ExecuteNonQueryAsync(connection, transaction, CommandType.Text, cmdText, 0, null, GetDbParamtersByObject(cmdText, parms), cancellationToken); + public Task ExecuteNonQueryAsync(CommandType cmdType, string cmdText, DbParameter[] cmdParms, CancellationToken cancellationToken = default) => ExecuteNonQueryAsync(null, null, cmdType, cmdText, 0, null, cmdParms, cancellationToken); + public Task ExecuteNonQueryAsync(DbTransaction transaction, CommandType cmdType, string cmdText, DbParameter[] cmdParms, CancellationToken cancellationToken = default) => ExecuteNonQueryAsync(null, transaction, cmdType, cmdText, 0, null, cmdParms, cancellationToken); + public Task ExecuteNonQueryAsync(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, int cmdTimeout, DbParameter[] cmdParms, CancellationToken cancellationToken = default) => ExecuteNonQueryAsync(null, transaction, cmdType, cmdText, 0, null, cmdParms, cancellationToken); + async public Task ExecuteNonQueryAsync(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, int cmdTimeout, Func cmdAfterHandler, DbParameter[] cmdParms, CancellationToken cancellationToken = default) { if (string.IsNullOrEmpty(cmdText)) return 0; var dt = DateTime.Now; @@ -730,6 +731,11 @@ namespace FreeSql.Internal.CommonProvider { if (pc.cmd.Connection == null) pc.cmd.Connection = (conn = await this.MasterPool.GetAsync()).Value; val = await pc.cmd.ExecuteNonQueryAsync(cancellationToken); + if (cmdAfterHandler != null) + { + var afterTask = cmdAfterHandler(pc.cmd); + if (afterTask != null) await afterTask; + } } } catch (Exception ex2) From 32e45dd925af45e6843aa5cf52947c7bad987b6a Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Tue, 10 Jan 2023 16:43:31 +0800 Subject: [PATCH 8/8] update Donation --- README.md | 2 +- README.zh-CN.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 56d1d85f..a727c797 100644 --- a/README.md +++ b/README.md @@ -218,7 +218,7 @@ homejun, L*y 58元、花花 88元、麦兜很乖 50元、网络来者 2000元、John 99.99元、alex 666元、bacongao 36元、无名 100元、Eternity 188元、无名 10元、⌒.Helper~..oO 66元、习惯与被习惯 100元、无名 100元、蔡易喋 88.88元、中讯科技 1000元、Good Good Work 24元、炽焰 6.6元、Nothing 100元、兰州天擎赵 500元、哈利路亚 300元、 无名 100元、蛰伏 99.99元、TCYM 66.66元、MOTA 5元、LDZXG 30元、Near 30元、建爽 66元、无名 200元、LambertWu 100元、无名 18.88元、乌龙 50元、无名 100元、陳怼怼 66.66元、陳怼怼 66.66元、丁淮 100元、李伟坚-Excel催化剂 100元、白狐 6.66元、她微笑的脸y 30元、Eternity²º²¹ 588元、夜归柴门 88元、蔡易喋 666.66元、 -*礼 10元、litrpa 88元、Alax CHOW 200元、Daily 66元、k\*t 66元、蓝 100元、*菜 10元、生命如歌 1000元、山鸡 88元、平凡 100元、大树 1000元、软软的毛毛虫 66.66元、问卷星 2000元 +*礼 10元、litrpa 88元、Alax CHOW 200元、Daily 66元、k\*t 66元、蓝 100元、*菜 10元、生命如歌 1000元、山鸡 88元、平凡 100元、大树 1000元、软软的毛毛虫 66.66元、问卷星 2000元、与你无关 5000元 > Thank you for your donation diff --git a/README.zh-CN.md b/README.zh-CN.md index 541b3806..38c527f7 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -219,7 +219,7 @@ homejun, L\*y 58元、花花 88元、麦兜很乖 50元、网络来者 2000元、John 99.99元、alex 666元、bacongao 36元、无名 100元、Eternity 188元、无名 10元、⌒.Helper~..oO 66元、习惯与被习惯 100元、无名 100元、蔡易喋 88.88元、中讯科技 1000元、Good Good Work 24元、炽焰 6.6元、Nothing 100元、兰州天擎赵 500元、哈利路亚 300元、 无名 100元、蛰伏 99.99元、TCYM 66.66元、MOTA 5元、LDZXG 30元、Near 30元、建爽 66元、无名 200元、LambertWu 100元、无名 18.88元、乌龙 50元、无名 100元、陳怼怼 66.66元、陳怼怼 66.66元、丁淮 100元、李伟坚-Excel催化剂 100元、白狐 6.66元、她微笑的脸y 30元、Eternity²º²¹ 588元、夜归柴门 88元、蔡易喋 666.66元、 -*礼 10元、litrpa 88元、Alax CHOW 200元、Daily 66元、k*t 66元、蓝 100元、\*菜 10元、生命如歌 1000元、山鸡 88元、平凡 100元、大树 1000元、软软的毛毛虫 66.66元、问卷星 2000元 +*礼 10元、litrpa 88元、Alax CHOW 200元、Daily 66元、k*t 66元、蓝 100元、\*菜 10元、生命如歌 1000元、山鸡 88元、平凡 100元、大树 1000元、软软的毛毛虫 66.66元、问卷星 2000元、与你无关 5000元 > 超级感谢你的打赏。