作者:黎波

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的快速分页法——动态生成SQL语句相关推荐

  1. java 生成分页sql_DataGrid连接Access的快速分页法——动态生成SQL语句

    作者:黎波usingSystem;usingSystem.Text;namespacePagi 作者:黎波 using System; using System.Text; namespace Pag ...

  2. DataGrid连接Access的快速分页法(1)——需求与现状

    作者:黎波 一.需求分析      DataGrid是一个功能强大的ASP.NET Web服务器端控件,它除了能够按各种方式格式化显示数据,还可以对数据进行动态的排序.编辑和分页.大大减轻了广大Web ...

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

    作者:黎波 一.相关概念      在 ACCESS 数据库中,一个表的主键(PRIMARY KEY,又称主索引)上必然建立了唯一索引(UNIQUE INDEX),因此主键字段的值是不会重复的.并且索 ...

  4. DataGrid基于Access的快速分页法

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

  5. excel动态生成Sql语句

    文章目录 0. 前言 1. 先说结论 2. 例子 0. 前言 由于工作原因,无意中发现有时候有些数据来由形式是excel文件,需要把里面的值变成sql语句,然后去数据库中执行. 因此记录下如何让exc ...

  6. access下的分页方案(仿sql存储过程)

    using System; using System.Collections.Generic; using System.Text; using System.Data; using System.D ...

  7. mysql函数 动态语句_自定义函数动态执行SQL语句

    Oracle 动态SQL有两种写法:用 DBMS_SQL 或 execute immediate,建议使用后者. DDL 和 DML Sql代码 收藏代码 /*** DDL ***/ begin EX ...

  8. 码匠 × OpenAI :快速生成 SQL 语句,提升开发效率!

    目录 使用 OpenAI 生成 SQL 码匠连接与集成 OpenAI 总结 关于码匠 在码匠中,编写 SQL 语句,并结合码匠一系列开箱即用的组件实现复杂的业务逻辑,是很常见的应用开发场景.然而,不同 ...

  9. linux 软件集成工具箱,在PB中动态修改SQL语句

    在PB中动态修改SQL语句 分享到: 江苏省南通电信局网管中心 黄莹 ---- PowerBuilder是图形界面的Client/Server应用程序开发环境,可以很容易开发出功能强大的应用程序,在当 ...

最新文章

  1. C语言科学计算器思路,大神教你如何用C语言实现科学计算器
  2. 机器学习面试的12个基础问题,强烈推荐!
  3. springboot---成员初始化顺序
  4. .NET Core开发实战(第12课:配置变更监听)--学习笔记
  5. 【CodeForces - 195D】Analyzing Polyline (思维,卡精度的处理方式)
  6. 最短路径之Dijkstra算法
  7. 【算法】平衡二叉树 Avl 树
  8. LVM以及挂载一块新硬盘
  9. wireshark 分析mptcp ecn语句
  10. mysql基础之mariadb的安装,连接,用户,密码,权限设置语句详解
  11. android 向上弹出,android 弹出Popupwindow 自适用(Activity或者Dialog)判断向上还向下...
  12. MyBatis3_[tp_41-42-43]-_动态sql_trim_自定义字符串截取_choose分支选择_update的set与if-trim 结合的动态更新...
  13. 涂抹Oracle—三思笔记之一步一步学Oracle
  14. 利用SPI编写类似sockscap的代理工具
  15. 金融量化-SMA_移动平均及双均线模型
  16. 评价微型计算机有哪些主要性能指标,计算机性能指标有哪些
  17. 如何高效学习和阅读源码?
  18. Android 桌面小部件的背景透明度及颜色的动态实现
  19. 计算机网络原理(交换机,路由器详解)
  20. 骞云科技SmartCMP v3.0正式发布!

热门文章

  1. 四人过桥问题c语言编程,SQL趣题:四人过桥的问题
  2. opencv学习笔记(二)
  3. PCL调错:(3)error C2589“(“:“::“右边的非法标记
  4. C++:随笔6---new\delete\虚方法\抽象方法
  5. poj 2449 Remmarguts' Date 启发式搜索 A*算法
  6. ktor框架用到了netty吗_教你如何构建异步服务器和客户端的 Kotlin 框架 Ktor
  7. ios xib 四等分_ios Xib的几种用法[转]
  8. PCL common中常见的基础功能函数
  9. PCL点云配准(3)
  10. 在Ubuntu 16.04.3 LTS上安装Go 1.10