使用英语阅读

通过


DataAdapter.Update(DataSet) 方法

定义

从名为“Table”的 DataSet 为指定的 DataTable 中每个已插入、已更新或已删除的行调用相应的 INSERT、UPDATE 或 DELETE 语句。

public virtual int Update (System.Data.DataSet dataSet);
public abstract int Update (System.Data.DataSet dataSet);

参数

dataSet
DataSet

用于更新数据源的 DataSet

返回

DataSet 中成功更新的行数。

实现

例外

源表无效。

尝试执行 INSERT、UPDATE 或 DELETE 语句,但没有记录受到影响。

示例

以下示例对数据源使用派生类 OleDbDataAdapterUpdate

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;
}

注解

更新按行执行。 对于每个插入、修改和删除的行, Update 该方法确定 (插入、更新或删除) 对行执行的更改类型。 根据更改的类型, Insert将执行 、 Update,Delete 命令模板,将修改后的行传播到数据源。 当应用程序调用 Update 方法时, DataAdapter 会检查 RowState 属性,并根据 中 DataSet配置的索引的顺序,以迭代方式为每一行执行所需的 INSERT、UPDATE 或 DELETE 语句。 例如, Update 可能会执行 DELETE 语句,然后执行 INSERT 语句,然后执行另一个 DELETE 语句,因为 中 DataTable行的顺序是 。

应注意的是,这些语句不是作为批处理执行的;每一行都单独更新。 在必须控制语句类型序列的情况下,应用程序可以调用 GetChanges 方法, (例如 UPDATE) 之前的 INSERT。 有关详细信息,请参阅使用 DataAdapters 更新数据源

如果未指定 INSERT、UPDATE 或 DELETE 语句,该方法 Update 将生成异常。 但是,如果设置SelectCommand.NET Framework数据提供程序的 属性,则可以创建 SqlCommandBuilderOleDbCommandBuilder 对象来自动生成单表更新的 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。 这将为更新DataRow的 引发 DataTable.RowChangingDataTable.RowChanged 事件。

与 关联的 DataAdapter 每个命令通常都有一个与之关联的参数集合。 参数通过 SourceColumn .NET 数据提供程序类的 ParameterSourceVersion 属性映射到当前行。 SourceColumn DataTable引用引用的列DataAdapter以获取当前行的参数值。

SourceColumn 是指应用任何表映射之前未映射的列名。 如果 SourceColumn 引用不存在的列,则采取的操作取决于以下 MissingMappingAction 值之一。

枚举值 采取的操作
MissingMappingAction.Passthrough 如果没有映射,请使用 中的 DataSet 源列名称和表名。
MissingMappingAction.Ignore SystemException生成 。 显式设置映射时,缺少输入参数的映射通常是错误的结果。
MissingMappingAction.Error SystemException生成 。

属性 SourceColumn 还用于将输出或输入/输出参数的值映射回 DataSet。 如果引用不存在的列,则会生成异常。

SourceVersion.NET 数据提供程序的 类的 Parameter 属性确定是使用列值的 Original、Current 还是 Proposed 版本。 此功能通常用于在 UPDATE 语句的 WHERE 子句中包含原始值,以检查乐观并发冲突。

AcceptChanges调用 方法或 AcceptChanges 方法将提交 或 DataTable中的所有DataSet更改。 如果在调用方法之前Update调用了其中任一方法,则调用该方法时Update不会提交任何更改,除非自 调用 或 AcceptChanges 以来AcceptChanges进行了进一步的更改。

备注

如果在更新行时发生错误,则会引发异常并停止执行更新。 若要在遇到错误时继续执行更新操作而不生成异常,请在调用 Update之前将 ContinueUpdateOnErrortrue 属性设置为 。 还可以在 DataAdapter 的事件中 RowUpdated 按行响应错误。 若要继续更新操作而不在 RowUpdated 事件中生成异常,请将 的 RowUpdatedEventArgs 属性设置为 StatusContinue

对于在 上 Update传播到数据源的每个列,都应将参数添加到 InsertCommandUpdateCommandDeleteCommand。 参数 SourceColumn 的 属性应设置为列的名称。 此设置指示参数的值不是手动设置的,而是取自当前处理的行中的特定列。

适用于

产品 版本
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

另请参阅