sql 数据的分页 自称完美的实现
来源:互联网 发布:linux 时间戳转时间 编辑:程序博客网 时间:2024/04/29 16:01
数据的分页 留下该函数,朋友们看懂应该没什么问题,如果有疑问留言,会在第一时间内帮你解决。注释的部分在速度和版本上都会有问题,没有注释的sql 是通用的,最起码在sql server 系列上是通用的。请大家拍砖我的 数据的分页
/// <summary> /// 数据的分页 分页WithCommand /// </summary> /// <param name="cmd">执行命令 该命令必须指定了SQL语句</param> /// <param name="PageIndex">页数</param> /// <param name="PageSize">页大小</param> /// <param name="OrderBy">排序字段 比如 : ID DESC </param> /// <param name="TotalCount">返回总记录数</param> /// <returns>datatable</returns> public static DataTable PagerWithCommand(SqlCommand cmd, int PageIndex, int PageSize, string OrderBy, ref int TotalCount) { //变量定义 StringBuilder sbSql = new StringBuilder(); //第一页时 if (PageIndex == 1) { sbSql.Append("SELECT TOP " + PageSize + " * FROM (" + cmd.CommandText + ") as tempTable Order by " + OrderBy + ";"); } else { // sql 2005 数据的分页 版本以上才可以用 // sbSql.Append("SELECT TOP " + PageSize * PageIndex + " * FROM (" + cmd.CommandText + ") AS tempTable except select top " + PageSize * (PageIndex - 1) + " * from (" + cmd.CommandText + ") AS tempTable Order by " + OrderBy + ";"); // sql 2005 数据的分页 以上才能使用,使用row_number() 速度比较慢 //sbSql.AppendLine(" select * from "); //sbSql.AppendLine(" (select row_number() over (order by "+ OrderBy +" ) as RowID, *"); //sbSql.AppendLine(" from (" + cmd.CommandText + ") as bb ) as aa "); //sbSql.AppendLine(" where aa.RowID between " + (PageIndex - 1) * PageSize + " and " + PageIndex *PageSize + ";"); // sql 2000 数据的分页 版本以上均可 适合数据量比较小 //sbSql.AppendLine(@" select identity(int, 1, 1) as id_PageRowID, * into #tmpPageTable from ( " // + cmd.CommandText + ") table_TempPage ;"); //sbSql.AppendLine(@"select top " + PageSize + " * from #tmpPageTable where id_PageRowID between " // + (PageIndex - 1) * PageSize + "+ 1 and " + PageIndex * (PageSize ) + " ;"); //sbSql.AppendLine(@" drop table #tmpPageTable;"); // sql 2000 版本以上 使用排序 sbSql.AppendLine(" select * from "); sbSql.AppendLine(" (select top " + PageSize + " * from "); sbSql.AppendLine(" (select top " + PageIndex * (PageSize) + " * "); sbSql.AppendLine(" from ( " + cmd.CommandText + " ) a order by " + OrderBy + ")b order by " + GetReverseOrder(OrderBy) + ") c "); sbSql.AppendLine(" order by " + OrderBy + " "); } sbSql.Append(" SELECT @TotalRecord = count(*) FROM (" + cmd.CommandText + ") tempTable"); //重新设置命令SQL语句 cmd.CommandText = sbSql.ToString(); //总记录数 SqlParameter param = new SqlParameter("@TotalRecord", SqlDbType.Int); param.Direction = ParameterDirection.Output; cmd.Parameters.Add(param); DataTable dtTemp = ExecuteSearch(cmd); TotalCount = (int)cmd.Parameters["@TotalRecord"].Value; return dtTemp; } /// <summary> /// 获得反序 . /// </summary> /// <param name="orderBy">排序字段.</param> /// <returns>获得反序的排序字段</returns> static string GetReverseOrder(string orderBy) { orderBy = orderBy.ToLower(); if (orderBy.Contains(" asc")) { orderBy = orderBy.Replace(" asc", " desc"); } else if (orderBy.Contains(" desc")) { orderBy = orderBy.Replace(" desc", " asc"); } else { orderBy = orderBy + " desc"; } return orderBy; }
上述分页存在一些问题,当查询到最后一页时,不管最后一页数据够不够PageSize条记录,那么查询出的数据总是PageSize条记录,不合理是吧。那么修订的方案如下:
/// <summary> /// 分页WithCommand /// </summary> /// <param name="cmd">执行命令 该命令必须指定了SQL语句</param> /// <param name="PageIndex">页数</param> /// <param name="PageSize">页大小</param> /// <param name="OrderBy">排序字段 比如 : ID DESC </param> /// <param name="TotalCount">返回总记录数</param> /// <returns>datatable</returns> public static DataTable PagerWithCommand(SqlCommand cmd, int PageIndex, int PageSize, string OrderBy, ref int TotalCount) { //变量定义 StringBuilder sbSql = new StringBuilder(); // 先计算总记录数 sbSql.AppendLine(" SELECT @TotalRecord = count(*) FROM (" + cmd.CommandText + ") tempTable ;"); //第一页时 if (PageIndex == 1) { sbSql.Append(" SELECT TOP (@PageSize) * FROM (" + cmd.CommandText + ") as tempTable Order by " + OrderBy + ";"); } else { // sql 2005 版本以上才可以用 // sbSql.Append("SELECT TOP " + PageSize * PageIndex + " * FROM (" + cmd.CommandText + ") AS tempTable except select top " + PageSize * (PageIndex - 1) + " * from (" + cmd.CommandText + ") AS tempTable Order by " + OrderBy + ";"); // sql 2000 版本以上均可 适合数据量比较小 //sbSql.AppendLine(@" select identity(int, 1, 1) as id_PageRowID, * into #tmpPageTable from ( " // + cmd.CommandText + ") table_TempPage ;"); //sbSql.AppendLine(@"select top " + PageSize + " * from #tmpPageTable where id_PageRowID between " // + (PageIndex - 1) * PageSize + "+ 1 and " + PageIndex * (PageSize ) + " ;"); //sbSql.AppendLine(@" drop table #tmpPageTable;"); // sql 2000 版本以上 使用排序 sbSql.AppendLine(" select * from "); // 如果是最后一页数据条数 小于pagesize,那么只选择 实际数据的记录数 sbSql.AppendLine(" (select top (case when @TotalRecord < @PageIndex*@PageSize then @TotalRecord - (@PageIndex-1)*@PageSize else @PageSize end) * from "); sbSql.AppendLine(" (select top (@PageIndex*@PageSize) * "); sbSql.AppendLine(" from ( " + cmd.CommandText + " ) a order by " + OrderBy + ")b order by " + GetReverseOrder(OrderBy) + ") c "); sbSql.AppendLine(" order by " + OrderBy + " "); } //重新设置命令SQL语句 cmd.CommandText = sbSql.ToString(); /* 将分页参数追加至SqlParameter */ //当前页 SqlParameter param = new SqlParameter("@PageIndex", SqlDbType.Int); param.Value = PageIndex; cmd.Parameters.Add(param); //每页显示数 param = new SqlParameter("@PageSize", SqlDbType.Int); param.Value = PageSize; cmd.Parameters.Add(param); //总记录数 param = new SqlParameter("@TotalRecord", SqlDbType.Int); param.Direction = ParameterDirection.Output; cmd.Parameters.Add(param); DataTable dtTemp = ExecuteSearch(cmd); TotalCount = (int)cmd.Parameters["@TotalRecord"].Value; return dtTemp; }
哈哈……
- sql 数据的分页 自称完美的实现
- 海量数据实现分页的sql语句
- PHP完美分页类的实现
- 数据分页的实现
- 数据分页的实现
- 简单的实现分页获取数据的sql语句
- SQL Server 2005 的新增功能实现数据分页
- 查询分页的SQL实现
- SQL分页排序的实现
- MyBatis数据分页的实现
- ajax两个网页实现完美的 分页功能
- 数据分页模块系列 完美封装PageModel实现分页模块
- gridview的完美分页功能
- SQL语句实现数据分页
- 使用SQL实现数据分页
- sql分页时出现重复的数据。
- SQL Server 2005: 利用新的ranking函数实现高效的数据分页操作
- 探讨在1000万条数据的MS SQL SERVER数据库中实现快速的数据提取和数据分页
- oracle 9i升级到oracle9208数据库
- 甜蜜蜜
- wordpress :如何以编程方式插入数据
- 最长递增子序列编程之美232算法
- framebuffer的探讨
- sql 数据的分页 自称完美的实现
- 电信术语
- 利用global mapper 等高线地图的制作方法
- [乐意黎原创] 如何用BAT删除文件名中特定的几个字?
- 面向对象的三个基本特征(讲解)
- 解决PowerDesigner中Name与Code同步的问题
- 二进制、八进制、十进制、十六进制之间转换
- 两个函数中的局部变量
- C#中类的分类