[ADO.NET] 如何使用 SqlDataAdapter (二)

[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的資料寫到實體資料庫中,這時還要呼叫DataTableAcceptChanges方法才能將RowState屬性設為Unchanged。

DataRowState 列舉型別如下:

2009-11-10 下午 12-36-44

11.而DataTableRejectChanges方法是將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語法

如下所示:資料庫仍是使用北風資料庫

2009-11-10 上午 09-28-55

接下來你可以在DataGridView對資料新增、刪除、修改動作後,使用SqlCommandBuilder 類別自動產生Update、Insert、DeleteSQL語法,再傳給SqlDataAdapter 類別InsertCommandDeleteCommandUpdateCommand屬性。

2009-11-10 上午 09-31-17

SqlCommandBuilder 類別到底產生了什麼東西呢?

2009-11-10 上午 09-38-51

由上述程式我們觀察到,密密麻麻的SQL語法,如果手動輸入下面那些,會起笑吧XD

2009-11-10 上午 09-41-13

SqlCommandBuilder 類別DataAdapter 屬性也是可以取得或設定SqlDataAdapter 類別InsertCommandDeleteCommandUpdateCommand屬性

2009-11-10 上午 09-43-49

 

結語:

優點:無腦建立SQL語法

缺點:只能針對單一表單產生SQL語法;若是用SQL join產生的資料表,則無法自動建立SQL語法。

14.萬一由SqlDataAdapter 類別自動建立出來的語法不是我們要的那該怎麼辦?這時就不能使用它了,就必須要自己定義SqlCommand 類別中的CommandText屬性,也就是自己寫SQL語法,為了SQL的安全性建議使用SqlParameter,可參考[ADO.NET] 為何 / 如何 使用 SQLParameter 物件

15.批次處理更新,若設定SqlDataAdapter 類別UpdateBatchSize 屬性,則表示要啟用批次更新以便減輕SERVER的負擔,不會更改一筆就會回SERVER處理,而是累積到一個量後再處理,用以降低網路流量。

2009-11-10 下午 01-03-22

使用UpdateBatchSize 時,必須要將UpdateCommand屬性的UpdateRowSource 設為None

2009-11-10 下午 01-09-44

註冊RowUpdating 事件RowUpdated 事件

2009-11-10 下午 02-45-24

假設UpdateBatchSize 設為5,則表示每五筆觸發一次RowUpdated事件,最後一次如不滿五筆也會觸發一次。

2009-11-10 下午 02-20-41

下圖中,我在DataGridView變更了三筆資料,按照批次更新後只觸發一次RowUpdated事件()

2009-11-10 下午 02-32-05

不會用.NET事件的人,請參考[VB.NET][C#.NET] Windows Form /控制項 事件 的 先後順序 / 事件方法覆寫

範例下載:

CS_DataAdapter(2).rar

VB_DataAdapter(2).rar

若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET

Image result for microsoft+mvp+logo