您当前的位置: 首页 >  sql

DataGrid连接Access的快速分页法——动态生成SQL语句

发布时间:2004-12-23 10:22:00 ,浏览量:0

作者:黎波 using System;
using System.Text;
namespace Paging
{
    ///
    /// FastPaging 的摘要说明。
    ///
    public class FastPaging {
 
        private FastPaging() {
        }
 
        ///
        /// 获取根据指定字段排序并分页查询的 SELECT 语句。
        ///
        ///每页要显示的记录的数目。
        ///要显示的页的索引。
        ///数据表中的记录总数。
        ///要查询的数据表。
        ///要查询的字段。
        ///主键字段。
        ///是否为升序排列。
        ///查询的筛选条件。
        ///返回排序并分页查询的 SELECT 语句。
        public static String Paging(
            int pageSize,
            int pageIndex,
            int recordCount,
            String tableName,
            String queryFields,
            String primaryKey,
            bool ascending,
            String condition )
        {
            #region 实现
 
            StringBuilder sb    = new StringBuilder();
            int pageCount       = GetPageCount(recordCount,pageSize);   //分页的总数
            int middleIndex     = GetMidPageIndex(pageCount);           //中间页的索引
            int firstIndex      = 0;                                    //第一页的索引
            int lastIndex       = pageCount - 1;                        //最后一页的索引
 
            #region @PageIndex <= @FirstIndex
            if (pageIndex <= firstIndex) {
                sb.Append("SELECT TOP ").Append(pageSize).Append(" ").Append(queryFields)
                    .Append(" FROM ").Append(tableName);
 
                if (condition != String.Empty)
                    sb.Append(" WHERE ").Append(condition);
 
                sb.Append(" ORDER BY ").Append(primaryKey).Append(" ")
                    .Append(GetSortType(ascending));
            }
            #endregion
 
            #region @FirstIndex < @PageIndex <= @MiddleIndex
            else if (pageIndex > firstIndex && pageIndex <= middleIndex) {
                sb.Append("SELECT TOP ").Append(pageSize).Append(" ").Append(queryFields)
                    .Append(" FROM ").Append(tableName)
                    .Append(" WHERE ").Append(primaryKey);
 
                if (ascending)
                    sb.Append(" > (").Append(" SELECT MAX(");
                else
                    sb.Append(" < (").Append(" SELECT MIN(");
 
                sb.Append(primaryKey).Append(") FROM ( SELECT TOP ")
                    .Append(pageSize*pageIndex).Append(" ").Append(primaryKey)
                    .Append(" FROM ").Append(tableName);
 
                if (condition != String.Empty)
                    sb.Append(" WHERE ").Append(condition);
 
                sb.Append(" ORDER BY ").Append(primaryKey).Append(" ")
                    .Append(GetSortType(ascending))
                    .Append(" ) TableA )");
 
                if (condition != String.Empty)
                    sb.Append(" AND ").Append(condition);
 
                sb.Append(" ORDER BY ").Append(primaryKey).Append(" ")
                    .Append(GetSortType(ascending));
            }
            #endregion
 
            #region @MiddleIndex < @PageIndex < @LastIndex
            else if (pageIndex > middleIndex && pageIndex < lastIndex) {
                sb.Append("SELECT * FROM ( SELECT TOP ")
                    .Append(pageSize).Append(" ").Append(queryFields)
                    .Append(" FROM ").Append(tableName)
                    .Append(" WHERE ").Append(primaryKey);
 
                if (ascending)
                    sb.Append(" < (").Append(" SELECT MIN(");
                else
                    sb.Append(" > (").Append(" SELECT MAX(");
 
                sb.Append(primaryKey).Append(") FROM ( SELECT TOP ")
                    .Append(recordCount-pageSize*(pageIndex+1)).Append(" ").Append(primaryKey)
                    .Append(" FROM ").Append(tableName);
 
                if (condition != String.Empty)
                    sb.Append(" WHERE ").Append(condition);
 
                sb.Append(" ORDER BY ").Append(primaryKey).Append(" ")
                    .Append(GetSortType(!ascending))
                    .Append(" ) TableA )");
 
                if (condition != String.Empty)
                        sb.Append(" AND ").Append(condition);
 
                sb.Append(" ORDER BY ").Append(primaryKey).Append(" ")
                    .Append(GetSortType(!ascending))
                    .Append(" ) TableB ORDER BY ").Append(primaryKey).Append(" ")
                    .Append(GetSortType(ascending));
            }
            #endregion
 
            #region @PageIndex >= @LastIndex
            else if (pageIndex >= lastIndex) {
                sb.Append("SELECT * FROM ( SELECT TOP ").Append(recordCount-pageSize*lastIndex)
                    .Append(" ").Append(queryFields)
                    .Append(" FROM ").Append(tableName);
 
                if (condition != String.Empty)
                    sb.Append(" WHERE ").Append(condition);
 
                sb.Append(" ORDER BY ").Append(primaryKey).Append(" ")
                    .Append(GetSortType(!ascending))
                    .Append(" ) TableA ORDER BY ").Append(primaryKey).Append(" ")
                    .Append(GetSortType(ascending));
            }
            #endregion
 
            return sb.ToString();
            #endregion
        }
 
        ///
        /// 获取根据指定字段排序并分页查询的 SELECT 语句。
        ///
        ///每页要显示的记录的数目。
        ///要显示的页的索引。
        ///数据表中的记录总数。
        ///要查询的数据表。
        ///要查询的字段。
        ///主键字段。
        public static String Paging(
            int pageSize,
            int pageIndex,
            int recordCount,
            String tableName,
            String queryFields,
            String primaryKey )
        {
            return Paging(pageSize, pageIndex, recordCount, tableName, queryFields, primaryKey,
                true, String.Empty);
        }
 
        ///
        /// 获取根据指定字段排序并分页查询的 SELECT 语句。
        ///
        ///每页要显示的记录的数目。
        ///要显示的页的索引。
        ///数据表中的记录总数。
        ///要查询的数据表。
        ///要查询的字段。
        ///主键字段。
        ///是否为升序排列。
        ///返回排序并分页查询的 SELECT 语句。
        public static String Paging(
            int pageSize,
            int pageIndex,
            int recordCount,
            String tableName,
            String queryFields,
            String primaryKey,
            bool ascending )
        {
            return Paging(pageSize, pageIndex, recordCount, tableName, queryFields, primaryKey,
                ascending, String.Empty);
        }
 
        ///
        /// 获取根据指定字段排序并分页查询的 SELECT 语句。
        ///
        ///每页要显示的记录的数目。
        ///要显示的页的索引。
        ///数据表中的记录总数。
        ///要查询的数据表。
        ///要查询的字段。
        ///主键字段。
        ///查询的筛选条件。
        ///返回排序并分页查询的 SELECT 语句。
        public static String Paging(
            int pageSize,
            int pageIndex,
            int recordCount,
            String tableName,
            String queryFields,
            String primaryKey,
            String condition )
        {
            return Paging(pageSize, pageIndex, recordCount, tableName, queryFields, primaryKey,
                true, condition);
        }
           
 
        ///
        /// 计算分页数。
        ///
        ///表中得记录总数。
        ///每页显示的记录数。
        ///分页数。
        public static int GetPageCount(int recordCount, int pageSize)
        {
            return (int)Math.Ceiling((double)recordCount/pageSize);
        }
 
        ///
        /// 计算中间页的页索引。
        ///
        ///分页数。
        ///中间页的页索引。
        public static int GetMidPageIndex(int pageCount)
        {
            return (int)Math.Ceiling((double)pageCount/2) - 1;
        }
 
        ///
        /// 获取排序的方式("ASC" 表示升序,"DESC" 表示降序)。
        ///
        ///是否为升序。
        ///排序的方式("ASC" 表示升序,"DESC" 表示降序)。
        public static String GetSortType(bool ascending)
        {
            return (ascending ? "ASC" : "DESC");
        }
 
        ///
        /// 获取一个布尔值,该值指示排序的方式是否为升序。
        ///
        ///排序的方式("ASC" 表示升序,"DESC" 表示降序)。
        ///"ASC"则为 true;"DESC"则为 false;其它的为 true。
        public static bool IsAscending(String orderType)
        {
            return ((orderType.ToUpper() == "DESC") ? false : true);
        }
    }
}
 
关注
打赏
1688896170
查看更多评论

暂无认证

  • 0浏览

    0关注

    108697博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录

0.4326s