RowUpdated
Событие RowUpdated генерируется после обновления в источнике данных строки из DataSet.
Событие RowUpdated полезно для реагирования на ошибки и исключения, возникающие в ходе обновления данных. Сведения об ошибке можно добавить в объект DataSet, а также в логику повторов и т. д.
Синтаксис
public class RowUpdatedEventArgs : EventArgs;
Свойства аргумента RowUpdatedEventArgs (значения EventArgs) аналогичны свойствам аргумента RowUpdatingEventArgs (см. пункт «RowUpdating»).
Дополнительно определяются следующие свойства:
-
RecordsAffected– содержит количество строк, которые были изменены, вставлены или удалены при выполнении SQL-запроса; -
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' (обновление строки выполнено успешно)