Обработка событий
Одинаковые события могут быть у разных классов (например, событие 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=MANAGER"; } static void Main(string[] args) { FillDataSet(); } } }