RowUpdated

Событие RowUpdated генерируется после обновления в источнике данных строки из DataSet.

Событие RowUpdated полезно для реагирования на ошибки и исключения, возникающие в ходе обновления данных. Сведения об ошибке можно добавить в объект DataSet, а также в логику повторов и т. д.

Синтаксис
public class RowUpdatedEventArgs : EventArgs;

Свойства аргумента RowUpdatedEventArgs (значения EventArgs) аналогичны свойствам аргумента RowUpdatingEventArgs (см. подпункт «RowUpdating»).

Дополнительно определяются следующие свойства:

  1. RecordsAffected – содержит количество строк, которые были изменены, вставлены или удалены при выполнении SQL-запроса;

  2. RowCount – содержит количество строк, обработанных в пакете обновленных записей.

Пример
// C#
using System;
using System.Data;
using System.Data.Common;
using System.Data.LinterClient;

class RowUpdatedSample
{
  static void Main()
  {
    // Соединение с БД
    LinterDbConnection con = new LinterDbConnection(
      "Data Source=LOCAL;User ID=SYSTEM;Password=MANAGER8");
    // Создание таблицы БД
    LinterDbCommand cmd = new LinterDbCommand(
      "create or replace table users ( " +
      "id integer primary key, name varchar(70));" +
      "insert into users (id, name) values (0, 'Пользователь A');" +
      "insert into users (id, name) values (1, 'Пользователь B');" +
      "insert into users (id, name) values (2, 'Пользователь C');", con);
    con.Open();
    cmd.ExecuteNonQuery();
    con.Close();
    // Создание объекта LinterDbDataAdapter
    LinterDbDataAdapter adapter = new LinterDbDataAdapter(
      "select id, name from users", con);
    adapter.RowUpdating += new EventHandler< RowUpdatingEventArgs >(OnRowUpdating);
    adapter.RowUpdated += new EventHandler< RowUpdatedEventArgs >(OnRowUpdated);
    // Создание объекта LinterDbCommandBuilder
    LinterDbCommandBuilder builder = new LinterDbCommandBuilder(adapter);
    // Заполнение объекта DataTable данными из таблицы БД
    DataTable users = new DataTable();
    adapter.Fill(users);
    // Изменяем записи в таблице DataTable
    users.Rows[0]["name"] = "Новый пользователь A";
    users.Rows[1].Delete();
    users.Rows[2]["name"] = "Новый пользователь C";
    // Имитируем несогласованное изменение первой записи в БД
    cmd.CommandText =
      "update users set name = 'Пользователь X' where id = 0";
    con.Open();
    cmd.ExecuteNonQuery();
    con.Close();
    // Теперь обновление БД должно завершиться ошибкой
    adapter.Update(users);
    // Отображение таблицы после обновления
    Console.WriteLine("Строки таблицы после обновления:");
    foreach (DataRow row in users.Rows)
    {
      Console.Write("{0}: '{1}' ", row[0], row[1]);
      if (row.HasErrors)
      {
        Console.WriteLine("(при обновлении строки произошла ошибка)");
      }
      else
      {
        Console.WriteLine("(обновление строки выполнено успешно)");
      }
    }
  }
  static void OnRowUpdating(object sender, RowUpdatingEventArgs args)
  {
    if (args.StatementType == StatementType.Delete)
    {
      Console.WriteLine("{0} Удаление записи '{1}'", DateTime.Now,
        args.Row["name", DataRowVersion.Original]);
    }
  }
  static void OnRowUpdated(object sender, RowUpdatedEventArgs args)
  {
    if (args.Status == UpdateStatus.ErrorsOccurred)
    {
      args.Row.RowError = args.Errors.Message;
      args.Status = UpdateStatus.SkipCurrentRow;
    }
  }
}

Результат выполнения примера:

07.12.2012 20:13:47 Удаление записи 'Пользователь B'
Строки таблицы после обновления:
0: 'Новый пользователь A' (при обновлении строки произошла ошибка)
2: 'Новый пользователь C' (обновление строки выполнено успешно)