(完全限定類名: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所要求的字首“:”。