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

原创 2004年03月08日 11:26:00

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

using System;
using System.Text;
namespace Paging
{
    /// <summary>
    /// FastPaging 的摘要说明。
    /// </summary>
    public class FastPaging {
 
        private FastPaging() {
        }
 
        /// <summary>
        /// 获取根据指定字段排序并分页查询的 SELECT 语句。
        /// </summary>
        /// <param name="pageSize">每页要显示的记录的数目。</param>
        /// <param name="pageIndex">要显示的页的索引。</param>
        /// <param name="recordCount">数据表中的记录总数。</param>
        /// <param name="tableName">要查询的数据表。</param>
        /// <param name="queryFields">要查询的字段。</param>
        /// <param name="primaryKey">主键字段。</param>
        /// <param name="ascending">是否为升序排列。</param>
        /// <param name="condition">查询的筛选条件。</param>
        /// <returns>返回排序并分页查询的 SELECT 语句。</returns>
        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
        }
 
        /// <summary>
        /// 获取根据指定字段排序并分页查询的 SELECT 语句。
        /// </summary>
        /// <param name="pageSize">每页要显示的记录的数目。</param>
        /// <param name="pageIndex">要显示的页的索引。</param>
        /// <param name="recordCount">数据表中的记录总数。</param>
        /// <param name="tableName">要查询的数据表。</param>
        /// <param name="queryFields">要查询的字段。</param>
        /// <param name="primaryKey">主键字段。</param>
        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);
        }
 
        /// <summary>
        /// 获取根据指定字段排序并分页查询的 SELECT 语句。
        /// </summary>
        /// <param name="pageSize">每页要显示的记录的数目。</param>
        /// <param name="pageIndex">要显示的页的索引。</param>
        /// <param name="recordCount">数据表中的记录总数。</param>
        /// <param name="tableName">要查询的数据表。</param>
        /// <param name="queryFields">要查询的字段。</param>
        /// <param name="primaryKey">主键字段。</param>
        /// <param name="ascending">是否为升序排列。</param>
        /// <returns>返回排序并分页查询的 SELECT 语句。</returns>
        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);
        }
 
        /// <summary>
        /// 获取根据指定字段排序并分页查询的 SELECT 语句。
        /// </summary>
        /// <param name="pageSize">每页要显示的记录的数目。</param>
        /// <param name="pageIndex">要显示的页的索引。</param>
        /// <param name="recordCount">数据表中的记录总数。</param>
        /// <param name="tableName">要查询的数据表。</param>
        /// <param name="queryFields">要查询的字段。</param>
        /// <param name="primaryKey">主键字段。</param>
        /// <param name="condition">查询的筛选条件。</param>
        /// <returns>返回排序并分页查询的 SELECT 语句。</returns>
        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);
        }
           
 
        /// <summary>
        /// 计算分页数。
        /// </summary>
        /// <param name="recordCount">表中得记录总数。</param>
        /// <param name="pageSize">每页显示的记录数。</param>
        /// <returns>分页数。</returns>
        public static int GetPageCount(int recordCount, int pageSize)
        {
            return (int)Math.Ceiling((double)recordCount/pageSize);
        }
 
        /// <summary>
        /// 计算中间页的页索引。
        /// </summary>
        /// <param name="pageCount">分页数。</param>
        /// <returns>中间页的页索引。</returns>
        public static int GetMidPageIndex(int pageCount)
        {
            return (int)Math.Ceiling((double)pageCount/2) - 1;
        }
 
        /// <summary>
        /// 获取排序的方式("ASC" 表示升序,"DESC" 表示降序)。
        /// </summary>
        /// <param name="ascending">是否为升序。</param>
        /// <returns>排序的方式("ASC" 表示升序,"DESC" 表示降序)。</returns>
        public static String GetSortType(bool ascending)
        {
            return (ascending ? "ASC" : "DESC");
        }
 
        /// <summary>
        /// 获取一个布尔值,该值指示排序的方式是否为升序。
        /// </summary>
        /// <param name="orderType">排序的方式("ASC" 表示升序,"DESC" 表示降序)。</param>
        /// <returns>"ASC"则为 true;"DESC"则为 false;其它的为 true。</returns>
        public static bool IsAscending(String orderType)
        {
            return ((orderType.ToUpper() == "DESC") ? false : true);
        }
    }
}
 
 
作者:黎波

DataGrid连接Access的快速分页法(2)——SQL语句的选用(升序与降序)

作者:黎波一、相关概念     在 ACCESS 数据库中,一个表的主键(PRIMARY KEY,又称主索引)上必然建立了唯一索引(UNIQUE INDEX),因此主键字段的值是不会重复的。并且索引页...
  • 21aspnet
  • 21aspnet
  • 2004年12月23日 10:20
  • 3347

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

作者:黎波using System;using System.Text;namespace Paging{    ///     /// FastPaging 的摘要说明。    ///     pu...
  • 21aspnet
  • 21aspnet
  • 2004年12月23日 10:22
  • 2386

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

 DataGrid连接Access的快速分页法(4)——动态生成SQL语句using System;using System.Text;namespace Paging{    ///     ///...
  • xwqjamky
  • xwqjamky
  • 2005年10月14日 09:07
  • 396

高效率的Access\MSSQL分页的SQL语句

采用Access数据库有许多优点,比如数据库无须专门的数据库空间,使用,备份,迁移也非常方便。 但一旦数据量到达上万条,上十万条甚至更多的时候,ACCESS的大数据量的列表分页效率问题就出现了。 ...
  • qq269228887
  • qq269228887
  • 2013年10月31日 11:49
  • 731

ACCESS数据库分页的SQL语句

/**************************************************************/   作者:wallimn、邮件:wallimn@sohu.com) ...
  • wallimn
  • wallimn
  • 2007年09月10日 09:44
  • 17114

access 分页用 SQL查询语句

select top 每页显示的记录数 * from topic where id not in (select top (当前的页数-1)×每页显示的记录数 id from topic order ...
  • liehuo123
  • liehuo123
  • 2009年09月25日 23:43
  • 4174

DataGrid基于Access的快速分页法

DataGrid基于Access的快速分页法 撰文/ 黎波 DataGrid是一个功能非常强大的ASP.NET Web服务器端控件,它除了能够方便地按各种方式格式化显示表格中的数据,还可以对表格中的数...
  • sunwestern
  • sunwestern
  • 2004年11月29日 11:49
  • 808

DataGrid基于Access的快速分页法

http://soft.yesky.com/SoftChannel/72342380468043776/20041004/1860645.shtml
  • slightboy
  • slightboy
  • 2004年10月25日 09:12
  • 753

design项目:2、mybatis + easyui datagrid 分页查询功能介绍

design 项目,用mybatis 来操作数据库 。页面展示 用 easyui 的 datagrid 来生成 table。 先说 mybatis 的分页查询。 下面是mybatis 分页的原理。 分...
  • u012246342
  • u012246342
  • 2017年07月04日 06:31
  • 483

DataGrid连接Access的快速分页法(3)——SQL语句的选

  • zgqtxwd
  • zgqtxwd
  • 2008年04月24日 10:12
  • 88
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:DataGrid连接Access的快速分页法(4)——动态生成SQL语句
举报原因:
原因补充:

(最多只允许输入30个字)