4.5.9 使用连接器/NET 拦截器类

拦截器是一种软件设计模式,它提供了一种透明的方式来扩展或修改程序的某些方面,类似于用户出口。无需重新编译。使用 MySQL Connector/NET,通过更新连接字符串以引用您实例化的不同拦截器类集来启用和禁用拦截器。

笔记

本节中介绍的类和方法不适用于使用 .NET Core 1.1 框架开发的连接器/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处理该事件时返回。只有当所有命令拦截器都返回时,SQL 命令才能正常处理false

    传递给该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");