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