10bet网址
连接器和API手册
下载本手册

4.5.9使用Connector/NET拦截器类

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

笔记

本节中介绍的类和方法不适用于使用。NET Core 1.1框架开发的Connector/NET应用程序。

连接器/网络包括以下拦截类:

  • BaseCommandInterceptor允许您在程序发出SQL命令时执行其他操作。例如,您可以检查SQL语句以进行日志记录或调试,替换您自己的结果集以实现缓存机制,等等。根据用例,您的代码可以补充SQL命令或完全替换它。

    BaseCommandInterceptor类有这些方法可以重写:

    public virtualbool ExecuteScalar(string sql, ref object returnValue);public virtual bool ExecuteNonQuery(string sql, ref int returnValue);/ /创建一个executerreader (string sql, CommandBehavior behavior, ref MySqlDataReader returnValue);公共虚拟虚拟Void Init(MySQLConnection连接);

    如果您的拦截器覆盖其中一个执行...方法,设置returnvalue.输出参数和返回真正的如果你处理了事件,或者错误的如果你不处理事件。只有在所有命令拦截器返回时,才会正常处理SQL命令错误的

    连接传递给了初始化方法是附加到此拦截器的连接。

  • BaseexceptionInterceptor当程序遇到SQL异常时,允许您执行其他操作。异常拦截机制在连接器/ J型号之后建模。您可以代码拦截器类并将其连接到现有程序而不重新编译,并且在创建时拦截异常。然后,您可以更改异常类型并可选择附加信息。此功能可允许您打开和关闭日志记录和调试代码,而不会在应用程序中进行硬编码任何内容。此技术适用于在SQL级别提出的异常,而不是降低级别系统或I / O错误。

    首先通过创建子类来开发异常拦截器BaseexceptionInterceptor班级。你必须覆盖拦截识别()方法。你也可以覆盖在里面()方法来执行一些一次性初始化。

    每个异常拦截器有2个方法:

    公共抽象异常拦截输入(例外异常,MySQLConnection连接);公共虚拟虚拟Void Init(MySQLConnection连接);

    传递给的连接在里面()是连接到此拦截器的连接。

    每个拦截都需要覆盖拦截出现并返回一个例外。它可以返回它给出的异常,或者它可以将其包装在一个新的例外。我们目前没有提供抑制异常的能力。

以下是在连接字符串上使用FQN(完全限定名)的示例:

MySqlConnection c1 = new MySqlConnection(@"server=localhost;pool =false;commandinterceptors = CommandApp.MyCommandInterceptor CommandApp”);MySqlConnection c2 = new MySqlConnection(@"server=localhost;pool =false; "exceptioninterceptors = ExceptionStackTraceTest.MyExceptionInterceptor ExceptionStackTraceTest”);

在本例中,将调用命令拦截器commandapp.mycommandinterceptor.存在于CommandApp组装。异常拦截器被调用Experfipstacktracetest.myExceptionIntercepor.存在于Expernipstacktracetest.组装。

要缩短连接字符串,可以在app.configweb.config.像这样的文件:

 
<添加名称=“mye”type =“Exceedipstacktracetest.myExceptionInterceptor,ExceptionStacktracetest”/>

完成此操作后,您的连接字符串可以如下所示:

mysqlconnection c1 = new mysqlconnection(@“server = localhost; pooling = false; commandinterceptor = myc”);mysqlconnection c2 = new mysqlconnection(@ server = localhost; pooling = false; Experfipinterceptors = mye“);