拦截器是一种软件设计模式,它提供了一种透明的方式来扩展或修改程序的某些方面,类似于用户出口。无需重新编译。使用 MySQL Connector/NET,可以通过更新连接字符串来启用和禁用拦截器,连接字符串指向您实例化的不同拦截器类集。
本节中介绍的类和方法不适用于使用 .NET Core 1.1 框架开发的 Connector/NET 应用程序。
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
。只有当所有命令拦截器都返回false
时,才会正常处理 SQL 命令。传递给
Init
方法的连接是附加到此拦截器的连接。BaseExceptionInterceptor
允许您在程序遇到 SQL 异常时执行其他操作。异常拦截机制仿照 Connector/J 模型。您可以编写一个拦截器类,并将其连接到现有程序,而无需重新编译,并在创建异常时拦截它们。然后,您可以更改异常类型,并选择性地向其附加信息。此功能允许您打开和关闭日志记录和调试代码,而无需在应用程序中硬编码任何内容。此技术适用于在 SQL 级别引发的异常,不适用于较低级别的系统或 I/O 错误。您首先通过创建
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");