Ejemplo n.º 1
0
        /// <summary>
        /// 执行查询SQL,返回列表object
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="pageSize"></param>
        /// <param name="curPage"></param>
        /// <param name="returnClass">不能为null</param>
        /// <returns></returns>
        public PageList <T> ExecutePageListObjectByType <T>(string sql, string orderKey, int pageSize, int curPage, Type returnClass)
        {
            PageList <T> objs = new PageList <T>();
            T            obj;
            IDataReader  idr = null;

            // 计算获取的记录编号范围(当前页)
            objs.SetPage(pageSize, curPage);

            try
            {
                // 获取总记录数
                if (pageSize != -1)
                {
                    objs.TotalCount = ParamUtil.getint(_db.ExecuteScalarBySql(_isql.CountSql(sql)));
                }
                string pageSql = _isql.PageSql(sql, orderKey, objs.StartRecord, objs.EndRecord);
                // 执行查询
                idr = _db.ExecuteReaderBySql(pageSql);

                // 获取指定范围的数据
                while (idr.Read())
                {
                    obj = (T)ReflectUtil.CreateInstance(returnClass);

                    // 第一列为COL_ROWNUM(记录号),不设置属性值
                    for (int i = 1; i < idr.FieldCount; i++)
                    {
                        ReflectUtil.SetPropertyValue(obj, idr.GetName(i), idr.GetValue(i));
                    }
                    objs.Add(obj);
                }

                // 如果未分页,则设置总数为当前页记录数
                if (pageSize == -1)
                {
                    objs.TotalCount = objs.CurPageCount;
                }
            }
            finally
            {
                if (idr != null)
                {
                    idr.Close();
                }
            }

            return(objs);
        }
        /// <summary>
        /// 设置SQL参数
        /// </summary>
        /// <param name="fullParamName">参数全名称,有基础类型、类属性和末尾sql等三种参数
        /// 基础类型格式: #[1-99]:ParamName#, 第一个字符表示参数顺序号,值范围数字1-99,第二个字符为冒号分隔符,后面是实际参数名
        /// 类属性格式:#ParamName#,ParamName就是实际参数名,必须与参数类的某个公开属性严格匹配
        /// 末尾sql格式:fullParamName为空字符串,此时只有ParamSql属性有意义
        /// </param>
        /// <param name="sql"></param>
        /// <param name="isConditionParam">是否条件参数</param>
        /// <returns>SQL参数</returns>
        private SqlParam SetSqlParam(string fullParamName, string sql, bool isConditionParam)
        {
            string paramName = "";
            int    paramSeq  = 0;
            int    paramNameIndex;

            // 0.fullParamName=="": 表示最后一个参数,只有SQL有效,参数名和类型无效,参数编号为-1
            // 1.(fullParamName.IndexOf(":")<0):  表示基础类型,参数名中包含参数顺序号,格式: #[1-99]:ParamName#
            // 2.(fullParamName.IndexOf(":")>=0): 表示对象类,参数名中为类属性,格式: 类属性名
            if (fullParamName == "")
            {
                paramSeq = -1;
            }
            else
            {
                paramNameIndex = fullParamName.IndexOf(":");
                if (paramNameIndex < 0)
                {
                    paramName = fullParamName.Substring(1, fullParamName.Length - 2);
                }
                else
                {
                    paramName = fullParamName.Substring(paramNameIndex + 1, fullParamName.Length - paramNameIndex - 2);
                    paramSeq  = ParamUtil.getint(fullParamName.Substring(1, paramNameIndex - 1));
                }
            }

            // 条件参数:需要将参数字符转换为{0},简化ToString()的处理
            if (isConditionParam == true)
            {
                sql = " " + sql.Replace(fullParamName, "{0}");
            }

            // 返回参数
            return(new SqlParam(paramName, paramSeq, sql, isConditionParam));
        }