DataAdapter.AcceptChangesDuringUpdate Propriedade
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
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.