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]);
    }
  }
}