开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 2615|回复: 6
收起左侧

[Mysql] mssql access top分页方法

[复制链接]

结帖率:61% (35/57)
发表于 2013-6-15 19:40:35 | 显示全部楼层 |阅读模式   海南省海口市
mssql access top分页方法
双top法相比于not in和max法,就是可以传入一条sql语句来生成分页sql语句,也可多字段排序;
但是有利也有弊,它要求排序字段必须构成唯一记录,且select后的字段列表中,不允许出现与排序字段同名的字段。
虽然sql2k5及以上版本已经提供了rownum()来进行分页处理,但是使用sql2k进行开发的还是较多的
  1. using system;
  2. using system.collections.generic;
  3. using system.text;

  4. /// <summary>
  5. /// 构造分页后的sql语句
  6. /// </summary>
  7. public static class paginghelper
  8. {
  9.      /// <summary>
  10.      /// 获取分页sql语句,排序字段需要构成唯一记录
  11.      /// </summary>
  12.      /// <param name="_recordcount">记录总数</param>
  13.      /// <param name="_pagesize">每页记录数</param>
  14.      /// <param name="_pageindex">当前页数</param>
  15.      /// <param name="_safesql">sql查询语句</param>
  16.      /// <param name="_orderfield">排序字段,多个则用“,”隔开</param>
  17.      /// <returns>分页sql语句</returns>
  18.      public static string createpagingsql(int _recordcount, int _pagesize, int _pageindex, string _safesql, string _orderfield)
  19.      {
  20.          //重新组合排序字段,防止有错误
  21.          string[] arrstrorders = _orderfield.split(new char[] { ',' }, stringsplitoptions.removeemptyentries);
  22.          stringbuilder sboriginalorder = new stringbuilder(); //原排序字段
  23.          stringbuilder sbreverseo教程rder = new stringbuilder(); //与原排序字段相反,用于分页
  24.          for (int i = 0; i < arrstrorders.length; i++)
  25.          {
  26.              arrstrorders[i] = arrstrorders[i].trim();  //去除前后空格
  27.              if (i != 0)
  28.              {
  29.                  sboriginalorder.append(", ");
  30.                  sbreverseorder.append(", ");
  31.              }
  32.              sboriginalorder.append(arrstrorders[i]);

  33.             int index = arrstrorders[i].indexof(" "); //判断是否有升降标识
  34.              if (index > 0)
  35.              {
  36.                  //替换升降标识,分页所需
  37.                  bool flag = arrstrorders[i].indexof(" desc", stringcomparison.ordinalignorecase) != -1;
  38.                  sbreverseorder.appendformat("{0} {1}", arrstrorders[i].remove(index), flag ? "asc" : "desc");
  39.              }
  40.              else
  41.              {
  42.                  sbreverseorder.appendformat("{0} desc", arrstrorders[i]);
  43.              }
  44.          }

  45.         //计算总页数
  46.          _pagesize = _pagesize == 0 ? _recordcount : _pagesize;
  47.          int pagecount = (_recordcount + _pagesize - 1) / _pagesize;

  48.         //检查当前页数
  49.          if (_pageindex < 1)
  50.          {
  51.              _pageindex = 1;
  52.          }
  53.          else if (_pageindex > pagecount)
  54.          {
  55.              _pageindex = pagecount;
  56.          }

  57.         stringbuilder sbsql = new stringbuilder();
  58.          //第一页时,直接使用top n,而不进行分页查询
  59.          if (_pageindex == 1)
  60.          {
  61.              sbsql.appendformat(" select top {0} * ", _pagesize);
  62.              sbsql.appendformat(" from ({0}) as t ", _safesql);
  63.              sbsql.appendformat(" order by {0} ", sboriginalorder.tostring());
  64.          }
  65.          //最后一页时,减少一个top n
  66.         else if (_pageindex == pagecount)
  67.          {
  68.              sbsql.append(" select * from ");
  69.              sbsql.append(" ( ");
  70.              sbsql.appendformat(" select top {0} * ", _recordcount - _pagesize * (_pageindex - 1));
  71.              sbsql.appendformat(" from ({0}) as t ", _safesql);
  72.              sbsql.appendformat(" order by {0} ", sbreverseorder.tostring());
  73.              sbsql.append(" ) as t ");
  74.              sbsql.appendformat(" order by {0} ", sboriginalorder.tostring());
  75.          }
  76.          //前半页数时的分页
  77.          else if (_pageindex < (pagecount / 2 + pagecount % 2))
  78.          {
  79.              sbsql.append(" select * from ");
  80.              sbsql.append(" ( ");
  81.              sbsql.appendformat(" select top {0} * from ", _pagesize);
  82.              sbsql.append(" ( ");
  83.              sbsql.appendformat(" select top {0} * ", _pagesize * _pageindex);
  84.              sbsql.appendformat(" from ({0}) as t ", _safesql);
  85.              sbsql.appendformat(" order by {0} ", sboriginalorder.tostring());
  86.              sbsql.append(" ) as t ");
  87.              sbsql.appendformat(" order by {0} ", sbreverseorder.tostring());
  88.              sbsql.append(" ) as t ");
  89.              sbsql.appendformat(" order by {0} ", sboriginalorder.tostring());
  90.          }
  91.          //后半页数时的分页
  92.          else
  93.          {
  94.              sbsql.appendformat(" select top {0} * from ", _pagesize);
  95.              sbsql.append(" ( ");
  96.              sbsql.appendformat(" select top {0} * ", ((_recordcount % _pagesize) + _pagesize * (pagecount - _pageindex)));
  97.              sbsql.appendformat(" from ({0}) as t ", _safesql);
  98.              sbsql.appendformat(" order by {0} ", sbreverseorder.tostring());
  99.              sbsql.append(" ) as t ");
  100.              sbsql.appendformat(" order by {0} ", sboriginalorder.tostring());
  101.          }

  102.         return sbsql.tostring();
  103.      }

  104.     /// <summary>
  105.      /// 获取记录总数sql语句
  106.      /// </summary>
  107.      /// <param name="_n">限定记录数</param>
  108.      /// <param name="_safesql">sql查询语句</param>
  109.      /// <returns>记录总数sql语句</returns>
  110.      public static string createtopnsql(int _n, string _safesql)
  111.      {
  112.          return string.format(" select top {0} * from ({1}) as t ", _n, _safesql);
  113.      }

  114.     /// <summary>
  115.      /// 获取记录总数sql语句
  116.      /// </summary>
  117.      /// <param name="_safesql">sql查询语句</param>
  118.      /// <returns>记录总数sql语句</returns>
  119.      public static string createcountingsql(string _safesql)
  120.      {
  121.          return string.format(" select count(1) as recordcount from ({0}) as t ", _safesql);
  122.      }
  123. }
复制代码
结帖率:0% (0/1)
发表于 2022-10-28 14:06:14 | 显示全部楼层   河北省秦皇岛市
谢谢分享
回复 支持 反对

使用道具 举报

结帖率:100% (21/21)

签到天数: 1 天

发表于 2018-7-15 11:56:28 | 显示全部楼层   福建省泉州市
看不懂!!!!!!!
回复 支持 反对

使用道具 举报

结帖率:88% (15/17)
发表于 2016-8-4 17:40:12 | 显示全部楼层   广东省广州市
mssql access top分页方法
回复 支持 反对

使用道具 举报

结帖率:100% (5/5)
发表于 2013-6-23 17:55:54 | 显示全部楼层   广东省深圳市

这只是一次意外。。。。
回复 支持 反对

使用道具 举报

结帖率:37% (7/19)
发表于 2013-6-23 17:15:04 | 显示全部楼层   北京市北京市
完美俊 发表于 2013-6-15 19:42
还是看不懂。。。o(︶︿︶)o 唉   没文化 真可怕

沙发被你抢了
回复 支持 反对

使用道具 举报

结帖率:100% (5/5)
发表于 2013-6-15 19:42:26 | 显示全部楼层   广东省深圳市
还是看不懂。。。o(︶︿︶)o 唉   没文化 真可怕
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表