当前位置: 首页 > news >正文

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

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);
}
}
}
作者:黎波

相关文章:

  • Linux超级超级管理pkexec权限完美解决/etc/sudoers、/etc/sudoers.d is world writable和kex_exchange
  • DataGrid连接Access的快速分页法(3)——SQL语句的选用(降序)
  • 在 Linux 上安装 FL Studio
  • DataGrid连接Access的快速分页法(2)——SQL语句的选用(升序)
  • 音乐人声分离[源码教程连接]
  • SoundTouch音频处理库
  • DataGrid连接Access的快速分页法(1)——需求与现状
  • 自动驾驶:使用 3D 时空卷积网络的自监督点云预测
  • 文件共享的新面孔——《纽约时报》专访BitTorrent之父
  • 实战OpenPose项目1:开篇使用文档
  • 实战OpenPose项目2:开发环境配置与demo运行
  • Martin Fowler:设计已死?
  • 实战OpenPose项目3:pytorch 实现openpose(包括手和身体姿态估计)
  • 下一步CSDN Blog要增加和完善的功能
  • 实战OpenPose项目4:实时准确的全身多人姿态估计和跟踪系统
  • 《Java编程思想》读书笔记-对象导论
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • js ES6 求数组的交集,并集,还有差集
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • node学习系列之简单文件上传
  • storm drpc实例
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • vue脚手架vue-cli
  • zookeeper系列(七)实战分布式命名服务
  • 关于Flux,Vuex,Redux的思考
  • 回顾2016
  • 简单数学运算程序(不定期更新)
  • 前嗅ForeSpider中数据浏览界面介绍
  • 使用docker-compose进行多节点部署
  • 树莓派 - 使用须知
  • 网页视频流m3u8/ts视频下载
  • 学习ES6 变量的解构赋值
  • 异步
  • 由插件封装引出的一丢丢思考
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • ​油烟净化器电源安全,保障健康餐饮生活
  • #{}和${}的区别是什么 -- java面试
  • #if #elif #endif
  • #mysql 8.0 踩坑日记
  • (function(){})()的分步解析
  • (libusb) usb口自动刷新
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (二)fiber的基本认识
  • (分布式缓存)Redis持久化
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...