DataAdapter.AcceptChangesDuringUpdate Vlastnost
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Získá nebo nastaví, zda AcceptChanges() je volána během 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
Hodnota vlastnosti
true je-li AcceptChanges() volána během Update(DataSet); jinak false. Výchozí hodnota je true.
Příklady
Tento příklad ukazuje extrakci změněných řádků z DataTable a použití SqlDataAdapter k aktualizaci zdroje dat a načtení nové hodnoty sloupce identifikátoru.
AcceptChangesDuringUpdate Nastavením vlastnosti SqlDataAdapter pro false zachování původní hodnoty automatického přírůstku lze nová data potom sloučit do původní DataTable, i když nová hodnota identity neodpovídá původní automatické přírůstkové hodnotě v objektu 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
Poznámky
Během volání Update metody metody DataAdaptermůže databáze odesílat data zpět do vaší ADO.NET aplikace jako výstupní parametry nebo jako první vrácený záznam sady výsledků. ADO.NET může tyto hodnoty načíst a aktualizovat odpovídající sloupce v objektu DataRow, který je aktualizován. Ve výchozím nastavení ADO.NET volá AcceptChanges metodu DataRow po aktualizaci. Pokud ale chcete aktualizovaný řádek sloučit zpět do jiného DataTable, můžete chtít zachovat původní hodnotu sloupce primárního klíče. Například sloupec primárního klíče odpovídající automaticky se zvýší v databázi, například sloupec identity, může obsahovat nové hodnoty přiřazené databází, které neodpovídají původním hodnotám přiřazeným v DataRowdatabázi . Ve výchozím nastavení je AcceptChanges volána implicitně po aktualizaci a původní hodnoty v řádku, které mohly být AutoIncrement přiřazeny hodnotami přiřazenými ADO.NET, jsou ztraceny. Původní hodnoty můžete zachovat tak DataRow , že zabráníte ADO.NET volání AcceptChanges po provedení aktualizace na řádku nastavením AcceptChangesDuringUpdate vlastnosti na false, která zachovává původní hodnoty.
Poznámka:
AcceptChangesDuringUpdate Nastavení vlastnosti tak, aby false platilo pro všechny úpravy dat, nejen pro vložení. Pokud chcete upravit nebo odstranit řádky ve stejné aktualizaci a chcete potlačit volání AcceptChanges pouze pro vložení, pak místo nastavení AcceptChangesDuringUpdate na false, použijte obslužnou rutinu události pro RowUpdated událost události DataAdapterudálosti . V obslužné rutině události můžete zkontrolovat StatementType , zda je úprava dat vložení, a pokud true, nastavte Status vlastnost RowUpdatedEventArgs na SkipCurrentRowhodnotu . Další informace a příklad najdete v tématu Načítání hodnot identity nebo automatického číslování.