更新
HiSql資料更新
HiSql 提供了好幾種資料更新的方式下面一一介紹一下
如果你的表中增加了這四個欄位
欄位 | 描述 | 型別 |
---|---|---|
CreateTime |
建立時間 |
DateTime |
CreateName |
建立人 |
nvarchar |
ModiTime |
修改時間 |
DateTime |
ModiName |
修改人 |
nvarchar |
那麼在向表插入資料時HiSql自動會對CreateTime
和ModiTime
賦上當前日期,給CreateName
和ModiName
賦上連線建立時指定的User
的值 (可以將登陸的使用者名稱賦全它),不需要開發人員去賦值。
當更新該表時會自動更新ModiTime
和 ModiName
。
指定主鍵更新
匿名類資料更新
用匿名類的方式用一個特別好的地方就是你要更新哪些欄位就寫上哪些欄位的值,
但要注意的是匿名內中如果要更新的表有主鍵那麼必須包含主鍵否則無法更新。
::: tip
實體類的欄位列名稱要與資料庫中對應至少要一個欄位要對應不然HiSql將會丟擲異常
HiSql允許更新物件列集合大於資料庫中的列集合(只取有效的欄位)
欄位名稱忽略大小寫
:::
特別注意:以下方式更新不需要帶更新條件,因為HiSql會自動識別主鍵條件
sqlClient.Update("HTest01", new { sid = 123456, UName = "tansar", Age = 25, Salary = 1999.9, Descript = "hello world" }).ExecCommand();
HTest01
中有上面講到的四個標準欄位,雖然沒有設定修改日期和修改人 但HiSql底層會自動生成,請看以下生成的SQL程式碼(SQLSERVER為例)
update [dbo].[HTest01] set [SID]=123456,[UName]='tansar',[Age]=25,[Salary]=1999.9,[Descript]='hello world',[ModiTime]='2022-01-11 20:04:51.725',[ModiName]='Hone' where [SID]=123456
也許一看以上生成的SQL就明白了HiSql的解析原理了欄位SID
是主鍵,ModiTime
和ModiName
是自動加上去的
匿名類批量更新
通過該方式更新時是生成多條更新語句執行
特別注意:以下方式更新不需要帶更新條件,因為HiSql會自動識別主鍵條件
List<object> lstdata = new List<object>()
{
new{ sid =123456, UName ="tansar", Age =25, Salary =1999.9, Descript ="hello world"},
new{ sid =123457, UName ="tansar2", Age =25, Salary =1999.9, Descript ="hello world"}
};
int v=sqlClient.Update("HTest01", lstdata).ExecCommand();
更新指定欄位
指定更新欄位可以用方法Only(params string[] fields)
如果有多個字估請引數Only("UName","Descript")
sqlClient.Update("HTest01", new { sid = 123456, UName = "tansar", Age = 25, Salary = 1999.9, Descript = "測試只更新此欄位" }).Only("Descript").ExecCommand();
根據以上程式碼只會更新欄位 Descript
但該表有標準欄位同時也會更新ModiTime
和ModiName
生成的SQL如下(sqlserver為例)
update [dbo].[HTest01] set [Descript]='測試只更新此欄位',[ModiTime]='2022-01-12 14:13:40.438',[ModiName]='Hone' where [SID]=123456
排除更新欄位
指定排除更新欄位可以用方法Exclude(params string[] fields)
如果有多個字估請引數Exclude("UName","Descript")
sqlClient.Update("HTest01", new { sid = 123456, UName = "tansar", Age = 25, Salary = 1999.9, Descript = "測試只不更新此欄位" }).Exclude("Descript").ExecCommand();
根據以上程式碼除了欄位 Descript
其它的值都會更新, 該表有標準欄位同時也會更新ModiTime
和ModiName
生成的SQL如下(sqlserver為例)
update [dbo].[HTest01] set [UName]='tansar',[Age]=25,[Salary]=1999.9,[ModiTime]='2022-01-12 14:24:08.624',[ModiName]='Hone' where [SID]=123456
字典更新
字典可以是new Dictionary<string, object>
也可以是new Dictionary<string, string>
var dicobj = new Dictionary<string, object> { { "SID", 123456 }, { "UName", "tansar" }, { "Age", 25 }, { "Salary", 1999.9 }, { "descript", "hello world" } };
sqlClient.Update("HTest01", dicobj).ExecCommand();
生成的SQL如下(sqlserver為例)
update [dbo].[HTest01] set [SID]=123456,[UName]='tansar',[Age]=25,[Salary]=1999.9 where [SID]=123456
批量字典更新
批量字典更新其實與批量匿名類更新使用方式基本一致的
List<Dictionary<string, object>> lstdata = new List<Dictionary<string, object>> {
new Dictionary<string, object> { { "SID", 123456 }, { "UName", "tansar" }, { "Age", 25 }, { "Salary", 1999.9 }, { "descript", "hello world" } },
new Dictionary<string, object> { { "SID", 123457 }, { "UName", "tansar" }, { "Age", 25 }, { "Salary", 1999.9 }, { "descript", "hello world" } }
};
sqlClient.Update("HTest01", lstdata).ExecCommand();
::: tip
實體類的更新與匿名類基本是一致的,這裡就不重複寫了,排除更新和指定更新與匿名類的寫法是一模一樣也不再重複寫樣例
:::
按條件更新
通過結構化WHERE更新
關於where 的寫法更多的樣例請參照hisql ORM 查詢語句使用教程文件
int v= sqlClient.Update("HTest01").Set(new { UName = "TEST" }).Where(new Filter { { "SID", OperType.EQ, 123456 } }).ExecCommand();
生的成SQL語句如下(sqlserver為例)
update [dbo].[HTest01] set [UName]='TEST',[ModiTime]='2022-01-12 15:10:28.184',[ModiName]='tansar' where [HTest01].[SID] = 123456
通過HiSql語法更新
關於HiSql 的寫法更多的樣例請參照 hisql ORM 查詢語句使用教程文件
int v = sqlClient.Update("HTest01").Set(new { UName = "TEST" }).Where("SID=123456").ExecCommand();
生的成SQL語句如下(sqlserver為例)
update [dbo].[HTest01] set [UName]='TEST',[ModiTime]='2022-01-12 15:15:04.695',[ModiName]='tansar' where [HTest01].[SID] = 123456
欄位表示式
平常業務可能會有這種場景將資料庫中的某一個欄位自長1或加一個指定的值如下例所示
int v = sqlClient.Update("HTest01", new { SID = 123456, Salary = "`Salary`+1" }).ExecCommand();
生的成SQL語句如下(sqlserver為例)
update [dbo].[HTest01] set [SID]=123456,[Salary]=[Salary]+1,[ModiTime]='2022-01-12 15:23:48.626',[ModiName]='Hone' where [SID]=123456