hisql orm update表資料更新文件

tansar發表於2022-01-12

更新

HiSql資料更新

HiSql 提供了好幾種資料更新的方式下面一一介紹一下

如果你的表中增加了這四個欄位

欄位 描述 型別
CreateTime 建立時間 DateTime
CreateName 建立人 nvarchar
ModiTime 修改時間 DateTime
ModiName 修改人 nvarchar

那麼在向表插入資料時HiSql自動會對CreateTimeModiTime 賦上當前日期,給CreateNameModiName 賦上連線建立時指定的User的值 (可以將登陸的使用者名稱賦全它),不需要開發人員去賦值。

當更新該表時會自動更新ModiTimeModiName

指定主鍵更新

匿名類資料更新

用匿名類的方式用一個特別好的地方就是你要更新哪些欄位就寫上哪些欄位的值,
但要注意的是匿名內中如果要更新的表有主鍵那麼必須包含主鍵否則無法更新。

::: 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是主鍵,ModiTimeModiName 是自動加上去的

匿名類批量更新

通過該方式更新時是生成多條更新語句執行
特別注意:以下方式更新不需要帶更新條件,因為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 但該表有標準欄位同時也會更新ModiTimeModiName

生成的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 其它的值都會更新, 該表有標準欄位同時也會更新ModiTimeModiName

生成的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

相關文章