DataAdapter.AcceptChangesDuringUpdate Właściwość
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Pobiera lub ustawia, czy AcceptChanges() jest wywoływany podczas .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
Wartość właściwości
true
jeśli AcceptChanges() jest wywoływany Update(DataSet)podczas ; w przeciwnym razie false
. Wartość domyślna to true
.
Przykłady
W tym przykładzie pokazano wyodrębnianie zmienionych wierszy z obiektu DataTable
i przy użyciu SqlDataAdapter elementu w celu zaktualizowania źródła danych i pobrania nowej wartości kolumny tożsamości. Ustawiając AcceptChangesDuringUpdate
właściwość SqlDataAdapter , aby false
zachować oryginalną wartość autokrementacji, nowe dane można następnie scalić z oryginałem DataTable, nawet jeśli nowa wartość tożsamości nie jest zgodna z oryginalną wartością autokrementacji w obiekcie 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
Uwagi
Podczas wywołania Update
metody DataAdapter
, baza danych może wysyłać dane z powrotem do aplikacji ADO.NET jako parametry wyjściowe lub jako pierwszy zwrócony rekord zestawu wyników. ADO.NET można pobrać te wartości i zaktualizować odpowiednie kolumny w aktualizowaniuDataRow. Domyślnie ADO.NET wywołuje metodę AcceptChanges
DataRow
po aktualizacji. Jeśli jednak chcesz scalić zaktualizowany wiersz z powrotem do innego DataTableelementu , warto zachować oryginalną wartość kolumny klucza podstawowego. Na przykład kolumna klucza podstawowego odpowiadająca automatycznie zwiększającej się kolumnie w bazie danych, takiej jak kolumna tożsamości, może zawierać nowe wartości przypisane przez bazę danych, które nie są zgodne z oryginalnymi wartościami przypisanymi w obiekcie DataRow
. Domyślnie AcceptChanges
jest wywoływana niejawnie po aktualizacji, a oryginalne wartości w wierszu, które mogły być AutoIncrement wartościami przypisanymi przez ADO.NET, są tracone. Oryginalne wartości w DataRow
obiekcie można zachować, uniemożliwiając ADO.NET
wywołanie AcceptChanges
po wykonaniu aktualizacji w wierszu, ustawiając AcceptChangesDuringUpdate właściwość na false
, która zachowuje oryginalne wartości.
Uwaga
AcceptChangesDuringUpdate
Ustawienie właściwości , która false
ma zastosowanie do wszystkich modyfikacji danych, nie tylko wstawia. Jeśli chcesz edytować lub usuwać wiersze w tej samej aktualizacji, a jeśli chcesz pominąć wywołanie AcceptChanges
tylko dla wstawień, zamiast ustawiać AcceptChangesDuringUpdate
false
wartość , użyj programu obsługi zdarzeń dla RowUpdated
zdarzenia DataAdapter
. W procedurze obsługi zdarzeń można sprawdzić StatementType , aby określić, czy modyfikacja danych jest wstawiona, a jeśli true
, ustaw Status właściwość elementu RowUpdatedEventArgs na SkipCurrentRowwartość . Aby uzyskać więcej informacji i przykład, zobacz Pobieranie tożsamości lub Wartości autonumerowania.