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