打造通用的分页排序查询表格

打造通用的分页排序查询表格
打造通用的分页排序查询表格

一,ligerGrid是如何工作的。

在没有开始做之前,需要先了解一下ligerGrid是如何工作的。简单来说,liger grid 就是提交准备好的数据到指定的目标请求数据,拿到数据以后,显示出来。

所以问题在于发送什么数据,拿到什么数据。先来看看ligerGrid的参数:

url: null,

pageSize: 10,

sortName : null,

sortOrder:null,

root :'Rows', //数据源字段名

record:'Total', //数据源记录数字段名

pageParmName :'page', //页索引参数名,(提交给服务器)

pagesizeParmName:'pagesize', //页记录数参数名,(提交给服务器)

sortnameParmName:'sortname', //页排序列名(提交给服务器)

sortorderParmName:'sortorder', //页排序方向(提交给服务器)

发送什么数据

page、pagesize、sortname、sortorder 这几个是默认发送到服务器的参数,可用于正确返回分页、排序后的数据。如果需要查询,可能需要配置一下parms,格式如

parms:[{name:'wherestr',value:'status="active"'}] ,这样后台就可以收到这个参数了

比如我在页面上这样配置:

pageSize: 30,url: "service/BillListData.ashx?gridviewname=authors", sortName: 'au_id'

后台收到的数据,将会是:

拿到什么数据

Rows、Total这两个是返回数据的默认字段名,Rows是数据的json格式,Total是记录的总数,需要的数据类似这样的:

效果如下:

二,存储过程

CREATE PROCEDURE[dbo].[P_GridViewPager] (

@recordTotal INT OUTPUT, --输出记录总数

@viewName VARCHAR(800), --表名

@fieldName VARCHAR(800) ='*', --查询字段

@keyName VARCHAR(200) ='Id', --索引字段

@pageSize INT=20, --每页记录数

@pageNo INT=1, --当前页

@orderString VARCHAR(200), --排序条件

@whereString VARCHAR(800) ='1=1'--WHERE条件)

AS

BEGIN

DECLARE@beginRow INT

DECLARE@endRow INT

DECLARE@tempLimit VARCHAR(200)

DECLARE@tempCount NVARCHAR(1000)

DECLARE@tempMain VARCHAR(1000)

SET@beginRow= (@pageNo-1) *@pageSize+1

SET@endRow=@pageNo*@pageSize

SET@tempLimit='rows BETWEEN '+CAST(@beginRow AS VARCHAR) +' AND '+CAST(@endRow AS VARCHAR)

--输出参数为总记录数

SET@tempCount='SELECT @recordTotal = COUNT(*) FROM (SELECT '+@keyName+' FROM '+@viewName+' WHERE '+@whereString+') AS my_temp' EXECUTE sp_executesql @tempCount,N'@recordTotal INT

OUTPUT',@recordTotal OUTPUT

--主查询返回结果集

SET@tempMain='SELECT * FROM (SELECT ROW_NUMBER() OVER ('+@orderString+') AS rows ,'+@fieldName+' FROM '+@viewName+' WHERE

'+@whereString+') AS main_temp WHERE '+@tempLimit

--PRINT @tempMain

EXECUTE (@tempMain)

END

GO

三,准备一个通用的ashx页面

<%@ WebHandler Language="C#" Class="BillListData" %>

using System;

using System.Web;

using https://www.360docs.net/doc/7617937618.html,mon;

using ligerUI.Utility.LigerGrid;

public class BillListData : IHttpHandler {

public void ProcessRequest (HttpContext context) {

context.Response.ContentType = "text/plain";

try

{

TryGetGridViewData();

}

catch (Exception err)

{

context.Response.Write("null");

}

context.Response.End();

}

public void TryGetGridViewData()

{

System.Web.HttpContext context = System.Web.HttpContext.Current;

GridViewPager pager = new GridViewPager();

string datajson = pager.GetDataJSON();

context.Response.Write(datajson);

}

public bool IsReusable {

get {

return false;

}

}

}

四,实现处理方法(接收分页排序信息,并返回正确的数据)

public DataTable GetGridView(string gridViewName, string fieldName, string gridKeyName, int pageNo, i nt pageSize, string orderStr, string whereStr, ref int recordTotal)

{

string sqlCommad = "P_GridViewPager";

SqlParameter[] parms = new SqlParameter[]{

new SqlParameter("viewName",SqlDbType.VarChar,50),

new SqlParameter("fieldName",SqlDbType.VarChar,50),

new SqlParameter("keyName",SqlDbType.VarChar,50),

new SqlParameter("pageNo",SqlDbType.Int),

new SqlParameter("pageSize",SqlDbType.Int),

new SqlParameter("orderString",SqlDbType.VarChar,50),

new SqlParameter("whereString",SqlDbType.VarChar,50),

new SqlParameter("recordTotal",SqlDbType.VarChar,50)

};

parms[0].Value = gridViewName;

parms[1].Value = fieldName;

parms[2].Value = gridKeyName;

parms[3].Value = pageNo;

parms[4].Value = pageSize;

parms[5].Value = orderStr;

parms[6].Value = whereStr;

parms[7].Direction = ParameterDirection.Output;

DataTable dt = SqlHelper.ExecuteDataset(DataBaseHelper.connectionstring, CommandType.Stored Procedure, sqlCommad, parms).Tables[0];

recordTotal = CommonHelper.ObjToInt(parms[7].Value);

return dt;

}

public string GetDataJSON()

{

System.Web.HttpContext ctx = System.Web.HttpContext.Current;

int pageno = CommonHelper.ObjToInt(ctx.Request.Params["page"]);

int pagesize = CommonHelper.ObjToInt(ctx.Request.Params["pagesize"]);

string sortname = CommonHelper.ObjToStr(ctx.Request.Params["sortname"]);

string sortorder = CommonHelper.ObjToStr(ctx.Request.Params["sortorder"]);

string gridviewname = CommonHelper.ObjToStr(ctx.Request.Params["gridviewname"]);

string gridsearch = CommonHelper.ObjToStr(ctx.Request.Params["gridsearch"]);

if (string.IsNullOrEmpty(gridviewname))

throw new ArgumentNullException("Grid视图名[gridsearch]不能为空");

if (pageno == 0 || pagesize == 0)

{

if (string.IsNullOrEmpty(sortorder) && string.IsNullOrEmpty(gridsearch))

{

return GetDataJSON(gridviewname);

}

if(string.IsNullOrEmpty(sortorder))

return GetDataJSON(gridviewname, gridsearch);

if (string.IsNullOrEmpty(gridsearch))

return GetDataJSONUseSQL(string.Format("select * from {0} order by {1} {2}", gridviewnam e, sortname, sortorder.ToLower() == "asc" ? "asc" : "desc"));

return GetDataJSON(gridviewname, gridsearch, string.Format("order by {0} {1}", sortname, sorto rder));

}

if (string.IsNullOrEmpty(gridsearch) && string.IsNullOrEmpty(sortname))

{

return GetDataJSON(gridviewname, pageno, pagesize);

}

if (string.IsNullOrEmpty(gridsearch) && !string.IsNullOrEmpty(sortname))

{

return GetDataJSON(gridviewname, pageno, pagesize, sortname, sortorder);

}

if (!string.IsNullOrEmpty(gridsearch) && string.IsNullOrEmpty(sortname))

{

return GetDataJSON(gridviewname, pageno, pagesize, gridsearch);

}

if (!string.IsNullOrEmpty(gridsearch) && !string.IsNullOrEmpty(sortname))

{

return GetDataJSON(gridviewname, pageno, pagesize, sortname, sortorder, gridsearch); }

return@"{""Rows"":[],""Total"":""0""}";

}

分页排序

Imports System.Data Imports System.Data.OleDb Partial Class Default3 Inherits System.Web.UI.Page Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load If Page.IsPostBack = False Then '将课程名称绑定到下拉列表中。 Dim conn As New OleDbConnection("provider=microsoft.jet.oledb.4.0;data source=" & Server.MapPath("学生成绩管理.mdb")) Dim cmd As New OleDbCommand("select * from 课程编号表", conn) Dim ds As New DataSet Dim daap As New OleDbDataAdapter(cmd) daap.Fill(ds, "课程表") dro.DataSource = ds.Tables("课程表") dro.DataTextField = "课程名称" dro.DataValueField = "课程编号" dro.DataBind() ' 因为加了排序功能而添加的适应代码------------------------- Cache("sortField") = "学号" '---------------------------------------------------------- '根据下拉列表的选定的科目显示该科目的学生成绩。 Call bind(dro.SelectedValue) End If End Sub Protected Sub dro_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles dro.SelectedIndexChanged '因为加了分页功能而添加的适应代码------------------------- DG1.CurrentPageIndex = 0 '--------------------------------------------------------- Call bind(dro.SelectedValue) End Sub

对webmvc分页和排序的支持(非常实用)

在实际?工作中,我们经常有排序和分?页的需求,很多?小伙伴都在写?自?己的 Page 对象和排序逻辑,通过本节内容我们来看下 Spring Data JPA 对分?页和排序做了哪些?支持。 Spring Data 附带各种 Web ?支持如果模块?支持库的编程模型。通过 @EnableSpringDataWebSupport 这个注解可以启?用 Web 集成?支持。@EnableSpringDataWebSupport 注解配置在 JavaCon?g 类上即可,如下:@Configuration @EnableWebMvc //开启?支持Spring Data web 的?支持@EnableSpringDataWebSupport public class WebConfiguration { }@Controller 上直接使?用 org.springframework.data.domain.Pageable 接收 Page 和分?页相关参数,利?用org.springframework.data.domain.Page 可以返回相关的 Page 对象的值,如下: 第10课:对 MVCWeb 的?支持分?页和排序的?支持 配置?方法利?用 @EnableSpringDataWebSupport G i t C h a t

import org.springframework.data.domain.Page;import org.springframework.data.domain.PageRequest;import org.springframework.data.domain.Sort;@Controller @RequestMapping(path = "/demo")public class UserInfoController { @Autowired private UserRepository userRepository;/** * 案例1:使?用分?页和排序的 Pageable 对象返回 Page 对象。 * @param pageable * @return */@RequestMapping(path = "/user/page")@ResponseBody public Page findAllByPage(Pageable pageable) { return userRepository.findAll(pageable);}/** * 案例2:单独使?用排序,返回 HttpEntity 结果 * @param sort * @return */@RequestMapping(path = "/user/sort")@ResponseBody public HttpEntity> findAllBySort(Sort sort) { return new HttpEntity(userRepository.findAll(sort));}} 这种?方法签名会导致 Spring MVC 尝试可分?页实例,?而请求参数使?用默认配置如下:Pageable ?里?面的字段描述page 你想要查找的第?几?页,如果你不传,默认是 0size 分?页?大?小,默认是 20sort 属性,应按格式 property,property(ASC|DESC)。默认排序升序从?小到?大 ASC ,使?用多个 sort 参数,如果你想切换?方向,例如,?sort=?rstname&sort=lastname,asc 所以请求的?方式如下。 (1)$ curl http://127.0.0.1:8080/demo/user/page G i t C h a t

Excel中自动插入分页符

Excel中自动插入分页符 每年处理学生助学数据,有一千多行。汇总完后需要分班打印,求解自动插入分页符问题。思路:依班级排序,遍历班级单元格,当下一单元格与上一单元格内容不同时,插入分页符。在网上查的资料: 在单元格区域中循环 参阅特性使用 Visual Basic 时,经常需要对某一单元格区域内的每个单元格运行同一段语句。为达到这一目的,可组合循环语句和一个或多个方法来标识每个单元格,一次针对一个单元格,并执行该操作。 在单元格区域中循环的一种方法是将 For...Next 循环语句与 Cells 属性配合使用。使用 Cells 属性时,可用循环计数器(或其他变量或表达式)来替代单元格索引编号。下例中,变量 counter 代替了行号。此过程将在单元格区域 C1:C20 中循环,将所有绝对值小于 0.01 的数字都设置为 0(零)。 Sub RoundToZero1() For Counter = 1 To 20 Set curCell = Worksheets("Sheet1").Cells(Counter, 3) If Abs(curCell.Value) < 0.01 Then curCell.Value = 0 Next Counter End Sub 在单元格区域中循环的另一种简便方法是使用 For Each...Next 循环语句和由 Range 属性指定的单元格集合。在每一次循环过程中,Visual Basic 都为下一个单元格自动设置一个对象变量。下述过程在单元格区域 A1:D10 中循环,将所有绝对值小于 0.01 的数字都设置为 0(零)。 Sub RoundToZero2() For Each c In Worksheets("Sheet1").Range("A1:D10").Cells If Abs(c.Value) < 0.01 Then c.Value = 0 Next End Sub 如果不知道要循环的单元格区域的边界,可用 CurrentRegion 属性返回活动单元格周围的区域。例如,下述过程在工作表上运行时,将在活动单元格周围的区域内循环,将所有绝对值小于 0.01 的数字都设置为 0(零)。 Sub RoundToZero3() For Each c In ActiveCell.CurrentRegion.Cells If Abs(c.Value) < 0.01 Then c.Value = 0 Next End Sub

四十二:DataList与Repeater数据排序(一)

作者:heker2007 字体:[增加减小] 类型:转载时间:2016-05-14我要评论 本文主要介绍利用ObjectDataSource的Selecting事件进行DataList和Repeater数据排序的方法,DropDownList隐式的为我们将sort expression 和direction保存在它的view state 里,进行分页时从view state中取出条件进行排序。 导言 DataList和Repeater数据分页里我们学习了如何在DataList里添加分页功能。我们在ProductsBLL类里创建了一个名为GetProductsAsPagedDataSource的方法,它返回一个Pa gedDataSource对象。当绑定到DataList或Repeater时,他们将只显示请求页的数据。这个技术和GridView,DetailsView,FormView的内置分页功能原理差不多。 除了分页外,GridView还提供了内置的排序功能,而DataList和Repeater都没有。然而排序功能可以通过一点点代码就实现。本章我们将学习如何在DataList和Repeater里实现排序功能,我们还将创建一个同时支持分页和排序的DataList或Repeater。 回顾一下排序 如我们在分页和排序报表数据里看到的,GridView提供了排序的支持。每个GridView 的字段可以有一个关联的SortExpression,它指明了对数据进行排序依据的字段。当GridVi ew的AllowSorting属性设为true时,每个包含SortExpression 属性的GridView的字段的header都表现为一个LinkButton。当点一个header时,页面postback,数据会根据被点字段的SortExpression进行排序。另外,SortDirection属性指明了数据是升序或降序。 当将GridView绑定到数据源控件时,它会将SortExpression和SortDirection传给数据源控件。数据源控件获取数据并根据SortExpression和SortDirection进行排序。然后将数据返回给GridView。 在DataList或Repeater里实现这个功能,我们需要: 创建一个排序界面 将排序的字段和方向(升序或降序)记下 指导ObjectDataSource根据特定字段排序 我们将在第三和四步来处理上面三个步骤。然后我们将看看如何让DataList或Repeat er同时支持这两个功能(分页和排序)。 第二步: 在Repeater里显示Products 在实现排序功能前,首先创建一个列出所有product的Repeater。打开PagingSorting DataListRepeater文件夹里的Sorting.aspx页。添加一个Repeater,将ID设为SortableProd ucts。从智能标签里创建一个名为ProductsDataSource的ObjectDataSource。用Products BLL类的GetProducts()方法配置它。在INSERT, UPDATE, DELETE标签的下拉列表里选择“(None)”。

word重新排序页码

Word页码重新排序 在日常的文档编辑中,插入页码对每个人都不是问题。而用Word编辑一本书或编辑一份试卷时,一定会发现页码的默认设置远远满足不了我们的需求,而了解以下知识,将帮助你解决页码设置中遇到的一些问题。 1、常用的页码插入方法 打开文档,单击菜单插入/页码,在弹出的页码对话框中,(常规做法)位置选择“页面底端(页脚)”,对齐方式选择“居中”,其余选项处于默认即可。 2、装饰页码 一般页码显示只有阿拉伯数字,我们还可以用小符号或小图片之类的装饰一下页码。具体操作方法:双击页脚位置,再单击页码,使其处于可编辑状态后,将光标移至<页码>相应位置处插入/符号,选择你所要的符号“.”即可,同理,输入其它文字也可以用这种方法。如果在每页页码的相同位置都显示一幅小图片呢?这样操作:双击页脚位置,进入页脚编辑状态,插入/图片或自己画一个也行,注意,将图片移到页脚。 如果你厌倦了页码的字体,可通过修改字体来改变。操作:双击任意一页码,选中(即涂黑)页码,选择你所要的字体就行了。 3、封面不显示页码,正文页码从1开始 一般情况下,文章封面只有一页且内容是标题,是不需要显示页码的,页码是从正文开始且为1。 操作:单击插入/页码,弹出的页码对话框中,将“首页显示页码”的选项取消即可。但是要做到正文页码从1开始,就必须在页码对话框中单击“格式”,在页码格式对话框的“页码编排”栏中,选“起始页码”,并设置页码数为0。起始页不显示页码,正好为0,若起始页码数为1的话,正文首页页码就是2了。 4、正文前几页不显示页码 当你编辑一本书时,前面几页往往是封面、序言、目录,这几页是不需要页码的,或者要单独计算页码的。这时,我们只要学会使用分节符就可以轻松搞定了。 操作:①将插入点移至正文页起始位置,单击插入/分隔符,在分隔符对话框中,分节符类型选择“下一页”,即在分节符处分页,使下一节从下一页顶端开始,(如果文本格式出现变化,改回即可,不影响分节)。确定光标在该页,单击插入/页码,在弹出的页码对话框中,(常规做法)位置选择“页面底端(页脚)”,对齐方式选择“居中”,单击“格式”按钮,在“页码格式”对话框中,页码编排选择“起始页码”,并设置为1,单击“确定”。这样一来,这个节点将文章一分为二,正文之前的几页按顺序排页码,正文之后的也重新按顺序排页码。 ②将插入点回到首页开头插入/分隔符,在分隔符对话框中,分节符类型选择“下一页”,单击插入/页码,将“首页显示页码”的选项取消,单击“确定”。

大数据量时提高分页的效率

导言 如我们在之前的教程里讨论的那样,分页可以通过两种方法来实现: ?默认分页–你仅仅只用选中data Web control的智能标签的Enable Paging ; 然而,当你浏览页面的时候,虽然你看到的只是一小部分数据,ObjectDataSource 还是会每次都读取所有数据 ?自定义分页–通过只从数据库读取用户需要浏览的那部分数据,提高了性能. 显然这种方法需要你做更多的工作. 默认的分页功能非常吸引人,因为你只需要选中一个checkbox就可以完成了.但是它每次都读取所有的数据,这种方式在大数据量或者并发用户多的情况下就不合适.在这样的情况下,我们必须通过自定义分页来使系统达到更好的性能. 自定义分页的一个重点是要写一个返回仅仅需要的数据的查询语句.幸运的,Microsoft SQL Server 2005 提供了一个新的keyword,通过它我们可以写出读取需要的数据的查询.在本教程里,我们将学习在GridView里如何使用Microsoft SQL Server 2005 的这个新的keyword来实现自定义分页.自定义分页和默认分页的界面看起来一样,但是当你从一页转到另一页时,在效率上差了几个数量级. 注意:自定义分页带来的性能提升程序取决于数据的总量和数据库的负载.在本教程的最后我们会用数据来说明自定义分页带来的性能方面的好处.

第一步: 理解自定义分页的过程 给数据分页的时候,页面显示的数据取决于请求的是哪一页和每页显示多少条.比如,想象以下我们给81个product分页,每页显示10条.当我们浏览第一页时,我们需要的是product 1 到product 10.当浏览第二页时,我们需要的是product 11 到product 20,以次类推. 对于需要读取什么数据和分页的页面怎么显示,有三个相关的变量: ?Start Row Index –页面里显示数据的第一行的索引; 这个值可以通过页的索引乘每页显示的记录的条数加1得到. 例如, 如果一页显示10条数据, 那么对第 一页来说(第一页的索引为0), 第一行的索引为0 * 10 + 1, or 1; 对第二页来说 (索引为1), 第一行的索引为1 * 10 + 1, 即11. ?Maximum Rows –每页显示的最多记录的条数. 之所以称为“maximum” rows 是由于最后一页显示的数据可能会比page size要小. 比如, 当以每页10 条记录来显示81条时, 最后一页也就是第九页只包含一条记录. 没有页面显示 的记录条数会大于Maximum Rows 的值. ?Total Record Count –显示数据的总条数. 不需要知道页面显示什么数据,但是记录总数会影响到分页. 比如, 如果对81条product记录分页,每页10条,那 么总页数为9. 对默认分页来说,Start Row Index是由页索引和每页的记录数加1得到,Maximum Rows 就是每页的记录数.使用默认分页时,不管是呈现哪页的数据,都是要读取全部的数据,所有每

Scott Mitchell 的https://www.360docs.net/doc/7617937618.html, 2.0数据教程之二十四.分页和排序报表数据

Scott Mitchell 的https://www.360docs.net/doc/7617937618.html, 2.0数据教程之二十四:: 分页和排序报表数据 导言 分页和排序是在WEB应用程序中展现数据常见的功能。比如,当我们在一个网上书店搜索https://www.360docs.net/doc/7617937618.html,书籍的时候,可能有几百本相关书籍,但是我们只希望每页显示10条有效记录。而且,我们还希望结果能根据标题、价格、页数和作者等等来进行排序。过去的23个教程中我们研究了如何建立各种报表,包括在界面上添加编辑和删除数据。但是我们没有研究如何对数据进行排序,对于分页我们也仅在研究DetailsView和FormView控件的时候看到。 Step 1:添加分页和排序页面 在我们开始以前,首先让我们花些时间来添加包括本篇在内的最近四篇教程需要用到的页面。我们先在项目中新建一个称作PagingAndSorting的文件夹,接下来,为目录新增以下几个页面,并配置为使用Site.master母板页。 ?Default.aspx ?SimplePagingSorting.aspx ?EfficientPaging.aspx ?SortParameter.aspx ?CustomSortingUI.aspx 图1:创建一个PagingAndSorting文件夹并且添加教程的页面

下一步,让我们打开Default.aspx 页面并且从UserControls 中拖拽SectionLevelTutorialListing.ascx 用户控件到设计界面。我们在母板页和站点导航教程中创建的这个用户控件遍历站点地图并且以符号列表形式把它们呈现出来。 图2:把SectionLevelTutorialListing.ascx 用户控件加入Default.aspx 要让显示我们将要创建的分页和排序教程,我们需要把他们加入站点地图中。打开Web.sitemap 文件并且把下列代码加在“编辑、插入和删除”siteMapNode 标记之后: XML 1 2 3

打造通用的分页排序查询表格

一,ligerGrid是如何工作的。 在没有开始做之前,需要先了解一下ligerGrid是如何工作的。简单来说,liger grid 就是提交准备好的数据到指定的目标请求数据,拿到数据以后,显示出来。 所以问题在于发送什么数据,拿到什么数据。先来看看ligerGrid的参数: url: null, pageSize: 10, sortName : null, sortOrder:null, root :'Rows', //数据源字段名 record:'Total', //数据源记录数字段名 pageParmName :'page', //页索引参数名,(提交给服务器) pagesizeParmName:'pagesize', //页记录数参数名,(提交给服务器) sortnameParmName:'sortname', //页排序列名(提交给服务器) sortorderParmName:'sortorder', //页排序方向(提交给服务器) 发送什么数据 page、pagesize、sortname、sortorder 这几个是默认发送到服务器的参数,可用于正确返回分页、排序后的数据。如果需要查询,可能需要配置一下parms,格式如 parms:[{name:'wherestr',value:'status="active"'}] ,这样后台就可以收到这个参数了 比如我在页面上这样配置: pageSize: 30,url: "service/BillListData.ashx?gridviewname=authors", sortName: 'au_id' 后台收到的数据,将会是:

SQL ROW_NUMBER()分页比较

使用SQL Server 2005 新的语法ROW_NUMBER()进行分页的两种不同方式的性能比较 相比在SQL Server 2000 中使用的分页方式,在SQL Server 2005中使用新的语法R OW_NUMBER()来分页效率要高出很多,但是很多人在使用ROW_NUMBER()这种分页方式时,使用的方法并不正确,以下列出不正确的和正确的做法并做简单分析: 首先假设我们已经创建了如下的表和索引并初始化了100万条数据: CREATE TABLE [dbo].[Users] ( [ID] [int] IDENTITY(1,1) NOT NULL, [Name] [varchar](50) NULL, [test] [nchar](10) NULL, CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED ( [ID] ASC ) ON [PRIMARY] ) ON [PRIMARY] CREATE UNIQUE NONCLUSTERED INDEX [Inx_Name] ON [dbo].[Users] ( [Name] ASC ) ON [PRIMARY] DECLARE @index INT SET @index=0 WHILE @index<1000000 BEGIN INSERT INTO Users(Name,test) values(@index,'walkingp') SET @index = @index + 1 END 不正确的使用方式(查出所有数据后再排序): select Id,Name,test from (select row_number() over(order by name) as ro wNum,* from users) as t where rowNum between 5000 and 5100 正确的使用方式如下(查出主键进行排序过滤,然后使用过滤后的主键来查找数据):select a.Id,https://www.360docs.net/doc/7617937618.html,,a.test from users as a inner join (select rowNum,id fro m (select row_number() over(order by name) as rowNum,ID from users) a s t where rowNum between 4000 and 4100) as b on a.id = b.id order by b.rownum 以下具体分析: set statistics io on set statistics time on go print 'Error.5000-------------------------' declare @time datetime

千万数量级分页存储过程,可支持多表查询,任意排序

千万数量级分页存储过程,可支持多表查询,任意排序.txt13母爱是迷惘时苦口婆心的规劝;母爱是远行时一声殷切的叮咛;母爱是孤苦无助时慈祥的微笑。从程序中考虑:比如用数据缓冲和连接池技术 从数据库服务器端考虑:比如csdn只选出前300行纪录,因为用户不需要那么多纪录。你也不必把1000万条全部分页。你也不必把纪录放在一个表中,一年(太多就一个月)的数据放一张表或定期把历史数据导出到数据数据仓库中,不要用一张表装1000万条记录。做好索引。优化查询!尽量少用模糊查询,避免表扫描。不能让客户端连续多次搜索(csdn就是) 千万级的数据库,有分页的意义吗?对于用户来说就是信息的海洋了,去看看Google怎么做的吧, 根本就不存在如何分页的问题,如果一个结果有千万条,那跟没有结果一样是没有一样.应该是统计条数,取出,前N条进行分页,如果到地还在准备分页的话,再次取结果n,进行分页.并且在其间推荐用户进行递进式搜索,来降低信息量,才式正确的 我有一个方法:(对于喜欢用select * 的同行可能有用) 先检索出来,符合条件的所有 id (唯一标识)放在内存里 然后根据当前页数和每页多少行纪录去内存中取 id号的当前集 根据当前集中的某一条去数据库中检索相应的数据行 这里建议使用编译预处理PrepareStatement 将结果放进数据类 (如果你的数据只有两列当然可以省略这一步) 然后把数据类添加进 ArrayList 或者HashMap 然后把载页面上输出 ArrayList 或者HashMap 的数据 这样做,是因为只检索一列数据要比检索多类要快得多占用更少的内存。 一次只精确定位一条纪录要比一次取出多条要快,这里的瓶颈在于频繁的与数据库交互,但是我们使用编译预处理可以很大程度上提高性能。 千万数量级分页存储过程(可支持多表查询,任意排序) 功能不错的分页存储过程,可支持多表查询,任意排序 CreatePROCEDUREusp_PagingLarge @TableNamesVARCHAR(200),--表名,可以是多个表,但不能用别名 @PrimaryKeyVARCHAR(100),--主键,可以为空,但@Order为空时该值不能为空 @FieldsVARCHAR(200),--要取出的字段,可以是多个表的字段,可以为空,为空表示select* @PageSizeINT,--每页记录数 @CurrentPageINT,--当前页,0表示第1页 @FilterVARCHAR(200)='',--条件,可以为空,不用填where @GroupVARCHAR(200)='',--分组依据,可以为空,不用填groupby @OrderVARCHAR(200)=''--排序,可以为空,为空默认按主键升序排列,不用填orderby

各种数据库分页查询SQL

一、DB2: DB2分页查询 SELECT * FROM (Select 字段1,字段2,字段3,rownumber() over(ORDER BY 排序用的列名ASC) AS rn from 表名) AS a1 WHERE a1.rn BETWEEN 10 AND 20 以上表示提取第10到20的纪录 select * from (select rownumber() over(order by id asc ) as rowid from table where rowid <=endIndex ) where rowid > startIndex 如果Order By 的字段有重复的值,那一定要把此字段放到over()中 select * from ( select ROW_NUMBER() OVER(ORDER BY DOC_UUID DESC) AS ROWNUM, DOC_UUID, DOC_DISPA TCHORG, DOC_SIGNER, DOC_TITLE from DT_DOCUMENT ) a where ROWNUM > 20 and ROWNUM <=30 增加行号,不排序 select * from ( select ROW_NUMBER() OVER() AS ROWNUM,t.* from DT_DOCUMENT t ) a 增加行号,按某列排序 select * from ( select ROW_NUMBER() OVER( ORDER BY DOC_UUID DESC ) AS ROWNUM,t.* from DT_DOCUMENT t ) a 二、Mysql: 最简单 select * from table limit start,pageNum 比如从10取20个数据 select * from table limit 10,20 三、Oracle: select * from (select rownum,name from table where rownum <=endIndex ) where rownum > startIndex

Hibernate Struts2动态分页排序

Hibernate Struts2动态分页排序 一、引子: 分页和排序在开发过程中经常需要用到,本文讨论的是基于struts2传参方式的分页,基于AJAX方式的分页排序无非也是大同小异.明白其中的道理就能举一反三.分页排序可以分2步,一步为struts2获取页面页码、排序字段、升降序,同时从HIBERNATE获取总记录数,使用一个Pager类进行验证处理。预览如下: 二、Pager类 public class Pager { //决定性属性 //页面传递属性 private int curPage; private int pageSize; //数据库获取属性 private int totalRecords; //衍生属性 private Boolean isFirstPage; private Boolean isLastPage; private int prevPage; private int nextPage; private int totalPage; private int firstPage=1; private int lastPage;

//查询属性预留,此处未实现 private List queryer; //排序属性 private String field;//排序字段 private String sortOrder;//desc asc public void setTotalRecords(int totalRecords) { this.totalRecords = totalRecords; pageSize=pageSize==0?10:pageSize; totalPage=totalRecords%pageSize==0?totalRecords/pageSize:totalRecords/pageSize+1; lastPage=totalPage; curPage=curPage<1?1:curPage; curPage=curPage>lastPage?lastPage:curPage; isFirstPage=curPage==firstPage; isLastPage=curPage==lastPage; prevPage=isFirstPage?1:curPage-1; nextPage=isLastPage?lastPage:curPage+1; } //略去geter,seter。。。 } 三、struts2的Action public class LogAction extends ActionSupport { private Pager pager; private List logs; private ILog ilog;//业务层接口 public String showLogs(){ if(pager==null)pager=new Pager(); logs=ilog.getLogs(pager); return SUCCESS; } } 四、Hibernate 实现类

SQL多表查询中的分页

SQL多表查询中的分页,字段组合综合实例解析 综合实例: SELECT* FROM( SELECT ROW_NUMBER()OVER(ORDER BY U.FUsersSort ASC)AS Row, U.*,D.FName AS DepartmentName,CD.FName AS DutyName,TB.FRoleIDs,TQ.FRoleNames FROM CY_Users U JOIN( SELECT*FROM(SELECT DISTINCT FID FROM CY_Users) A OUTER APPLY( SELECT FRoleIDs=STUFF(REPLACE(REPLACE( (SELECT FRoleID FROM CY_UserHaveRole N WHERE FUserID = A.FID FOR XML AUTO),'',''), 1, 1,'') )TN ) TB on U.FID =TB.FID JOIN( SELECT*FROM(SELECT DISTINCT FID FROM CY_Users) B OUTER APPLY( SELECT FRoleNames =STUFF(REPLACE(REPLACE( (SELECT T.FName FROM CY_Roles T JOIN CY_UserHaveRole UHR ON T.FID = UHR.FRoleID where UHR.FUserID =B.FID FOR XML AUTO),'',''), 1, 1,'') )TM )TQ ON U.FID =TQ.FID LEFT JOIN CY_Department D ON U.FDepartmentID = D.FID LEFT JOIN CY_Duty CD ON U.FDutyID = CD.FID )AS PagedResults WHERE Row BETWEEN 0 AND 25 --WHERE Row >= 0 AND Row <= 25 实例说明: 功能:查询用户的基本信息(除了CY_Users中的字段外加:部门名,职务名,角色ID号和名称(一 个用户可能有多个角色,要求用逗号分隔显示)) 字段组合:每个用户的多个角色名称用逗号隔开作为一个字段(角色名)显示,角色ID也做同样处理涉及到的表:CY_Users、 CY_Department、 CY_Roles 、CY_UserHaveRole、 CY_Duty 表之间的关系:CY_Users 和CY_Roles是多对多的关系,CY_UserHaveRole是其关系表 分页:根据用户表中的排名字段FSort的从小到大的顺序取某一页的数据(这里取第一页25条数据) 解析:(备注:解析参考自MSDN和网络资料)

动态多条件查询分页以及排序(一)--MVC与Entity Framework版url分页版

博客园_https://www.360docs.net/doc/7617937618.html, 您正在查看的源包含频繁更新的内容。订阅源后,该源会添加到“常见源列表”中。该源的更新信息会自动下载到计算机,通过 Internet Explorer 及其他程序可以查看这些信息。进一步了解源。 订阅该源 动态多条件查询分页以及排序(一)--MVC与Entity Framework版url分页版 2012年12月4日,8:46:00 | wlf 一.前言 多条件查询分页以及排序每个系统里都会有这个的代码做好这块可以大大提高开发效率所以博主分享下自己的6个版本的多条件查询分页以及排序 二.目前状况 不论是https://www.360docs.net/doc/7617937618.html, 还是EF 在做多条件搜索时都有这类似的代码

这样有几个不好的地方 1.当增加查询条件,需要改代码,对应去写相应的代码。 2.对多表查询以及or的支持不是很好。而我们很常见的需求不可能是一个表的查询 3. 这样写表示层直接出现了SQL语句或者 linq 的拉姆达表达式这是很不好的表示层不应该知道数据访问技术 4.有的时候我们的业务逻辑层接口是这样的 IList<***> seach(string name,string age,string classname,int pageindex,int pagesize,string oderby) 这个时候多一个查询条件对应的还要去修改业务逻辑层 EF由于传递的是表达式树,则更是苦不堪言. 三.我们接下来应该实现的目标 1.当增加条件时不需要修改代码只需要在view上增加相应的查询框即可 2.我们的多条件查询应该做到无关表示层技术(是否是MVC或webform) 3.应该支持多表查询以及OR的操作

【IT专家】mysql分表后 如何分页 (总共160个表1500万数据)

本文由我司收集整编,推荐下载,如有疑问,请与我司联系mysql分表后如何分页(总共160个表1500万数据) mysql分表后,有160个表,有1500万数据,要怎么做分页列表?之前是想用unionall合并160个表的结果集。。但直接卡的数据都出不来。。请问这里应该怎么做分页,谢谢~~~ 你这是自己做的分表,那么分表条件是什么呢?如果分页的结果不能通过分表条件框定范围,那你的分表是失败的不是说不能用union,而是union的不是全部,而是经分表条件筛选后的部分表你这是自己做的分表,那么分表条件是什么呢?如果分页的结果不能通过分表条件框定范围,那你的分表是失败的不是说不能用union,而是union的不是全部,而是经分表条件筛选后的部分表徐版主好~我表里的数据主要字段是URL地址,有1600个域名,我是根据域名分成了160个表。你这是自己做的分表,那么分表条件是什么呢?如果分页的结果不能通过分表条件框定范围,那你的分表是失败的不是说不能用union,而是union的不是全部,而是经分表条件筛选后的部分表你这是自己做的分表,那么分表条件是什么呢?如果分页的结果不能通过分表条件框定范围,那你的分表是失败的不是说不能用union,而是union的不是全部,而是经分表条件筛选后的部分表我的sql语句是这样的(字段不多且都有用就用的*号):select*fromt1unionallselect*fromt2unionallselect*fromt3.....unionallselect*fromt160 既然你是按域名分表的,那么也就是按域名检索了因此可以想象到,如果一个域名不在否一个表中的话,那么这个表是不需要参与检索的这样一来你的检索范围不就缩小了很多了吗?当一个表中包含有若干个不同域名时,你需要建一个目录表,指明某一类域名在某个表中检索时先查目录表,得到可能在哪些表中,然后再在这些表中查找如果你使用mysql提供的分表功能,那么就要简单多了既然你是按域名分表的,那么也就是按域名检索了因此可以想象到,如果一个域名不在否一个表中的话,那么这个表是不需要参与检索的这样一来你的检索范围不就缩小了很多了吗?当一个表中包含有若干个不同域名时,你需要建一个目录表,指明某一类域名在某个表中检索时先查目录表,得到可能在哪些表中,然后再在这些表中查找如果你使用mysql提供的分表功能,那么就要简单多了这个域名和表名

分页功能测试

web中分页功能测试设计 翻页功能我们常碰到的一般有以下几个功能: 1、首页、上一页、下一页、尾页。 2、总页数,当前页数 3、指定跳转页 4、指定每页显示条数 当然,有一些是少于多少页,全部以数字的形式显示,多于多少页后,才出现下一页的控件。本文暂且用以上四点来做为通用的用例来设计吧。 对于1翻页链接或按钮的测试,主要要检查的测试点有: 1、有无数据时控件的显示情况 2、在首页时,首页和上一页是否能点击 3、在尾页时,下一页和尾页是否能点击 4、在非首页和非尾页时,四个按钮功能是否正确 5、翻页后,列表中的记录是否仍按照指定的排序列进行了排序 对于2总页数,当前页数,主要要检查的测试点有: 1、总页数是否等于总的记录数/指定每页条数 2、当前页数是否正确 对于3指定跳转页,主要要检查的测试点有: 1、是否能正常跳转到指定的页数 2、输入的跳转页数非法时的处理 对于4指定每页显示条数,主要要检查的测试点有: 1、是否有默认的指定每页显示条数 2、指定每页的条数后,列表显示的记录数,页数是否正确 3、输入的每页条数非法时的处理 分析完上面的测试点,应该可以进行用例的设计了。 step 1: 列表无记录 expect: 1、四个翻页控件变灰不可点击 2、列表有相应的无数据信息提示 3、不可指定页数 4、不可指定跳转页 5、总页数显示为0 6、当前页数显示为0 step 2: 列表的记录数<=指定的每页显示条数 expect: 1、四个翻页控件变灰不可点击 2、总页数显示为1 3、当前页数显示为1 step 3: 列表的记录数>指定的每页显示条数 expect: 1、默认在首页,当前页数为1 2、列表的数据按照指定的排序列正确排序 3、记录数与数据库相符 4、总页数=记录数/指定的每页显示条数

Row_Number()实现分页分页

Row_Number()分页 分页方法一 一般的我们查询一些记录出来之后,查询出来的记录就是我们想要的,如果我们的表中有一个ID为自动编号,那么如果表中的ID为连续的话,我们查询出来的第一列数据就会像这样: ID 字段1 字段2 1 ………… 2 ………… 3 ………… 4 ………… 5 ………… 再做一个假设,如果我们的表中没有ID呢,或者ID号不是连续的呢,如果我们按照ID来分页的话,就会碰到一些小问题。为了解决分页的问题,微软在SQL Server 2005中添加了这个内置函数。当我们的数据表中即使没有一个自增ID的话,使用Row_Number()函数照样能实现自增的一串连续的记录,就像上表的ID 一样。 例如: select row_number() over(order by getdate() desc) as rownumber,* from table 这条SQL语句的意思是查询一个自增的row_number列(在查询的结果中rownumber这列来表示row_numvber的结果)以及table表中的所有记录,需要注意的是row_number是做过排序的,根据日期进行倒序排序。结果类似这样的:

declare@currentPageIndex int--当前页号 set@currentPageIndex=1 --设置当前页号为 select top 5 *from (select row_number()over(order by id desc)as rownumber,*from testdata)as testdata where rownumber>5*(@currentPageIndex-1) 解释:这里设置的是每页实现5条记录,变量为当前页的索引号,在这里为了符合正常思维,对索引页号进行了处理(减1操作)。通过对变量@currentPageIndex 进行赋不同的值,可以看到效果。 分页方法之二 方式一:在当前select中不能采用RowNumber字段,并且不能使用排序 示例代码: select*from ( select*,ROW_NUMBER()over (order by id desc)as rownumber from testdata )testdata where rownumber between 5 and 10 代码解释:使用Row_Number()函数实现自增的一串连续的记录,在从testdata 表中选出rownumber不在5到10之间的记录 方式二:ROW_NUMBER() OVER ROW_NUMBER()就是生成一个有顺序的行号,其生成的标准就是后面紧跟的OVER(order by XX) 示例代码: 方式三: 示例代码: select*from ( select ROW_NUMBER()OVER(order by id asc)as rownum,id from testdata )as a where rownum between(@pageIndex- 1)*@pageSize+ 1 and@pageIndex *@pageSize order by id asc

相关主题
相关文档
最新文档