簡述DbDataAdapter.update 方法
2024-07-21 02:23:35
供稿:網友
簡述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。