文档首页
MySQL Connector/NET 开发者指南
相关文档 下载本手册
PDF (US Ltr) - 1.3Mb
PDF (A4) - 1.3Mb


MySQL Connector/NET 开发者指南  /  Connector/NET 编程  /  使用 Connector/NET 拦截器类

5.9 使用 Connector/NET 拦截器类

拦截器是一种软件设计模式,它提供了一种透明的方式来扩展或修改程序的某些方面,类似于用户出口。无需重新编译。使用 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.configweb.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");