Compartilhar via


DataAdapter.AcceptChangesDuringUpdate Propriedade

Definição

Obtém ou define se AcceptChanges() é chamado durante um Update(DataSet).

public:
 property bool AcceptChangesDuringUpdate { bool get(); void set(bool value); };
public bool AcceptChangesDuringUpdate { get; set; }
member this.AcceptChangesDuringUpdate : bool with get, set
Public Property AcceptChangesDuringUpdate As Boolean

Valor da propriedade

true se AcceptChanges() é chamado durante um Update(DataSet); caso contrário, false. O padrão é true.

Exemplos

Este exemplo demonstra como extrair linhas alteradas de um DataTable e como usar um SqlDataAdapter para atualizar a fonte de dados e recuperar um novo valor de coluna de identidade. Ao definir a AcceptChangesDuringUpdate propriedade do SqlDataAdapter como false para preservar o valor de incremento automático original, os novos dados poderão ser mesclados no original DataTable, mesmo que o novo valor de identidade não corresponda ao valor de incremento automático original no DataTable.

private static void MergeIdentityColumns(string connectionString)
{
    using (SqlConnection connection =
               new SqlConnection(connectionString))
    {
        // Create the DataAdapter
        SqlDataAdapter adapter =
            new SqlDataAdapter(
            "SELECT ShipperID, CompanyName FROM dbo.Shippers",
            connection);

        //Add the InsertCommand to retrieve new identity value.
        adapter.InsertCommand = new SqlCommand(
            "INSERT INTO dbo.Shippers (CompanyName) " +
            "VALUES (@CompanyName); " +
            "SELECT ShipperID, CompanyName FROM dbo.Shippers " +
            "WHERE ShipperID = SCOPE_IDENTITY();", connection);

        // Set AcceptChangesDuringUpdate to false
        adapter.AcceptChangesDuringUpdate = false;

        // Add the parameter for the inserted value.
        adapter.InsertCommand.Parameters.Add(
           new SqlParameter("@CompanyName", SqlDbType.NVarChar, 40,
           "CompanyName"));
        adapter.InsertCommand.UpdatedRowSource = UpdateRowSource.Both;

        // MissingSchemaAction adds any missing schema to
        // the DataTable, including auto increment columns
        adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;

        // Fill a DataTable.
        DataTable shipper = new DataTable();
        adapter.Fill(shipper);

        // Add a new shipper row.
        DataRow newRow = shipper.NewRow();
        newRow["CompanyName"] = "New Shipper";
        shipper.Rows.Add(newRow);

        // Add changed rows to a new DataTable. This
        // DataTable will be used to update the data source.
        DataTable dataChanges = shipper.GetChanges();

        adapter.Update(dataChanges);
        connection.Close();

        Console.WriteLine("Rows after merge.");
        foreach (DataRow rowBefore in shipper.Rows)
        {
            {
                Console.WriteLine("{0}: {1}", rowBefore[0], rowBefore[1]);
            }
        }

        // Merge the two DataTables to get new values.
        shipper.Merge(dataChanges);

        // Commit the changes.
        shipper.AcceptChanges();

        Console.WriteLine("Rows after merge.");
        foreach (DataRow rowAfter in shipper.Rows)
        {
            {
                Console.WriteLine("{0}: {1}", rowAfter[0], rowAfter[1]);
            }
        }
    }
}
Private Sub MergeIdentityColumns(ByVal connectionString As String)

    Using connection As SqlConnection = New SqlConnection( _
       connectionString)

        ' Create the DataAdapter
        Dim adapter As SqlDataAdapter = New SqlDataAdapter( _
          "SELECT ShipperID, CompanyName FROM dbo.Shippers", connection)

        ' Add the InsertCommand to retrieve new identity value.
        adapter.InsertCommand = New SqlCommand( _
            "INSERT INTO dbo.Shippers (CompanyName) " & _
            "VALUES (@CompanyName); " & _
            "SELECT ShipperID, CompanyName FROM dbo.Shippers " & _
            "WHERE ShipperID = SCOPE_IDENTITY();", _
            connection)

        ' Set AcceptChangesDuringUpdate to false.
        adapter.AcceptChangesDuringUpdate = False

        ' Add the parameter for the inserted value.
        adapter.InsertCommand.Parameters.Add( _
           New SqlParameter("@CompanyName", SqlDbType.NVarChar, 40, _
           "CompanyName"))
        adapter.InsertCommand.UpdatedRowSource = _
           UpdateRowSource.FirstReturnedRecord

        ' MissingSchemaAction adds any missing schema to 
        ' the DataTable, including auto increment columns
        adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey

        ' Fill a DataTable.
        Dim shipper As New DataTable
        adapter.Fill(shipper)

        ' Add a new shipper row. 
        Dim newRow As DataRow = shipper.NewRow()
        newRow("CompanyName") = "New Shipper"
        shipper.Rows.Add(newRow)

        ' Add changed rows to a new DataTable. This
        ' DataTable will be used to update the data source.
        Dim dataChanges As DataTable = shipper.GetChanges()

        ' Update the data source with the modified records.
        adapter.Update(dataChanges)

        Console.WriteLine("Rows before merge.")
        Dim rowBefore As DataRow
        For Each rowBefore In shipper.Rows
            Console.WriteLine("{0}: {1}", rowBefore(0), rowBefore(1))
        Next

        ' Merge the two DataTables to get new values.
        shipper.Merge(dataChanges)

        ' Commit the changes.
        shipper.AcceptChanges()

        Console.WriteLine("Rows after merge.")
        Dim rowAfter As DataRow
        For Each rowAfter In shipper.Rows
            Console.WriteLine("{0}: {1}", rowAfter(0), rowAfter(1))
        Next
    End Using
End Sub

Comentários

Durante uma chamada para o Update método de um DataAdapter, o banco de dados pode enviar dados de volta para seu aplicativo ADO.NET como parâmetros de saída ou como o primeiro registro retornado de um conjunto de resultados. O ADO.NET pode recuperar esses valores e atualizar as colunas correspondentes no DataRow que está sendo atualizado. Por padrão, ADO.NET chama o AcceptChanges método do DataRow após a atualização. No entanto, se você quiser mesclar a linha atualizada novamente em outra DataTable, talvez queira preservar o valor original de uma coluna de chave primária. Por exemplo, uma coluna de chave primária correspondente a uma coluna de incremento automático no banco de dados, como uma coluna de identidade, pode conter novos valores atribuídos pelo banco de dados que não correspondem aos valores originais atribuídos no DataRow. Por padrão, AcceptChanges é chamado implicitamente após uma atualização e os valores originais na linha, que podem ter sido AutoIncrement valores atribuídos por ADO.NET, são perdidos. Você pode preservar os valores originais no DataRow impedindo ADO.NET de chamar AcceptChanges depois que ele executa uma atualização em uma linha, definindo a AcceptChangesDuringUpdate propriedade como false, que preserva os valores originais.

Observação

Definir a AcceptChangesDuringUpdate propriedade como false se aplica a todas as modificações de dados, não apenas inserções. Se você quiser editar ou excluir linhas na mesma atualização e se quiser suprimir a chamada AcceptChanges apenas para inserções, em vez de definir AcceptChangesDuringUpdate como false, use um manipulador de eventos para o RowUpdated evento do DataAdapter. No manipulador de eventos, você pode marcar o StatementType para determinar se a modificação de dados é uma inserção e, se true, definir a Status propriedade do RowUpdatedEventArgs como SkipCurrentRow. Para obter mais informações e um exemplo, consulte Recuperar valores de identidade ou numeração automática.

Aplica-se a

Confira também