攔截器是一種軟體設計模式,它提供了一種透明的方式來擴展或修改程式的某些方面,類似於使用者出口。不需要重新編譯。使用 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");