DataAdapter.AcceptChangesDuringUpdate Свойство
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Возвращает или задает, вызывается ли метод AcceptChanges() при вызове метода 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
Значение свойства
Значение true
, если метод AcceptChanges() вызывается при вызове метода Update(DataSet); в противном случае — значение false
. Значение по умолчанию — true
.
Примеры
В этом примере демонстрируется извлечение измененных строк из DataTable
и использование объекта SqlDataAdapter для обновления источника данных и получения нового значения столбца идентификаторов. Присвоив свойству false
SqlDataAdapter свойства значение , чтобы сохранить исходное значение автоматического приращения, новые данные могут быть объединены в исходный DataTable, даже если новое значение идентификатора не соответствует исходному значению автоматического приращения в DataTable
.AcceptChangesDuringUpdate
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
Комментарии
Во время вызова Update
метода DataAdapter
базы данных может отправлять данные обратно в приложение ADO.NET в качестве выходных параметров или первой возвращенной записи результирующих наборов. Среда ADO.NET позволяет получать эти значения и обновлять соответствующие столбцы в обновляемом объекте DataRow. По умолчанию ADO.NET вызывает AcceptChanges
метод DataRow
после обновления. Однако если вы хотите объединить обновленную строку обратно в другую DataTable, может потребоваться сохранить исходное значение столбца первичного ключа. Например, столбец первичного ключа, соответствующий столбцу с автоматическим увеличением в базе данных, например столбец идентификаторов, может содержать новые значения, назначенные базой данных, которые не соответствуют исходным значениям, назначенным DataRow
в . По умолчанию AcceptChanges
вызывается неявно после обновления, а исходные значения в строке, которые могли быть AutoIncrement значениями, назначенными ADO.NET, теряются. Вы можете сохранить исходные значения в , DataRow
запретив вызов AcceptChanges
после обновления строки, задав ADO.NET
свойству AcceptChangesDuringUpdatefalse
значение , которое сохраняет исходные значения.
Примечание
Задание свойству AcceptChangesDuringUpdate
значения false
применяется ко всем изменениям данных, а не только к вставкам. Если вы хотите изменить или удалить строки в том же обновлении и отключить вызов AcceptChanges
только для вставок, то вместо того, чтобы задать false
значение AcceptChangesDuringUpdate
, используйте обработчик событий для RowUpdated
события DataAdapter
. В обработчике событий можно проверка StatementType , чтобы определить, является ли изменение данных вставкой, а если true
— задать Status для свойства RowUpdatedEventArgsSkipCurrentRowсвойства значение . Дополнительные сведения и пример см. в разделе Получение значений идентификатора или автонумера.