首页 > 其他 > 详细

通用权限底层研究:强大的分页功能

时间:2015-10-13 18:34:29      阅读:214      评论:0      收藏:0      [点我收藏+]

很久前曾介绍过通用权限底层的分页方法(http://www.cnblogs.com/hnsongbiao/p/3614457.html),发现还有不少同学不会使用,今天再详细介绍下:

一个记录系统的日志列表页面,前端使用了QUI框架

技术分享

前端分页渲染直接使用Grid控件处理。

后台分页方法

         /// <summary>
        /// 获取系统运行日志数据
        /// </summary>
        /// <returns></returns>
        [AjaxRequestAttribute]
        public ActionResult GetSystemLog(SYSTEM_LOG4NETEntity logEntity, Pager pager, string sort, string direction, string startTime, string endTime)
        {
            Hashtable result = new Hashtable();
            DataTable dt = new DataTable();
            List<KeyValuePair<string, object>> dbParameters = new List<KeyValuePair<string, object>>();
            List<string> listWhere = new List<string>();
            string conditions = string.Empty;
            //时间查询条件
            DateTime timeStart, timeEnd;
            //默认查7天
            if (!DateTime.TryParse(startTime, out timeStart))
            {
                timeStart = DateTime.Now.AddDays(-7);
            }
            if (!DateTime.TryParse(endTime, out timeEnd))
            {
                timeEnd = DateTime.Now.AddDays(1);
            }
            listWhere.Add(SYSTEM_LOG4NETEntity.FieldLOG_DATE + " >= " + dbHelper.GetParameter("startTime") + " AND " + SYSTEM_LOG4NETEntity.FieldLOG_DATE + " <= " + dbHelper.GetParameter("endTime"));
            dbParameters.Add(new KeyValuePair<string, object>(dbHelper.GetParameter("startTime"), timeStart));
            dbParameters.Add(new KeyValuePair<string, object>(dbHelper.GetParameter("endTime"), timeEnd));
            //按IP地址查询
            if (!string.IsNullOrWhiteSpace(logEntity.IP))
            {
                listWhere.Add(SYSTEM_LOG4NETEntity.FieldIP + " = " + dbHelper.GetParameter("FieldIP"));
                dbParameters.Add(new KeyValuePair<string, object>(dbHelper.GetParameter("FieldIP"), logEntity.IP.Trim()));
            }
            //按标题查询
            if (!string.IsNullOrWhiteSpace(logEntity.LOG_TITLE))
            {
                if (logEntity.LOG_TITLE.IndexOf("%", StringComparison.Ordinal) < 0)
                {
                    logEntity.LOG_TITLE = string.Format("%{0}%", logEntity.LOG_TITLE).ToUpper().Trim();
                }
                listWhere.Add("Upper(" + SYSTEM_LOG4NETEntity.FieldLOG_TITLE + ") like " + dbHelper.GetParameter("FieldLOG_TITLE"));
                dbParameters.Add(new KeyValuePair<string, object>(dbHelper.GetParameter("FieldLOG_TITLE"), logEntity.LOG_TITLE));
            }
            //按systemcode查询
            if (!string.IsNullOrWhiteSpace(logEntity.SYSTEMCODE))
            {
                listWhere.Add(SYSTEM_LOG4NETEntity.FieldSYSTEMCODE + " = " + dbHelper.GetParameter("FieldSYSTEMCODE"));
                dbParameters.Add(new KeyValuePair<string, object>(dbHelper.GetParameter("FieldSYSTEMCODE"), logEntity.SYSTEMCODE.Trim()));
            }
            //按真实姓名查询
            if (!string.IsNullOrWhiteSpace(logEntity.REALNAME))
            {
                listWhere.Add(SYSTEM_LOG4NETEntity.FieldREALNAME + " = " + dbHelper.GetParameter("FieldREALNAME"));
                dbParameters.Add(new KeyValuePair<string, object>(dbHelper.GetParameter("FieldREALNAME"), logEntity.REALNAME.Trim()));
            }
            //按方法名称查询
            if (!string.IsNullOrWhiteSpace(logEntity.FUNCTIONNAME))
            {
                listWhere.Add(SYSTEM_LOG4NETEntity.FieldFUNCTIONNAME + " = " + dbHelper.GetParameter("FieldFUNCTIONNAME"));
                dbParameters.Add(new KeyValuePair<string, object>(dbHelper.GetParameter("FieldFUNCTIONNAME"), logEntity.FUNCTIONNAME.Trim()));
            }
            //查询条件
            if (listWhere.Count > 0)
            {
                conditions = string.Join(" and ", listWhere.ToArray());
            }
            string tableName = "SYSTEM_LOG4NET";
            string selectField = " LOG_ID,LOG_DATE,SYSTEMCODE,LOG_LEVEL,LOG_TITLE,IP,REALNAME ";
            int totalRows = 0;
            string orderBy = sort + " " + direction;
            try
            {
                dt = DbLogic.GetDataTableByPage(dbHelper, out totalRows, tableName, selectField, pager.pageNo, pager.pageSize, conditions, dbHelper.MakeParameters(dbParameters), orderBy);
                pager.totalPages = totalRows;
                result.Add("status", "true");
                result.Add("message", "成功获取数据。");
                result.Add("pager.pageNo", pager.pageNo);
                result.Add("rows", dt);
                result.Add("pager.totalRows", pager.totalPages);
                result.Add("sort", sort);
                result.Add("direction", direction);
            }
            catch (Exception ex)
            {
                result.Add("status", "false");
                result.Add("message", "系统异常:" + ex.Message);
                result.Add("pager.pageNo", pager.pageNo);
                result.Add("rows", dt);
                result.Add("pager.totalRows", pager.totalPages);
                result.Add("sort", sort);
                result.Add("direction", direction);
                LogHelper.OracleWarn(OperateContext.Current.UserInfo, "获取系统运行日志异常", ex.Message, "GetSystemLog", typeof(SystemLogController), ex);
            }
            result.Add("span", (DateTime.Now - begin).TotalMilliseconds);
            return Json(result);

        }

主要看看获取分页数据的方法,都是底层已经封装好的,这个分页兼容多种数据库。

dt = DbLogic.GetDataTableByPage(dbHelper, out totalRows, tableName, selectField, pager.pageNo, pager.pageSize, conditions, dbHelper.MakeParameters(dbParameters), orderBy);

 

        /// <summary>
        /// 获取分页数据
        /// 增加最大输出数据限制
        /// </summary>
        /// <param name="dbHelper">数据库连接</param>
        /// <param name="tableName">数据来源表名</param>
        /// <param name="selectField">选择字段</param>
        /// <param name="pageIndex">当前页</param>
        /// <param name="pageSize">每页显示多少条</param>
        /// <param name="conditions">查询条件</param>
        /// <param name="dbParameters">查询参数</param>
        /// <param name="orderBy">排序字段</param>
        /// <param name="currentIndex"></param>
        /// <param name="maxOutPut">最大记录输出数量</param>
        /// <returns>数据表</returns>
        public static DataTable GetDataTableByPage(IDbHelper dbHelper, string tableName, string selectField, int pageIndex, int pageSize, string conditions, IDbDataParameter[] dbParameters, string orderBy, string currentIndex = null,int? maxOutPut=null)
        {
            string sqlStart = ((pageIndex - 1) * pageSize).ToString();
            string sqlEnd = (pageIndex * pageSize).ToString();
            if (currentIndex == null)
            {
                currentIndex = string.Empty;
            }
            if (!string.IsNullOrEmpty(conditions))
            {
                conditions = "WHERE " + conditions;
            }
            string sqlQuery = string.Empty;

            if (dbHelper.CurrentDbType == CurrentDbType.Oracle)
            {
                if (!string.IsNullOrWhiteSpace(orderBy))
                {
                    orderBy = " ORDER BY " + orderBy;
                }
                sqlQuery = string.Format("SELECT * FROM (SELECT ROWNUM RN, H.* FROM ((SELECT " + currentIndex + " " + selectField + " FROM {0} {1} {2} )H)) Z WHERE Z.RN <={3} AND Z.RN >{4} "
    , tableName, conditions, orderBy, sqlEnd, sqlStart);
                if (maxOutPut!=null)
                {
                    sqlQuery += " AND ROWNUM<= " + maxOutPut;
                }
            }
            else if (dbHelper.CurrentDbType == CurrentDbType.SqlServer)
            {
                sqlQuery = string.Format("SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY {0}) AS RowIndex, " + selectField + " FROM {1} {2}) AS PageTable WHERE RowIndex <={3} AND RowIndex >{4} "
                    , orderBy, tableName, conditions, sqlEnd, sqlStart);
            }
            else if (dbHelper.CurrentDbType == CurrentDbType.MySql
                || dbHelper.CurrentDbType == CurrentDbType.SQLite)
            {
                sqlQuery = string.Format("SELECT {0} FROM {1} {2} ORDER BY {3} LIMIT {4}, {5}", selectField, tableName, conditions, orderBy, sqlStart, pageSize);
            }

            var dt = new DataTable(tableName);
            if (dbParameters != null && dbParameters.Length > 0)
            {
                dt = dbHelper.Fill(sqlQuery, dbParameters);
            }
            else
            {
                dt = dbHelper.Fill(sqlQuery);
            }
            return dt;
        }

 

通用权限底层研究:强大的分页功能

原文:http://www.cnblogs.com/hnsongbiao/p/4875118.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!