天天看点

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所要求的前缀“:”。