天天看點

DataRabbit 輕量的資料通路架構(05) -- ITableAccesser

   (完全限定類名:DataRabbit.Relation.ITableAccesser) 

   ORM并不能完成所有的事情,有些資料庫通路還是需要基于關系來進行,對于那些不提供基于關系進行資料通路操作的純ORM架構,我認為是不明智的。在DataRabbit中,基于ORM的通路和基于關系進行資料通路各占了一半的天空,這使得我們在無法用ORM達成的地方,可以轉向使用基于關系的通路器來達成。DataRabbit.Relation命名空間下的類和接口用于提供基于關系的資料庫通路操作,主要包括:針對資料庫的Relation通路器(IRelationAccesser)、針對Table的Relation通路器(ITableAccesser)和針對存儲過程的通路器(ISPAccesser),本文先介紹 ITableAccesser。

   ITableAccesser stuTableAccesser = dataAccesser.GetTableAccesser("Student", null);

   stuTableAccesser.Delete(string.Format("where {0} > '30'" ,Student._Age));

   使用基于關系的通路器需要自己手寫SQL語句,特别是用于搜尋的Where子句,由于能支援手寫SQL語句,是以相對于ORM通路器,基于關系的通路器可以執行更複雜的資料庫操作。注意,在介紹ORM通路器時,我們經常使用Filter來表示條件,但是Filter以及IFilterTree僅僅隻能在ORM通路器中使用,在基于關系的通路器中是不能使用它們的。

   IDataAccesser接口相對簡單,我們來看看它的全貌,之後你就知道該接口中各方法的含義了:

    public interface ITableAccesser :ITransactionAccesser

    {

        #region TableName

        /// <summary>

        /// TableName 目标表名稱

        /// </summary>

        string TableName { get; } 

        #endregion

        #region CommitData

        /// CommitData 送出DataTable中的changes到資料庫

        /// </summary>        

        void CommitData(DataTable dt);

        #region Delete

        /// Delete 删除目标表中所有滿足where條件的記錄

        void Delete(string where);        

        #region Clear

        /// Clear 清空目标表

        void Clear();

        #region Insert

        /// Insert 将row存放到資料庫中

        /// </summary>       

        void Insert(DataRow row);       

        #region Get

        /// Get 擷取滿足條件的DataSet

        /// </summary>      

        DataSet Get(string where);

        /// GetOne 傳回滿足where條件的第一條記錄

        DataRow GetOne(string where);

        #endregion              

        #region no transaction

        /// GetRecordsCount 擷取目标表中滿足where條件的記錄總數

        /// </summary> 

        int GetRecordsCount(string where);

        /// NewRow 傳回一個與目标表大綱完全一緻的DataRow

        DataRow NewRow();

        /// GetEmptyTable 擷取一個空的DataTable,該DataTable反映了目标表的結構

        /// <returns></returns>

        DataTable GetEmptyTable();

    }