最新版本的DataRabbit(版本号:V3.2)新增一項重要功能--可以捕獲通路資料庫時産生的異常的詳細資訊,包括:異常對象、Sql語句、sql參數的名稱和值。這是由IDBOperationLogger接口提供支援的。
/// <summary>
/// IDBOperationLogger 用于捕獲住DB操作異常。可以用于記錄DB操作失敗時的語句和參數。
/// </summary>
public interface IDBOperationLogger
{
void LogException(Exception ee, string methodName ,string cmdText, IDataParameterCollection parameters);
}
當通過DataRabbit通路資料庫時,所産生的任何異常,都會被IDBOperationLogger接口捕獲住,你可以實作自己的Filter來對捕獲的異常進行處理,比如,記錄下執行失敗的SQL語句和對應的參數值。
DataRabbit内部提供了IDBOperationLogger接口的兩種實作:EmptyDBOperationLogger 和DBOperationLogger。EmptyDBOperationLogger 将忽略異常資訊,而DBOperationLogger将會把異常的詳細資訊記錄到日志檔案。
比如,在資料庫的Student表中插入一條記錄時,産生主鍵沖突的異常,則DBOperationLogger會記錄類似下面的的日志:
2008/11/19 11:49:20 : 高 -- 違反了 PRIMARY KEY 限制 'PK_Student'。不能在對象 'dbo.Student' 中插入重複鍵。語句已終止。錯誤類型:System.Data.SqlClient.SqlException。位置:
<dbCommand>
<method>ExcuteCommand</method>
<text>INSERT INTO Student ([AutoID],[Name],[Age],[Comment]) VALUES (@AutoID,@Name,@Age,@Comment)</text>
<parameters>
<para name="@AutoID" value="0" />
<para name="@Name" value="Sky" />
<para name="@Age" value="30" />
<para name="@Comment" value="NoComment" />
</parameters>
</dbCommand>
日志中,<dbCommand>節點下的<text>子節點的内容就是執行失敗的SQL語句,而<parameters>節點下的子節點則列出了所有的參數名稱及其對應的值。
那麼,如何注入IDBOperationLogger執行個體到DataRabbit架構中了?通過TransactionScopeFactory的DBOperationLogger屬性。例如:
DataConfiguration config =
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuIGO1UjY0AjZyUWZ0YWOjlzYxY2YwADZlZjYilTZ2cTYfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.gif)
;
TransactionScopeFactory transactionScopeFactory = new TransactionScopeFactory();
transactionScopeFactory.DataConfiguration = config;
transactionScopeFactory.DBOperationLogger = new DBOperationLogger("DBException.txt");
transactionScopeFactory.Initialize();
上述配置會将異常日志記錄到目前目錄下的DBException.txt 檔案中。
如果不設定DBOperationLogger屬性,則DataRabbit架構預設采用EmptyDBOperationLogger。
記錄執行失敗的SQL語句和對應的參數值,對于我們分析異常産生的原因是十分有用的,而DataRabbit可以自動為你記錄了這些資訊。