5.更新數據
Web程序通常利用無程式語句或者通過參數代存儲過程來更新數據.但是,當遇見脫線的數據時,你也許希望利用內置服務來更新所有需要修訂的記錄.為完成這一工作.ADO提供了成批的更新機制.
UpdateBatch 方法用於把保存在副本緩沖中的 Recordset 更改發送到服務器,以更新數據源。它采用開放式鎖定,允許所有掛起的本地更改。它還在單個操作中把所有更改傳送到數據源。僅當更改提交後數據源鎖定要更改的記錄時,才會出現開放式鎖定。開放式鎖定使兩個用戶可以同時訪問同一個記錄,但一個用戶輸入的更改很快會被另一用戶所覆蓋。當然,這種方式要求數據源能夠檢測和防止數據沖突。還要求整個數據源比較穩定,不會發生頻繁的更改。否則,不難想象協調費用將很快超過替代嚴格鎖定所帶來的節約。事實上,使用 UpdateBatch 方法,在任何更改失敗時都會返回一個錯誤。然後,您可以通過 Errors 集合和 Error 對象來訪問該錯誤。
要理解 ADO.Net 模型為什麼是更新數據的更強大的工具,理解 ADO 中開放式鎖定的工作原理是非常關鍵的。在 ADO 代碼中,您無法控制調用 UpdateBatch 之後所發生的一切。也就是說,更新是在服務器上通過滾動已更改的行,然後比較原始值和數據源中對應記錄中的當前值來進行的。當所有的值都一致了,才對表執行適當的 SQL 語句(INSERT、UPDATE 或 DELETE)。
以上陳述說明了你還不能夠控制SQL 語句。位於服務器端的更新 代碼既不會比你自己寫的好,也不會在你采用的非SQL 提供程序的情況下運作。在本章節的開始部份,我已經講了Web應用程序是典型的通過參數化存儲進程來更新數據的過程。不管如何,如果你用批更新,情況就會有所不同.
在ADO.NET中, 模型已被擴展開來.現在,它采用更為通用的架構,通過它你可以規定你自己關於基本運算的命令語句,如插入,刪除,更新以及選擇. 更明顯的,你可以觀察到從數據源裡提取數據的企圖,並且不管數據源的本性,可以提供相同的支持.ADO.Net中的批更新,要求你創建一個DataSetCommand 對象: SQLDataSetCommand 或者ADODataSetCommand
注: 在Beta 2中, DataSetCommand對象被稱為DataAdapter 對象.
一旦你采用了DataSetCommand對象,你可以使用它的Update 方法. DataSetCommand提供了一系列屬性:如InsertCommand, DeleteCommand, UpdateCommand, and SelectCommand.它們都是Command對象,但你不能夠對它們進行設置,除非缺省設置沒有按你的要求完成.這與ADO中一樣.在Update過程中,如果沒有設置xxxCommand屬性,但是主關鍵字已經存在內,則會自動生成Command對象.
以下代碼展示了如何為EmployeesList table設置主關鍵字,
DataColumn[] keys = new DataColumn[1];
keys[0] = m_oDS.Tables["EmployeesList"].Columns["EmployeeID"];
m_oDS.Tables["EmployeesList"].PrimaryKey = keys;
主關鍵字基本上是是DataColumn對象的一個數組.
如果你想利用存儲過程來更新表單,或者你利用專用非SQL 數據提供程序進行操作,那麼你將會常常用到這 些命令屬性.