• Microsoft .NET
  • ASP.NET
  • Модификация ответа HTTP (HTTP Response) при помощи фильтров

События элемента управления источника данных (Data Source Control) в ASP.NET 2.0

Чаще всего разработчики используют элементы управления SqlDataSource и ObjectDataSource, и они предоставляют способы получения и изменения данных либо из базы данных, либо из библиотеки объектов, соответственно. Оба элемента управления вызывают события до и после выборки, вставки, обновления и удаления данных. К примеру, SqlDataSource и ObjectDataSource вызывают свои события выборки (Select) ещё до выполнения SQL-запроса либо вызова метода объекта для получения данных. После того как данные были возвращены, вызывается событие выборки. Путем создания обработчика события выборки вы можете исследовать и управлять параметрами, используемыми в выборке данных; событие выборки, среди всего прочего, также отражает факт  возбуждения исключения во время данной операции. Аналогично события вызываются до и после процессов обновления, вставки и удаления.

Это будет вашим  преимуществом, если вы будете иметь понятие об элементах управления источниками данных и жизненном цикле события. Многие реальные случаи требуют возможность программного доступа и назначения параметров, используемых для выборки, вставки, обновления либо удаления, что может быть осуществлено в соответствующем событии, происходящем до действия. Более того, для того, чтобы достойно управлять исключениями уровня базы данных либо библиотеки объектов, вы должны использовать события, происходящие после действия. Так, во время отладки происходящие до действия события предоставляют возможность распознавать параметры, которые были использованы для запроса к данным. Читайте далее, чтобы узнать больше об этом!

Модель события элемента управления источником данных (Data Source Control)

Элементы управления SqlDataSource и ObjectDataSource предоставляют методы для выборки, вставки, обновления и удаления данных - Select(), Insert(), Update() и Delete(). Данные методы могут быть вызваны программным путем или, что является частым случаем, могут быть автоматически из элемента управления данными, который был привязан к элементу управления источником данных. Когда вызывается метод Select() элемента управления SqlDataSource он устанавливает соединение с конкретной базой данных, запускает указанный запрос SelectCommand, и возвращает результат в DataView либо DataReader (в зависимости от значения DataSourceMode property). Когда вызывается метод Select() для ObjectDataSource, настроенному объекту приписывается значение и вызывается указанный метод. Результат данного метода затем возвращается из метода Select().

Несмотря на внутренние различия в методе Select() для элементов управления SqlDataSource и ObjectDataSource, оба элемента управления обладают одной и той же моделью события. Для четырех методов - Select(), Insert(), Update() и Delete() - элементы управления SqlDataSource и ObjectDataSource вызывают события до и после действия. Одно событие предшествует действию, а другое следует за ним. События названы соответственно прошедшему и настоящему временам. Событие выборки вызывается до того как получены данные как только была выполнена нижележащая команда выборки (select)  - вызывается событие выборки. Следующая диаграмма демонстрирует данную модель.


Данная диаграмма показывает модель метода Select() элемента ObjectDataSource. Такая же модель используется для методов Insert(), Update()и Delete() и для элемента управления SqlDataSource. Хотя принцип одинаков как для элемента SqlDataSource, так и для ObjectDataSource, реализация все же отличается.

Исследуем события элемента управления SqlDataSource, происходящие до выполнения действия

Обработчикам событий элемента управления SqlDataSource,происходящих до действий, кроме прочих битов информации передается ссылка на объект Command, используемый для выполнения действия базы данных. Объект Command содержит информацию о той команде, которую нужно выполнить (посредством свойства CommandText) и которая будет нестандартным SQL-выражением либо названием хранимой процедуры. Она также будет иметь набор Parameters , который хранит параметры, используемые в запросе.

Если вам необходимо манипулировать параметрами, используемыми в выражениях SELECT, INSERT, UPDATE и DELETE, SelectCommand следующим образом: то вы можете сделать это посредством соответствующего обработчика события, выполняемого до действия. К примеру, представьте, что элемент управления SqlDataSource настроен с

SELECT ...
FROM Employees
WHERE Salary > @Salary

В наборе <SelectParameters> элемента SqlDataSource будет параметр. Источник параметра может быть указан декларативным способом при помощи жёстко закодированного значения, получения значения из элемента управления со страницы, значеия строки запроса и т.д. Независимо от этого, значения параметра может быть исследовано и изменено (при необходимости) в обработчике события Selecting. (Читайте статью о фильтрации базы данных при помощи параметров для получения более детальной информации об использовании параметров с элементами управления источником данных.)

Для элемента управления SqlDataSource вы можете осуществить доступ к значению параметра при помощи e.Command.Parameters("parameterName") для того, чтобы программно настроить (либо изменить) параметр @Salary:

Protected Sub CategoriesDataSource_Selecting(ByVal sender As Object,         ByVal e As System.Web.UI.WebControls.SqlDataSourceSelectingEventArgs)         Handles CategoriesDataSource.Selecting
   'Установите значение параметра посредством e.Command.Parameters...
   e.Command.Parameters("@Salary").Value = 50000
End Sub

Приложение к данной статье предоставляет вспомогательный метод для отображения CommandText и всех параметров принадлежащих Command при получении либо изменении данных используя элемент управления SqlDataSource. Данный результат может оказаться очень полезным при отладке.

Исследуем события элемента управления ObjectDataSource, происходящие до выполнения действия
Как и SqlDataSource, события элемента управления ObjectDataSource, происходящие до выполнения действия, предоставляют возможность специализации параметров, передаваемых в настроенный метод объекта. Вместо того, чтобы получать объект Command в обработчике события, обработчикам событий элемента ObjectDataSource, выполняемых до действия, передается объект словаря, названный InputParameters и содержащий информацию о входящих параметрах и их значениях.

К примеру, представьте что наш бизнес-объект вызывал метод GetEmployeesByDepartmentID(departmentID), где входной параметр departmentID типа был использован для получения информации только о тех сотрудниках, которые служат в определенном отделе. Для того, чтобы программно назначить значение данного входного параметра в обработчике события выборки ( Selecting) элемента управления ObjectDataSource, используйте следующий код:

Protected Sub CategoriesDataSource_Selecting(ByVal sender As Object,         ByVal e As         System.Web.UI.WebControls.ObjectDataSourceSelectingEventArgs) Handles         CategoriesDataSource.Selecting
   'Установите значение параметра посредством e.InputParameters...
   e.InputParameters("departmentID").Value = 7
End Sub

Исследуем события элементов управления ObjectDataSource и SqlDataSource, происходящие после выполнения действия
После того, как было завершено определенное действие, элементы управления SqlDataSource и ObjectDataSource вызывают свои соответствующие события (Selected, Inserted, Updated или Deleted). В обработчике события, следующего за действием, число кортежей, подверженных изменению, сообщается после того, как произойдет исключение. Обработчику события элемента ObjectDataSource, происходящего после действия, также передается значение, полученное от вызванного метода библиотеки объектов (если есть такой). Исключение может произойти в случае, если база данных пала, было использовано неправильное значение параметра, была нарушена ссылочная целостность, либо по какой-нибудь другой причине. Более того, если было обнаружено исключение, то свойство ExceptionHandled может быть установлено в значение True, чтобы известить о том, что исключение может быть обработано.

Вывод

При получении либо изменении данных используя элемент управления SqlDataSource либо ObjectDataSource события вызываются до и после выполнения действия. Создавая обработчики для таких событий, мы можем исследовать процесс, манипулировать входными параметрами и исследовать результаты. Обработчики событий, вызываемые до выполнения действия, чаще всего используются для того, чтобы программно назначить значения параметрам элемента управления источником данных. Обработчики события, вызываемые после выполнения действия, используются для определения количества строк, которые подверглись изменениям либо для того, чтобы определить ту операцию, которая вызвала данное исключение. Обработчики событий вызываемые в обоих случаях также очень пригодны при отладке.

Scott Mitchell

Исходный код примеров