Обработка событий

Одинаковые события могут быть у разных классов (например, событие StateChange есть в классах SqlConnection, OracleConnection, LinterDbConnection). Чтобы определить, какой класс сгенерировал событие, в обработчике события нужно проверить значение параметра sender.

Клиентское приложение может иметь как индивидуальные обработчики событий (для каждого конкретного типа события), так и один универсальный обработчик, например:

/* Универсальный обработчик событий для разных провайдеров */
static private void OnStateChange(object sender,
StateChangeEventArgs e)
     {
       if (sender is LinterDbConnection)
      {
         Console.WriteLine("Изменилось состояние подключения ЛИНТЕР:");
       }
       else if (sender is OracleConnection)
       {
         Console.WriteLine("Изменилось состояние подключения Oracle:");
       }
       else
       {
         Console.WriteLine(
           "Изменилось состояние подключения неизвестного провайдера:");
       }
       Console.WriteLine("  Начальное состояние = " + e.OriginalState);
       Console.WriteLine("  Текущее состояние = " + e.CurrentState);
     }

...
/* Добавляем обработчик событий */

linterDataAdapter.SelectCommand.Connection.StateChange +=
new StateChangeEventHandler(OnStateChange);

oracleDataAdapter.SelectCommand.Connection.StateChange +=
new StateChangeEventHandler(OnStateChange);
...

    

Пример обработки событий.

using System;
using System.Data;
using System.Data.LinterClient;

namespace Test
{
  class Program
  {
    /* Обработка событий ADO.NET-провайдера */
    static private void OnStateChange(object sender, StateChangeEventArgs e)
    {
      Console.WriteLine("Изменилось состояние подключения:");
      Console.WriteLine("  Начальное состояние = " + e.OriginalState);
      Console.WriteLine("  Текущее состояние = " + e.CurrentState);
    }

    static private void FillDataSet()
    {
      string connectionString = GetConnectionString();
      string queryString = "SELECT MAKE, MODEL FROM AUTO;";

      /* Создаем набор команд и подключения базы данных */
      using (LinterDbDataAdapter dataAdapter =
        new LinterDbDataAdapter(queryString, connectionString))
      {
        /* Добавляем обработчики */
        dataAdapter.SelectCommand.Connection.StateChange
          += new StateChangeEventHandler(OnStateChange);

        /* Создаем расположенный в памяти кэш данных */
        DataSet dataSet = new DataSet();

        /* Заполняем кэш данных, что приводит к возникновению
         * нескольких событий изменения состояния подключения */
        dataAdapter.Fill(dataSet, 0, 5, "Table");
      }
    }

    static private string GetConnectionString()
    {
      /* Чтобы не хранить строку подключения в коде, вы можете
       * получить ее из файла конфигурации */
      return "Data Source=LOCAL;User ID=SYSTEM;Password=MANAGER8";
    }

    static void Main(string[] args)
    {
      FillDataSet();
    }
  }
}