簡述DbDataAdapter.Update 方法

來源:互聯網
上載者:User
簡述DbDataAdapter.Update 方法





當應用程式調用 Update 方法時,DbDataAdapter 根據 DataSet 中配置的索引順序為每一行檢查 RowState 屬性,并迭代執行所需的 INSERT、UPDATE 或 DELETE 語句。例如,由於 DataTable 中行的排序,Update 可能先執行一個 DELETE 語句,接著執行一個 INSERT 語句,然後再執行另一個 DELETE 語句。

應注意,這些語句不是作為批處理進程執行的;每一行都是單獨更新的。在必須控制語句類型順序的情況下(例如,INSERT 在 UPDATE 之前),應用程式可以調用 GetChanges 方法。

如果未指定 INSERT、UPDATE 或 DELETE 語句,Update 方法會產生異常。但是,如果設定 .NET Framework 資料提供者的 SelectCommand 屬性,則可以建立 SqlCommandBuilder 或 OleDbCommandBuilder 對象來為單個表更新自動產生 SQL 陳述式。然後,CommandBuilder 將產生其他任何未設定的 SQL 陳述式。此產生邏輯要求 DataSet 中存在鍵列資訊。

Update 方法支援以下情況:DataSet 包含多個 DataTable 對象,而這些對象的名稱只有大小寫不同。當 DataSet 中有多個表具有相同的名稱但大小寫不同時,Update 執行區分大小寫比較以尋找相應的表,如果不存在完全符合的表,就會產生一個異常。下面的代碼闡釋該行為。

DataSet ds = new DataSet();
ds.Tables.Add("aaa");
ds.Tables.Add("AAA");
adapter.Update(ds, "aaa"); // Updates "aaa", which already exists in the DataSet.
adapter.Update(ds, "AAA"); // Updates "AAA", which already exists in the DataSet.
adapter.Update(ds, "Aaa"); // Results in an exception.
如果調用 Update 並且 DataSet 只包含一個其名稱只有大小寫不同的 DataTable,則更新該 DataTable。在這種情況下,比較不區分大小寫。下面的 C# 代碼闡釋該行為。

DataSet dataset = new DataSet();
dataset.Tables.Add("aaa");
adapter.Update(dataset, "AAA"); // Updates table "aaa" because only one similarly named table is in the DataSet.


Update 方法在執行更新之前從第一個映射列出的表中檢索行。然後,Update 使用 UpdatedRowSource 屬性的值重新整理該行。忽略返回的任何其他行。



UpdatedRowSource屬性 擷取或設定命令結果在由 DbDataAdapter 的 Update 方法使用時如何應用於 DataRow。預設的 UpdateRowSource 值為 Both,除非自動產生該命令(如 OleDbCommandBuilder 這樣的情況),這時預設值為 None。在其他非自動產生命令情況下,不管使用代碼還是通過查詢設計工具,通過設定命令的CommandText屬性建立的命令對象都是預設值為Both。



成員名稱
說明

Both
將輸出參數和第一個返回行都映射到 DataSet 中的已更改的行。

FirstReturnedRecord
將第一個返回行中的資料對應到 DataSet 中的已更改的行。

None
忽略任何返回的參數或行。

OutputParameters
將輸出參數映射到 DataSet 中的已更改的行。





在將任何資料載入回 DataSet 之後,將引發 OnRowUpdated 事件,從而允許使用者檢查經協調的 DataSet 行以及該命令返回的任何輸出參數。在對一行成功進行更新之後,將接受對該行的更改。

當使用 Update 時,執行的順序如下:

1. 將 DataRow 中的值移至參數值。

2. 引發 OnRowUpdating 事件。

3. 執行命令。

4. 如果該命令設定為 FirstReturnedRecord,返回的第一項結果將放置在 DataRow 中。

5. 如果存在輸出參數,它們將被放在 DataRow 中。

6. 引發 OnRowUpdated 事件。

7. 調用 AcceptChanges。

與 DbDataAdapter 關聯的每個命令通常都有一個與其關聯的參數集合。參數通過 .NET Framework 資料提供者的 Parameter 類的 SourceColumn 和 SourceVersion 屬性對應到當前行。SourceColumn 引用 DataTable 列,而 DbDataAdapter 引用該列來擷取當前行的參數值。

SourceColumn 在應用任何錶映射之前將引用未映射的列名。如果 SourceColumn 引用一個不存在的列,則採取的操作取決於以下 MissingMappingAction 值之一。

n MissingMappingAction.Passthrough 如果不存在任何映射,則使用 DataSet 中的源列名和表名。

n MissingMappingAction.Ignore 產生 SystemException。當顯式設定映射時,缺少輸入參數的映射通常是由於出錯所致。

n MissingMappingAction.Error 產生 SystemException。

SourceColumn 屬性還用於將輸出或輸入/輸出參數的值對應回 DataSet。如果它引用一個不存在的列,則會產生異常。

.NET Framework 資料提供者的 Parameter 類的 SourceVersion 屬性確定使用列值的哪個版本:Original、Current 還是 Proposed。該功能通常用於在 UPDATE 語句的 WHERE 子句中包含初始值,以檢查開放式並發衝突。

注意 如果在更新行時出錯,則會引發異常並停止執行更新。若要在遇到錯誤時繼續更新操作而不產生異常,請在調用 Update 之前將 ContinueUpdateOnError 屬性設定為 true。您還可以在 SqlDataAdapter 或 OleDbDataAdapter 的 RowUpdated 事件中逐行對錯誤作出響應。若要在 RowUpdated 事件中繼續更新操作而不產生異常,請將 RowUpdatedEventArgs 的 Status 屬性設定為 Continue。


相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。