[ADO.NET] 如何使用 SqlDataAdapter (二)
續上篇 [ADO.NET] 如何使用 DataAdapter (一)
9.使用SqlDataAdapter 類別更新資料,可參考以 DataAdapter 更新資料來源 (ADO.NET),使用Update 方法從名為 "Table" 之 DataTable 的指定 DataSet 中,為每個插入、更新或刪除的資料列分別呼叫 INSERT、UPDATE 或 DELETE 陳述式。(預設的資料表名稱叫Table)。所以Update方法會將DataTable的資料(你操作的DataGridView就是DataTable)寫到實體的資料庫中。請參考[ADO.NET] 何謂 RowState
10.使用SqlDataAdapter 類別的Update方法後便能將DataTable的資料寫到實體資料庫中,這時還要呼叫DataTable的AcceptChanges方法才能將RowState屬性設為Unchanged。
11.而DataTable的RejectChanges方法是將DataTable復原,(MSDN:復原從資料表載入以來,或前一次呼叫 AcceptChanges 以來,對該資料表所做的所有變更) 也就是可以復原還沒有呼叫AcceptChanges方法之前的資料,反之則不能復原。
12.SqlDataAdapter 類別的AcceptChangesDuringUpdate屬性,表示在呼叫Update方法後,會自動幫你呼叫AcceptChanges方法,預設為true
13.使用SqlCommandBuilder 類別
SqlDataAdapter 類別可以搭配SqlCommandBuilder 類別自動產生出SQL語法,如下所述:
刪除:GetDeleteCommand
插入:GetInsertCommand
更新:GetUpdateCommand
用法如下:
13-1.建立SqlConnection連線
13-2.建立SqlCommand類別
13-3.建立SqlDataAdapter類別
13-4.建立SqlCommandBuilder類別
13-5.建立DataSet類別或DataTable類別
13-6.使用Fill方法填入DataTable
13-6.自動產生SQL語法
如下所示:資料庫仍是使用北風資料庫
接下來你可以在DataGridView對資料新增、刪除、修改動作後,使用SqlCommandBuilder 類別自動產生Update、Insert、DeleteSQL語法,再傳給SqlDataAdapter 類別的InsertCommand、DeleteCommand、UpdateCommand屬性。
SqlCommandBuilder 類別到底產生了什麼東西呢?
由上述程式我們觀察到,密密麻麻的SQL語法,如果手動輸入下面那些,會起笑吧XD
而SqlCommandBuilder 類別的DataAdapter 屬性也是可以取得或設定SqlDataAdapter 類別的InsertCommand、DeleteCommand、UpdateCommand屬性
結語:
優點:無腦建立SQL語法
缺點:只能針對單一表單產生SQL語法;若是用SQL join產生的資料表,則無法自動建立SQL語法。
14.萬一由SqlDataAdapter 類別自動建立出來的語法不是我們要的那該怎麼辦?這時就不能使用它了,就必須要自己定義SqlCommand 類別中的CommandText屬性,也就是自己寫SQL語法,為了SQL的安全性建議使用SqlParameter,可參考[ADO.NET] 為何 / 如何 使用 SQLParameter 物件。
15.批次處理更新,若設定SqlDataAdapter 類別的UpdateBatchSize 屬性,則表示要啟用批次更新以便減輕SERVER的負擔,不會更改一筆就會回SERVER處理,而是累積到一個量後再處理,用以降低網路流量。
使用UpdateBatchSize 時,必須要將UpdateCommand屬性的UpdateRowSource 設為None
註冊RowUpdating 事件與RowUpdated 事件
假設UpdateBatchSize 設為5,則表示每五筆觸發一次RowUpdated事件,最後一次如不滿五筆也會觸發一次。
下圖中,我在DataGridView變更了三筆資料,按照批次更新後只觸發一次RowUpdated事件()
不會用.NET事件的人,請參考[VB.NET][C#.NET] Windows Form /控制項 事件 的 先後順序 / 事件方法覆寫
範例下載:
若有謬誤,煩請告知,新手發帖請多包涵
Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET