分享

DbDataAdapter.Update 方法 (DataSet, String) (System.Data.Common)

 醉人说梦 2014-07-29

當應用程式呼叫 Update 方法時,DbDataAdapter 會根據 DataSet 中設定的索引順序檢查 RowState 屬性,並反覆的為每個資料列執行必要的 INSERT、UPDATE 或 DELETE 陳述式。 例如,Update 可能會因為 DataTable 中資料列的順序,而先執行 DELETE 陳述式,然後 INSERT 陳述式,最後再執行另一個 DELETE 陳述式。

應該注意的是,這些陳述式並不會當做一個批次程序來執行,而是每個資料列個別更新。 應用程式可以在必須控制陳述式類型順序 (例如 INSERT 在 UPDATE 之前) 的情況下,呼叫 GetChanges 方法。 如需詳細資訊,請參閱以 DataAdapter 更新資料來源

如果尚未指定 INSERT、UPDATE 或 DELETE 陳述式,則 Update 方法會產生例外狀況。 然而,如果您設定 .NET Framework 資料提供者的 SelectCommand 屬性,即可建立 SqlCommandBuilderOleDbCommandBuilder 物件,自動產生單一資料表更新的 SQL 陳述式。 接著,CommandBuilder 會產生您尚未設定的其他任何 SQL 陳述式。 這個產生邏輯需要索引鍵資料行資訊以存在於 DataSet 中。 如需詳細資訊,請參閱使用 CommandBuilders 產生命令

Update 方法支援 DataSet 包含多個只有名稱大小寫不同的 DataTable 物件的案例。 DataSet 中存在多個具有相同名稱,但名稱大小寫不同的資料表時,Update 會執行區分大小寫的比較以尋找對應的資料表,如果找不到相符的資料表,則會產生例外狀況。 下列 C# 程式碼會說明這個行為。

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 屬性的值重新整理資料列。 其他的所有資料列會被忽略。

在任何資料載入回 DataSet 後,會引發 OnRowUpdated 事件,允許使用者檢查調整的 DataSet 資料列以及命令所傳回的任何輸出參數。 更新資料列成功後,對該資料列的變更將被接受。

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

  1. DataRow 中的值會移動至參數值。

  2. 便會引發 OnRowUpdating 事件。

  3. 執行命令。

  4. 如果命令設定為 FirstReturnedRecord,則傳回的第一個結果會放置在 DataRow 中。

  5. 如果有輸出參數,它們會被放置於 DataRow

  6. 便會引發 OnRowUpdated 事件。

  7. 呼叫 AcceptChanges

DbDataAdapter 關聯的每個命令通常都具有與它關聯的參數集合。 會經由 .NET 資料提供者之 Parameter 類別的 SourceColumnSourceVersion 屬性,將參數對應至目前的資料列。 SourceColumn 會參考 DataTable 資料行,DbDataAdapter 參考該資料行以取得目前資料列的參數值。

在套用任何資料表對應之前,SourceColumn 會參考未對應的資料行名稱。 如果 SourceColumn 參考不存在的資料行,則會根據下列其中一個 MissingMappingAction 值來採取動作。

列舉型別值

採取的動作

MissingMappingAction.Passthrough

如果沒有對應存在,會使用 DataSet 中的來源資料行名稱和資料表名稱。

MissingMappingAction.Ignore

產生 SystemException 當明確設定對應時,輸入參數的對應遺漏通常是錯誤的結果。

MissingMappingAction.Error

產生 SystemException

SourceColumn 屬性也用來將輸出或輸入/輸出參數的值對應回 DataSet 如果參考不存在的資料行,會產生例外狀況。

.NET Framework 資料提供者之 Parameter 類別的 SourceVersion 屬性會判斷要使用資料行值的 Original、Current 或 Proposed 版本。 這個功能常用來包含 UPDATE 陳述式的 WHERE 子句中的原始值,以檢查開放式並行存取違規。

注意事項注意事項

如果更新資料列時發生錯誤,便會擲回例外狀況並且中斷執行更新。 若要在遇到錯誤時繼續更新作業,而不產生例外狀況,請在呼叫 Update 前設將 ContinueUpdateOnError 屬性設為 true 您也可以在 DataAdapter 的 RowUpdated 事件中以每個資料列為基礎來回應錯誤。 若要在 RowUpdated 事件中繼續更新作業,而不產生例外狀況,請將 RowUpdatedEventArgsStatus 屬性設為 Continue

public DataSet CreateCmdsAndUpdate(string connectionString, string queryString, string tableName) { using (OleDbConnection connection = new OleDbConnection(connectionString)) { OleDbDataAdapter adapter = new OleDbDataAdapter(); adapter.SelectCommand = new OleDbCommand(queryString, connection); OleDbCommandBuilder builder = new OleDbCommandBuilder(adapter); connection.Open(); DataSet customers = new DataSet(); adapter.Fill(customers); //code to modify data in dataset here adapter.Update(customers, tableName); return customers; } }

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多