DataAdapter.AcceptChangesDuringUpdate Propriedade
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
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 de Propriedade
true se AcceptChanges() for chamado durante um Update(DataSet); caso contrário false. A predefinição é true.
Exemplos
Este exemplo demonstra extrair linhas alteradas de a DataTable e usar a SqlDataAdapter para atualizar a fonte de dados e recuperar um novo valor de coluna de identidade. Ao definir AcceptChangesDuringUpdate a propriedade de para falseSqlDataAdapter preservar o valor original de autoincremento, os novos dados podem então ser fundidos no valor original DataTable, mesmo que o novo valor de identidade não corresponda ao valor original de autoincremento 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
Observações
Durante uma chamada ao método Update de um DataAdapter, a base de dados pode enviar dados de volta para a sua aplicação ADO.NET como parâmetros de saída ou como o primeiro registo devolvido de um conjunto de resultados. ADO.NET pode recuperar esses valores e atualizar as colunas correspondentes na DataRow que está a ser atualizada. Por defeito, o ADO.NET chama ao método AcceptChanges do DataRow após a atualização. No entanto, se quiseres fundir a linha atualizada novamente com outra DataTable, podes querer preservar o valor original de uma coluna de chave primária. Por exemplo, uma coluna de chave primária correspondente a uma coluna que incrementa automaticamente na base de dados, como uma coluna identidade, pode conter novos valores atribuídos pela base de dados que não correspondem aos valores originais atribuídos no DataRow. Por defeito, AcceptChanges é chamado implicitamente após uma atualização, e os valores originais na linha, que podem ter sido AutoIncrement valores atribuídos pelo ADO.NET, perdem-se. Pode preservar os valores originais no DataRow impedindo que ADO.NET chame AcceptChanges depois de realizar uma atualização numa linha, definindo a propriedade AcceptChangesDuringUpdate para false, que preserva os valores originais.
Note
Definir a AcceptChangesDuringUpdate propriedade para false aplica-se a todas as modificações de dados, não apenas a inserções. Se quiser editar ou eliminar linhas na mesma atualização, e se quiser suprimir a chamada para AcceptChanges apenas para inserções, então em vez de definir AcceptChangesDuringUpdate para false, use um gestor de eventos para o RowUpdated evento do DataAdapter. No gestor de eventos, pode verificar para StatementType determinar se a modificação dos dados é uma inserção, e se true, definir a Status propriedade do RowUpdatedEventArgs para SkipCurrentRow. Para obter mais informações e um exemplo, consulte Recuperando valores de identidade ou de numeração automática.