5.9 Использование классов-перехватчиков Connector/NET
Перехватчик — это шаблон проектирования программного обеспечения, обеспечивающий прозрачный способ расширения или изменения некоторых аспектов программы, аналогично пользовательскому выходу. Перекомпиляция не требуется. В MySQL Connector/NET перехватчики включаются и выключаются путем обновления строки подключения для ссылки на разные наборы классов перехватчиков, которые вы инициализируете.
Классы и методы, представленные в этом разделе, не применяются к приложениям Connector/NET, разработанным с помощью платформы .NET Core 1.1.
Connector/NET включает следующие классы перехватчиков:
-
Класс
BaseCommandInterceptorпозволяет выполнять дополнительные операции, когда программа выполняет SQL-команду. Например, вы можете проанализировать SQL-запрос для целей ведения журнала или отладки, заменить свой собственный результат для реализации механизма кэширования и т. д. В зависимости от использования ваш код может дополнить SQL-команду или полностью заменить её.Класс
BaseCommandInterceptorимеет эти методы, которые вы можете переопределить:public virtual bool ExecuteScalar(string sql, ref object returnValue); public virtual bool ExecuteNonQuery(string sql, ref int returnValue); public virtual bool ExecuteReader(string sql, CommandBehavior behavior, ref MySqlDataReader returnValue); public virtual void Init(MySqlConnection connection);
Если ваш перехватчик переопределяет один из методов
Execute..., установите параметр выводаreturnValueи вернитеtrue, если вы обработать событие, илиfalse, если вы не обработали событие. SQL-команда обрабатывается обычно только тогда, когда все перехватчики команд возвращаютfalse.Подключение, переданное методу
Init, — это подключение, которое подключено к этому перехватчику. -
Класс
BaseExceptionInterceptorпозволяет выполнять дополнительные операции, когда программа сталкивается с SQL-исключением. Механизм перехвата исключений смоделирован по аналогии с Connector/J. Вы можете закодировать класс-перехватчик и подключить его к существующей программе без перекомпиляции и перехватывать исключения при их создании. Затем вы можете изменить тип исключения и, при необходимости, добавить к нему информацию. Эта возможность позволяет включать и отключать код ведения журнала и отладки без жёсткого кодирования чего-либо в приложении. Этот метод относится к исключениям, возникающим на уровне SQL, а не к ошибкам на более низком уровне системы или ввода/вывода.Сначала вы разрабатываете перехватчик исключений, создав подкласс класса
BaseExceptionInterceptor. Вы должны переопределить методInterceptException(). Вы также можете переопределить методInit()для выполнения некоторой одноразовой инициализации.Каждый перехватчик исключений имеет 2 метода:
public abstract Exception InterceptException(Exception exception, MySqlConnection connection); public virtual void Init(MySqlConnection connection);
Подключение, переданное методу
Init(), — это подключение, которое подключено к этому перехватчику.Каждый перехватчик должен переопределить метод
InterceptExceptionи вернуть исключение. Он может вернуть переданное исключение или обернуть его в новое исключение. В настоящее время мы не предоставляем возможность подавления исключения.
Ниже приведены примеры использования FQN (полного квалифицированного имени) в строке подключения:
MySqlConnection c1 = new MySqlConnection(@"server=localhost;pooling=false;
commandinterceptors=CommandApp.MyCommandInterceptor,CommandApp");
MySqlConnection c2 = new MySqlConnection(@"server=localhost;pooling=false;
exceptioninterceptors=ExceptionStackTraceTest.MyExceptionInterceptor,ExceptionStackTraceTest");
В этом примере перехватчик команды называется CommandApp.MyCommandInterceptor и находится в сборке CommandApp. Перехватчик исключений называется ExceptionStackTraceTest.MyExceptionInterceptor и находится в сборке ExceptionStackTraceTest.
Для сокращения строки подключения вы можете зарегистрировать свои перехватчики исключений в файле app.config или web.config следующим образом:
<configSections>
<section name="MySQL" type="MySql.Data.MySqlClient.MySqlConfiguration,MySql.Data"/>
</configSections>
<MySQL>
<CommandInterceptors>
<add name="myC" type="CommandApp.MyCommandInterceptor,CommandApp" />
</CommandInterceptors>
</MySQL>
<configSections>
<section name="MySQL" type="MySql.Data.MySqlClient.MySqlConfiguration,
MySql.Data"/>
</configSections>
<MySQL>
<ExceptionInterceptors>
<add name="myE"
type="ExceptionStackTraceTest.MyExceptionInterceptor,ExceptionStackTraceTest" />
</ExceptionInterceptors>
</MySQL>
После этого ваши строки подключения могут выглядеть следующим образом:
MySqlConnection c1 = new MySqlConnection(@"server=localhost;pooling=false;
commandinterceptors=myC");
MySqlConnection c2 = new MySqlConnection(@"server=localhost;pooling=false;
exceptioninterceptors=myE");
© 2025 Oracle
Licensed under the GPLv2 License.