語言

DataAdapter.Update(DataSet) 方法

定義

從一個命名的「資料表」呼叫指定中每個插入、更新或刪除的列DataSetDataTable的相應 INSERT、UPDATE 或 DELETE 語句。

public:
 virtual int Update(System::Data::DataSet ^ dataSet);
public:
 abstract int Update(System::Data::DataSet ^ dataSet);
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("IDataReader's (built from adapter commands) schema table types cannot be statically analyzed.")]
public virtual int Update(System.Data.DataSet dataSet);
public virtual int Update(System.Data.DataSet dataSet);
public abstract int Update(System.Data.DataSet dataSet);
[<System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("IDataReader's (built from adapter commands) schema table types cannot be statically analyzed.")>]
abstract member Update : System.Data.DataSet -> int
override this.Update : System.Data.DataSet -> int
abstract member Update : System.Data.DataSet -> int
override this.Update : System.Data.DataSet -> int
abstract member Update : System.Data.DataSet -> int
Public Overridable Function Update (dataSet As DataSet) As Integer
Public MustOverride Function Update (dataSet As DataSet) As Integer

參數

dataSet
DataSet

它們 DataSet 用來更新資料來源。

傳回

從 中成功更新 DataSet的列數。

實作

屬性

例外狀況

來源資料表無效。

嘗試執行 INSERT、UPDATE 或 DELETE 敘述時,沒有任何紀錄受影響。

範例

以下範例使用導出類別 OleDbDataAdapter,對 Update 資料來源。

static private DataSet CreateCommandAndUpdate(
    string connectionString,
    string queryString)
{
    DataSet dataSet = new DataSet();

    using (OleDbConnection connection =
               new OleDbConnection(connectionString))
    {
        connection.Open();
        OleDbDataAdapter adapter =
            new OleDbDataAdapter();
        adapter.SelectCommand =
            new OleDbCommand(queryString, connection);
        OleDbCommandBuilder builder =
            new OleDbCommandBuilder(adapter);

        adapter.Fill(dataSet);

        // Code to modify data in the DataSet here.

        // Without the OleDbCommandBuilder, this line would fail.
        adapter.UpdateCommand = builder.GetUpdateCommand();
        adapter.Update(dataSet);
    }
    return dataSet;
}
Public Function CreateCommandAndUpdate( _
    ByVal connectionString As String, _
    ByVal queryString As String) As DataSet

    Dim dataSet As New DataSet()

    Using connection As New OleDbConnection(connectionString)
        connection.Open()
        Dim adapter As New OleDbDataAdapter()

        adapter.SelectCommand = New OleDbCommand( _
            queryString, connection)

        Dim builder As OleDbCommandBuilder = _
            New OleDbCommandBuilder(adapter)

        adapter.Fill(dataSet)

        ' Code to modify the data in the DataSet here. 

        ' Without the OleDbCommandBuilder this line would fail.
        builder.GetUpdateCommand()
        adapter.Update(dataSet)
    End Using
    Return dataSet
End Function

備註

更新是以每列方式進行。 對於每一筆插入、修改和刪除的列,方法 Update 會決定對該列所做的變更類型(插入、更新或刪除)。 根據變更類型, Insert執行 或 Update,Delete 指令範本,將修改後的資料列傳播到資料來源。 當應用程式呼叫該 Update 方法時,會 DataAdapter 檢查 RowState 該屬性,並根據在 中配置 DataSet的索引順序,對每一列重複執行所需的 INSERT、UPDATE 或 DELETE 語句。 例如,Update 可能會執行 DELETE 語句,後面接著 INSERT 語句,然後執行另一個 DELETE 語句,因為 DataTable中的數據列順序。

請注意,這些語句不會以批處理方式執行;每個數據列都會個別更新。 應用程式可以在您必須控制語句類型的序列時呼叫 GetChanges 方法(例如 UPDATE 之前的 INSERT)。 如需詳細資訊,請參閱 使用 DataAdapters 更新數據源。

若未指定 INSERT、UPDATE 或 DELETE 語句,該 Update 方法會產生例外。 不過,如果你設定 SqlCommandBuilder .NET Framework 資料提供者的屬性,可以建立OleDbCommandBuilder一個 or SelectCommand 物件,自動產生單資料表更新的 SQL 語句。 然後,您未設定的任何其他 SQL 語句都會由 CommandBuilder產生。 此生成邏輯要求關鍵欄位資訊必須存在於 DataSet中。 更多資訊請參閱 使用 CommandBuilders 產生指令。

此 Update 方法會在執行更新前,從第一個映射中列出的資料表中取得資料列。 Update 然後使用 UpdatedRowSource 屬性的值重新整理數據列。 任何額外的回傳列都被忽略。

在將任何資料載入 DataSet後 OnRowUpdated ,事件會被觸發,使用者可以檢查已 DataSet 調和的列以及指令回傳的任何輸出參數。 當某一列成功更新後,該列的變更會被接受。

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

  1. 中的值 DataRow 會被移到參數值。

  2. 便會引發 OnRowUpdating 事件。

  3. 指令執行。

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

  5. 如果有輸出參數,它們會放在 DataRow中。

  6. 便會引發 OnRowUpdated 事件。

  7. 呼叫 DataRow.AcceptChanges。 這將同時提升DataTable.RowChanging更新的事件DataTable.RowChangedDataRow。

與 DataAdapter 相關聯的每個命令通常都有與其相關聯的參數集合。 參數透過 .NET 資料提供者SourceColumn類別的 和 SourceVersion 屬性映射到當前列Parameter。 SourceColumn DataTable指的是用DataAdapter來取得當前列參數值的欄位。

SourceColumn 指的是尚未映射欄位名稱,尚未套用任何表格映射。 若 SourceColumn 指的是不存在的欄位,所採取的行動取決於以下 MissingMappingAction 其中一個值。

列舉值 已採取動作
MissingMappingAction.Passthrough 如果沒有映射,請使用來源欄位名稱和資料表名稱 DataSet 。
MissingMappingAction.Ignore SystemException A 是生成的。 明確設定對應時,輸入參數遺漏的對應通常是錯誤的結果。
MissingMappingAction.Error SystemException A 是生成的。

此 SourceColumn 特性也用於將輸出或輸入/輸出參數的值映射回 DataSet。 若異常指向不存在的欄位,則會產生例外。

SourceVersion.NET 資料提供者Parameter類別的屬性決定了欄位值的原始、現行或提案版本。 這項功能通常用來在 UPDATE 語句的 WHERE 子句中包含原始值,以檢查開放式並行存取違規。

呼叫該AcceptChanges方法AcceptChanges或方法將提交所有在 or DataSet中的DataTable變更。 若在呼叫方法之前Update先呼叫這些方法,則在呼叫時不會有Update變更,除非之後AcceptChangesAcceptChanges或已呼叫過其他變更。

Note

若在更新資料列時發生錯誤,會拋出例外並停止執行更新。 若要在遇到錯誤時不產生例外,繼續更新操作,請先將屬性設 ContinueUpdateOnError 為 , true 然後再呼叫 Update。 在發生資料適配器事件時,你也可以依每列 RowUpdated 回應錯誤。 若要繼續更新操作而不在事件中RowUpdated產生例外,請將 的Status屬性設RowUpdatedEventArgs為 Continue。

對於你傳播到資料來源Update的每一欄,都應該在 、 InsertCommand、 或 UpdateCommand中加入一個參數。DeleteCommand SourceColumn參數的屬性應該設為欄位名稱。 此設定表示參數值並非手動設定,而是從當前處理列中的特定欄位取出。

適用於

另請參閱