AcceptChangesDuringUpdate
Свойство предоставляет или устанавливает признак необходимости вызова метода AcceptChanges
при модификации строки с помощью метода Update().
При вызове метода Update объекта DataAdapter БД может возвращать
данные обратно в ADO.NET-приложение в качестве входных параметров или как первую возвращенную запись результирующего набора.
ADO.NET-провайдер может извлечь эти значения и обновить соответствующие столбцы в DataRow. По умолчанию ADO.NET-провайдер
вызывает метод AcceptChanges объекта DataRow после выполнения обновления.
Однако, если требуется выполнять слияние обновленной строки в другом объекте DataTable, можно
сохранить исходное значение столбца первичного ключа. Например, столбец первичного ключа, соответствующий столбцу с
атрибутом AUTO INCREMENT, может содержать значения, назначенные БД, которые не соответствуют исходным значениям,
назначенным в DataRow. По умолчанию метод AcceptChanges неявно вызывается
после обновления записи, и исходные значения в строке, которые могут являться значениями AutoIncrement, назначенными
ADO.NET-провайдером, теряются. Можно сохранить исходные значения в DataRow, запрещая в
ADO.NET-провайдере возможность вызова метода AcceptChanges после обновления в строке, задав для
свойства AcceptChangesDuringUpdate значение false, что приведет к сохранению исходных значений.
Декларация
public bool AcceptChangesDuringUpdate {get; set;};
Значение свойства
Значение true, если метод AcceptChanges вызывается при вызове метода Update; в противном случае – значение false.
Значением по умолчанию являются true.
Исключения
Отсутствуют.
Пример
Пример демонстрирует извлечение измененных строк из объекта DataTable, использование
DbDataAdapter для модификации источника данных и загрузки нового значения соответствующего столбца.
Присвоив свойству AcceptChangesDuringUpdate объекта значение false, сохраняем исходное автоинкрементное
значение. Новые данные могут быть затем объединены с исходными из DataTable даже если новое
соответствующее значение не совпадает с исходным автоинкрементным значением в объекте DataTable.
// C#
using System;
using System.Data;
using System.Data.Common;
class AcceptChangesDuringUpdateSample
{
static void Main()
{
// Создание фабрики классов провайдера
DbProviderFactory factory =
DbProviderFactories.GetFactory("System.Data.LinterClient");
// Соединение с БД
DbConnection con = factory.CreateConnection();
con.ConnectionString =
"Data Source=LOCAL;User ID=SYSTEM;Password=MANAGER8";
con.Open();
// Создание таблицы БД
DbCommand cmd = factory.CreateCommand();
cmd.Connection = con;
cmd.CommandText =
"create if not exists table policy ( " +
"policy_id integer autoinc primary key, " +
"policy_name varchar(70))";
cmd.ExecuteNonQuery();
// Создание объекта DbParameter
DbParameter par = factory.CreateParameter();
par.ParameterName = ":policy_name";
par.SourceColumn = "policy_name";
par.Direction = ParameterDirection.Input;
par.DbType = DbType.String;
par.Size = 70;
// Создание объекта DbDataAdapter
DbDataAdapter adapter = factory.CreateDataAdapter();
adapter.SelectCommand = factory.CreateCommand();
adapter.SelectCommand.Connection = con;
adapter.SelectCommand.CommandText =
"select policy_id, policy_name from policy";
adapter.InsertCommand = factory.CreateCommand();
adapter.InsertCommand.Connection = con;
adapter.InsertCommand.CommandText =
"insert into policy (policy_name) values (:policy_name); " +
"select last_autoinc as policy_id";
adapter.InsertCommand.Parameters.Add(par);
adapter.InsertCommand.UpdatedRowSource = UpdateRowSource.Both;
adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
adapter.AcceptChangesDuringUpdate = false;
// Заполнение объекта DataTable данными из таблицы БД
DataTable policy = new DataTable();
adapter.Fill(policy);
// Добавление записи в таблицу DataTable
DataRow newRow = policy.NewRow();
newRow["policy_name"] = "Политика " + DateTime.Now.ToString();
policy.Rows.Add(newRow);
// Получение таблицы, содержащей все изменения
DataTable dataChanges = policy.GetChanges();
// Обновление БД
adapter.Update(dataChanges);
// Освобождение ресурсов
con.Close();
// Отображение исходной таблицы
Console.WriteLine("Строки до объединения");
foreach (DataRow rowBefore in policy.Rows)
{
Console.WriteLine("{0}: {1}", rowBefore[0], rowBefore[1]);
}
// Объединение исходной таблицы и таблицы с изменениями
policy.Merge(dataChanges);
// Фиксация изменений
policy.AcceptChanges();
// Отображение таблицы после объединения
Console.WriteLine("Строки после объединения");
foreach (DataRow rowAfter in policy.Rows)
{
Console.WriteLine("{0}: {1}", rowAfter[0], rowAfter[1]);
}
}
}