天天看點

DataRabbit 輕量的ORM架構(18)-- 捕獲資料庫通路異常的詳細資訊

     最新版本的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 = 

DataRabbit 輕量的ORM架構(18)-- 捕獲資料庫通路異常的詳細資訊

;

            TransactionScopeFactory transactionScopeFactory = new TransactionScopeFactory();

            transactionScopeFactory.DataConfiguration = config;

            transactionScopeFactory.DBOperationLogger = new DBOperationLogger("DBException.txt");

            transactionScopeFactory.Initialize();    

     上述配置會将異常日志記錄到目前目錄下的DBException.txt 檔案中。

     如果不設定DBOperationLogger屬性,則DataRabbit架構預設采用EmptyDBOperationLogger。

     記錄執行失敗的SQL語句和對應的參數值,對于我們分析異常産生的原因是十分有用的,而DataRabbit可以自動為你記錄了這些資訊。