Обработка событий
Одинаковые события могут быть у разных классов (например, событие 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();
}
}
}