部落格觀察

聯絡我

Software

最新回應

續上篇 [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

分享

新手發帖請多包涵



回應

  • mis2000lab 2009/11/10 下午 03:45 回覆

    # re: [ADO.NET] 如何使用 DataAdapter (二)

    原則上,不建議「使用SqlCommandBuilder 類別」,
    他似乎只能對應單一資料表來產生SQL指令,而且效能不彰。

    其實 DataSet + DataAdapter並沒有微軟MSDN文件講得這麼複雜啦。真的這麼難寫的話,我也不可能去學他、用他了 :-P

    不要看這個SqlCommandBuilder類別,反倒比較好學。

  • 余小章 2009/11/10 下午 04:01 回覆

    # re: [ADO.NET] 如何使用 DataAdapter (二)

    to mis2000lab :

    效能好不好我就沒有比較了,會不好的原因可能是因為它會對所有的攔位,進行處理之。

  • jeff-yeh 2009/11/11 下午 02:10 回覆

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

    to 余小章 :

    之前在MSDN有看到為什麼CommandBuilder的效能會不好,這段或許能讓你知道原因.

    Do Not Use CommandBuilder at Run Time

    CommandBuilder objects such as SqlCommandBuilder and OleDbCommandBuilder automatically generate the InsertCommand, UpdateCommand, and DeleteCommand properties of a DataAdapter. The CommandBuilder objects generate these properties based on the SelectCommand property of the DataAdapter. CommandBuilder objects are useful when you are designing and prototyping your application. However, you should not use them in production applications. The processing required to generate the commands affects performance. Manually create stored procedures for your commands, or use the Visual Studio® .NET design-time wizard and customize them later if necessary.

  • yc421206 2009/11/11 下午 05:19 回覆

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

    to jeff-yeh :

    它也是叫我們不要用,說會影果響效能,有不要用的証據嗎??

  • regionbbs 2009/11/11 下午 05:38 回覆

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

    你也輸出過 CommandBuilder 產生的 SQL 指令,像是 UPDATE 和 DELETE 指令,你覺得只比對主 Key 比較快,還是比全部的欄位資料比較快?

  • yc421206 2009/11/11 下午 08:19 回覆

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

    to regionbbs :

    當然主要欄位比全部欄位快,小弟一開始就猜"會不好的原因可能是因為它會對所有的攔位,進行處理之"。

  • HB 2009/11/15 下午 05:39 回覆

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

    請問一下
    連接SQL沒問題,但更改為OledDB連接Access時,無法成功,可否協助解決?
    謝謝!

  • yc421206 2009/11/15 下午 10:56 回覆

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

    to HB :

    什麼問題,請詳述~"~

  • Nobel12 (軋延油) 2009/11/17 上午 09:11 回覆

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

    To HB

    我在猜是不是把原本的 SqlXXXXXXX 的 Sql 改成相對應於 OleDB 的物件類別來使用啊?!

    ex: OledbXXXXX 

    ※希望我猜的是對的~~><

  • HB 2009/11/17 下午 12:27 回覆

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

    你好,
    我是把它改為OledbXXXX來使用,但是出現『不會傳回任何重要資料行資訊的 SelectCommand 不支援 UpdateCommand 動態 SQL 的產生』的錯誤訊息。
    錯誤的位置,停留在這一行:
    Da.UpdateCommand = Cb.GetUpdateCommand

  • billchung 2009/11/17 下午 01:09 回覆

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

    To HB: 通常我們是沒有習慣用自動產生Command,因為自動產生會有一些不仔細就沒法發現的問題, 所以UpdateCommand的SQL String可能要自己撰寫內容會好一些

     

  • 余小章 2009/11/18 上午 10:54 回覆

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

    to HB :

    那你可能不能使用CommandBuilder 類別來自動產生SQL語法。

    這是大曾經發生過的問題你參考看看跟你狀況是否相同

    http://tlcheng.spaces.live.co/blog/cns!145419920BFD55A7!1752.entry

  • HB 2009/11/19 下午 12:24 回覆

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

    感謝余大的說明,我再Try看看。

  • flyerwing 2009/11/30 下午 01:50 回覆

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

    学习了
    这里气氛特别好


*標 題:

*姓 名:

 電子郵件: (將不會被顯示)

 個人網頁:

*回應

登入後使用進階評論

Please add 5 and 2 and type the answer here: