天天看點

DataRabbit 輕量的資料通路架構(06) -- IRelationAccesser

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

   IRelationAccesser将資料通路分成兩類:Query和Command。Query傳回DataSet,Command沒有傳回值。另外,IRelationAccesser還支援執行帶有參數的查詢語句。

   我們可以從DataRabbit的入口點IDataAccesser中擷取IRelationAccesser引用: 

   IRelationAccesser relationAccesser = dataAccesser.GetRelationAccesser(null);

   IRelationAccesser接口的完整定義如下,僅僅包含三個方法:

    {

        /// <summary>

        /// DoCommand 執行資料指令

        /// </summary>       

        void DoCommand(string command);

        // <summary>

        /// DoQuery 執行查詢資料

        /// </summary>  

        DataSet DoQuery(string query);

        /// ExcuteRegularQuery 執行帶有參數的查詢語句,參數值由paraValues給出。

        /// <param name="regularQuery">帶參數的查詢語句</param>

        /// <param name="paraPrefix">查詢語句中參數的字首,該字首可以使用者自定義</param>    

        /// <param name="paraValues">鍵為參數名,不帶參數字首</param>               

        DataSet ExcuteRegularQuery(string regularQuery, string paraPrefix, IDictionary<string, object> paraValues);       

    }    

   假設,我們要進行一個聯合查詢,可以這樣做:

   string joinSelect = "SELECT ErrorDetail.*, TaskError.Location FROM ErrorDetail INNER JOIN TaskError ON ErrorDetail.ErrorID = TaskError.ID WHERE (TaskError.ID = '1')";

   DataSet ds = relationAccesser.DoQuery(joinSelect);

   如果想使用參數化的查詢,可以調用ExcuteRegularQuery方法,我們現在通過調用ExcuteRegularQuery方法來實作上面的功能:

   string joinSelect = "SELECT ErrorDetail.*, TaskError.Location FROM ErrorDetail INNER JOIN TaskError ON ErrorDetail.ErrorID = TaskError.ID WHERE (TaskError.ID = @ID)";         

   //準備參數

   IDictionary<string, object> dic = new Dictionary<string, object>();

   dic.Add("ID", 1);//參數名不用帶參數字首

   //查詢

   DataSet ds2 = relationAccesser.ExcuteRegularQuery(joinSelect, "@", dic);

   特别要注意的是,ExcuteRegularQuery方法中的paraPrefix參數用于表示查詢語句中所使用的參數字首,這個字首使用者可以自己指定,DataRabbit在執行前會自動将其轉換為資料庫所要求的參數字首。比如,如果背景資料庫是Oracle,上述語句的參數字首“@”會被自動轉換成Oracle所要求的字首“:”。