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