diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md
index 9184a937..30a7e670 100644
--- a/.github/ISSUE_TEMPLATE/bug-report.md
+++ b/.github/ISSUE_TEMPLATE/bug-report.md
@@ -11,24 +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? 及具体版本
-```
-```
\ No newline at end of file
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
+```
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.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 1f54becc..7aa4518a 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,120 @@ 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"" = 1,
+""modified_time"" = current_timestamp", sql);
+
+ //sql = g.pgsql.Insert(data)
+ // .NoneParameter()
+ // .OnConflictDoUpdate(a => new { a.Name })
+ // .UpdateColumns()
+ // .ToSql();
+ }
+
+
[Fact]
public void ExecuteAffrows()
{
@@ -58,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();
@@ -79,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();
}
@@ -105,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();
@@ -126,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/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/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)
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();
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.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.Dameng/FreeSql.Provider.Dameng.csproj b/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj
index 9e05f5db..29591b76 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/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.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.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.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/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)
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
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元
> 超级感谢你的打赏。