其实跟Web里面的DataGrid分页差不多的,更确切的说要比Web里面更简单一些,这就要看你对分页的原理了不了解了。可以用微软提供的DataGrid控件来解决分页问题,不需要使用第三方控件。 楼主可以先到我的小论坛去熟悉一下分页的基本概念。(显示帖子页面,查看回复页面) www.xproer.com/bbs 然后我再跟你讲解一下目前最简单的一种分页方法。通常我们为了考虑分页SQL语句的性能,最好使用四个按钮来实现分页。 首页,上一页,下一页,尾页 这四个按钮事件内部分页用四条SQL语句来实现从数据库中读取相应的数据。通常我们的数据表中有ID列,这个基本上是用来分页的。如果我们的数据显示形式是从最新的到最旧的显示方式: ID显示: 100 99 98 97 96 95 94 93 92 91 90 89 88 87 86 85 84 83毫无疑问,首页是前10条(假设一页显示10条数据)是从100开始到91,这个SQL最简单:select top 10 from Table1 order by ID DESC (这个这是首页的SQL语句)那么下一页就是ID要比91小的前10条数据,select top 10 from Table1 where ID<@ID order by ID DESC (这是下一页SQL语句)尾页SQL语句也是超简单select top 10 from Table1 order by ID ASC (这个是尾页)上一页SQL语句select top 10 from Table1 where ID>@ID order by ID DESC (上一页SQL语句)好了,基本分页SQL语句搞定了,那么重要的就是如何取到这些ID值,我们可以将数据读取前台,通过JS获取这些相应的ID值,然后传给服务端控件,这样我们就可以轻松的实现分页了。
基本上这算得上是最简单的分页了同时也是效率最高的,因为还有一些SQL语句,比如 select top @PageSize * from (select top @DataCount * from AdminTB order by ID ASC)a order by ID DESC;");原理: 假设有30条数据: 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30现在我们要取中间的10条数据,则SQL语句要这样写 select top 10 * from (select top 20 * from AdminTB order by ID ASC) order by ID DESC;"); 实际上的效果如下 (1,2,3,4,5,6,7,8,9,[ 10,11,12,13,14,15,16,17,18,19,20 ]),21,22,23,24,25,26,27,28,29,30select top 20 * from AdminTB order by ID ASC是取得 () 部分数据 select top 10 * from (select top 20 * from AdminTB order by ID ASC) order by DESC;取得是 [] 部分。这下明白了吧不过遗憾的是这种分页是效率最低的,因为 @DataCount 会随着你的数据增加而增大,所以我们提倡用第一种,也就是我上面讲的。
贴一个效率比较高的分页存储过程CREATE PROCEDURE [dbo].[Paging_Cursor] ( @Tables varchar(1000), @PK varchar(100), @Sort varchar(200) = NULL, @PageNumber int = 1, @PageSize int = 10, @Fields varchar(1000) = '*', @Filter varchar(1000) = NULL, @Group varchar(1000) = NULL) AS/*Find the @PK type*/ DECLARE @PKTable varchar(100) DECLARE @PKName varchar(100) DECLARE @type varchar(100) DECLARE @prec intIF CHARINDEX('.', @PK) > 0 BEGIN SET @PKTable = SUBSTRING(@PK, 0, CHARINDEX('.',@PK)) SET @PKName = SUBSTRING(@PK, CHARINDEX('.',@PK) + 1, LEN(@PK)) END ELSE BEGIN SET @PKTable = @Tables SET @PKName = @PK ENDSELECT @type=t.name, @prec=c.prec FROM sysobjects o JOIN syscolumns c on o.id=c.id JOIN systypes t on c.xusertype=t.xusertype WHERE o.name = @PKTable AND c.name = @PKNameIF CHARINDEX('char', @type) > 0 SET @type = @type + '(' + CAST(@prec AS varchar) + ')'DECLARE @strPageSize varchar(50) DECLARE @strStartRow varchar(50) DECLARE @strFilter varchar(1000) DECLARE @strGroup varchar(1000)/*Default Sorting*/ IF @Sort IS NULL OR @Sort = '' SET @Sort = @PK/*Default Page Number*/ IF @PageNumber < 1 SET @PageNumber = 1/*Set paging variables.*/ SET @strPageSize = CAST(@PageSize AS varchar(50)) SET @strStartRow = CAST(((@PageNumber - 1)*@PageSize + 1) AS varchar(50))/*Set filter & group variables.*/ IF @Filter IS NOT NULL AND @Filter != '' SET @strFilter = ' WHERE ' + @Filter + ' ' ELSE SET @strFilter = '' IF @Group IS NOT NULL AND @Group != '' SET @strGroup = ' GROUP BY ' + @Group + ' ' ELSE SET @strGroup = '' EXEC( 'DECLARE @PageSize int SET @PageSize = ' + @strPageSize + 'DECLARE @PK ' + @type + ' DECLARE @tblPK TABLE ( PK ' + @type + ' NOT NULL PRIMARY KEY )DECLARE PagingCursor CURSOR DYNAMIC READ_ONLY FOR SELECT ' + @PK + ' FROM ' + @Tables + @strFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + 'OPEN PagingCursor FETCH RELATIVE ' + @strStartRow + ' FROM PagingCursor INTO @PKSET NOCOUNT ONWHILE @PageSize > 0 AND @@FETCH_STATUS = 0 BEGIN INSERT @tblPK (PK) VALUES (@PK) FETCH NEXT FROM PagingCursor INTO @PK SET @PageSize = @PageSize - 1 ENDCLOSE PagingCursor DEALLOCATE PagingCursorSELECT ' + @Fields + ' FROM ' + @Tables + ' JOIN @tblPK tblPK ON ' + @PK + ' = tblPK.PK ' + @strFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort )
分页SQL select * from (select row_number() over(order by colName) as RowNumber,* from tableName) as tableName1 where RowNumber between "firstRow" and "endRow" 试试,传入一页需要显示的行数,开始和结束。
Myconn.Open();//打开数据库 OleDbDataAdapter sqlAdapter = new OleDbDataAdapter(selectedCmd);//建立数据适配器 DataSet ds = new DataSet();//实例化数据库 sqlAdapter.Fill(ds);//填充适配器 PagedDataSource pageDataSource = new PagedDataSource(); pageDataSource.DataSource = ds.Tables[0].DefaultView; pageDataSource.AllowPaging = true; pageDataSource.PageSize = 8; //定义变量用来保存当前页索引 int CurPage; //判断是否具有页面跳转的请求 if (Request.QueryString["Page"] != null) CurPage = Convert.ToInt32(Request.QueryString["Page"]); else CurPage =1;
楼主可以先到我的小论坛去熟悉一下分页的基本概念。(显示帖子页面,查看回复页面)
www.xproer.com/bbs
然后我再跟你讲解一下目前最简单的一种分页方法。通常我们为了考虑分页SQL语句的性能,最好使用四个按钮来实现分页。
首页,上一页,下一页,尾页
这四个按钮事件内部分页用四条SQL语句来实现从数据库中读取相应的数据。通常我们的数据表中有ID列,这个基本上是用来分页的。如果我们的数据显示形式是从最新的到最旧的显示方式:
ID显示:
100
99
98
97
96
95
94
93
92
91
90
89
88
87
86
85
84
83毫无疑问,首页是前10条(假设一页显示10条数据)是从100开始到91,这个SQL最简单:select top 10 from Table1 order by ID DESC (这个这是首页的SQL语句)那么下一页就是ID要比91小的前10条数据,select top 10 from Table1 where ID<@ID order by ID DESC (这是下一页SQL语句)尾页SQL语句也是超简单select top 10 from Table1 order by ID ASC (这个是尾页)上一页SQL语句select top 10 from Table1 where ID>@ID order by ID DESC (上一页SQL语句)好了,基本分页SQL语句搞定了,那么重要的就是如何取到这些ID值,我们可以将数据读取前台,通过JS获取这些相应的ID值,然后传给服务端控件,这样我们就可以轻松的实现分页了。
基本上这算得上是最简单的分页了同时也是效率最高的,因为还有一些SQL语句,比如
select top @PageSize * from (select top @DataCount * from AdminTB order by ID ASC)a order by ID DESC;");原理:
假设有30条数据:
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30现在我们要取中间的10条数据,则SQL语句要这样写
select top 10 * from (select top 20 * from AdminTB order by ID ASC) order by ID DESC;");
实际上的效果如下
(1,2,3,4,5,6,7,8,9,[ 10,11,12,13,14,15,16,17,18,19,20 ]),21,22,23,24,25,26,27,28,29,30select top 20 * from AdminTB order by ID ASC是取得 () 部分数据
select top 10 * from (select top 20 * from AdminTB order by ID ASC) order by DESC;取得是 [] 部分。这下明白了吧不过遗憾的是这种分页是效率最低的,因为 @DataCount 会随着你的数据增加而增大,所以我们提倡用第一种,也就是我上面讲的。
http://www.webdiyer.com/AspNetPager/default.aspx
程序中直接调用就好了不要让数据库闲着,web服务器累死平衡负载
@Tables varchar(1000),
@PK varchar(100),
@Sort varchar(200) = NULL,
@PageNumber int = 1,
@PageSize int = 10,
@Fields varchar(1000) = '*',
@Filter varchar(1000) = NULL,
@Group varchar(1000) = NULL)
AS/*Find the @PK type*/
DECLARE @PKTable varchar(100)
DECLARE @PKName varchar(100)
DECLARE @type varchar(100)
DECLARE @prec intIF CHARINDEX('.', @PK) > 0
BEGIN
SET @PKTable = SUBSTRING(@PK, 0, CHARINDEX('.',@PK))
SET @PKName = SUBSTRING(@PK, CHARINDEX('.',@PK) + 1, LEN(@PK))
END
ELSE
BEGIN
SET @PKTable = @Tables
SET @PKName = @PK
ENDSELECT @type=t.name, @prec=c.prec
FROM sysobjects o
JOIN syscolumns c on o.id=c.id
JOIN systypes t on c.xusertype=t.xusertype
WHERE o.name = @PKTable AND c.name = @PKNameIF CHARINDEX('char', @type) > 0
SET @type = @type + '(' + CAST(@prec AS varchar) + ')'DECLARE @strPageSize varchar(50)
DECLARE @strStartRow varchar(50)
DECLARE @strFilter varchar(1000)
DECLARE @strGroup varchar(1000)/*Default Sorting*/
IF @Sort IS NULL OR @Sort = ''
SET @Sort = @PK/*Default Page Number*/
IF @PageNumber < 1
SET @PageNumber = 1/*Set paging variables.*/
SET @strPageSize = CAST(@PageSize AS varchar(50))
SET @strStartRow = CAST(((@PageNumber - 1)*@PageSize + 1) AS varchar(50))/*Set filter & group variables.*/
IF @Filter IS NOT NULL AND @Filter != ''
SET @strFilter = ' WHERE ' + @Filter + ' '
ELSE
SET @strFilter = ''
IF @Group IS NOT NULL AND @Group != ''
SET @strGroup = ' GROUP BY ' + @Group + ' '
ELSE
SET @strGroup = ''
EXEC(
'DECLARE @PageSize int
SET @PageSize = ' + @strPageSize + 'DECLARE @PK ' + @type + '
DECLARE @tblPK TABLE (
PK ' + @type + ' NOT NULL PRIMARY KEY
)DECLARE PagingCursor CURSOR DYNAMIC READ_ONLY FOR
SELECT ' + @PK + ' FROM ' + @Tables + @strFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + 'OPEN PagingCursor
FETCH RELATIVE ' + @strStartRow + ' FROM PagingCursor INTO @PKSET NOCOUNT ONWHILE @PageSize > 0 AND @@FETCH_STATUS = 0
BEGIN
INSERT @tblPK (PK) VALUES (@PK)
FETCH NEXT FROM PagingCursor INTO @PK
SET @PageSize = @PageSize - 1
ENDCLOSE PagingCursor
DEALLOCATE PagingCursorSELECT ' + @Fields + ' FROM ' + @Tables + ' JOIN @tblPK tblPK ON ' + @PK + ' = tblPK.PK ' + @strFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort
)
select * from (select row_number() over(order by colName) as RowNumber,* from tableName) as tableName1 where RowNumber between "firstRow" and "endRow"
试试,传入一页需要显示的行数,开始和结束。
OleDbDataAdapter sqlAdapter = new OleDbDataAdapter(selectedCmd);//建立数据适配器
DataSet ds = new DataSet();//实例化数据库
sqlAdapter.Fill(ds);//填充适配器
PagedDataSource pageDataSource = new PagedDataSource();
pageDataSource.DataSource = ds.Tables[0].DefaultView;
pageDataSource.AllowPaging = true;
pageDataSource.PageSize = 8;
//定义变量用来保存当前页索引
int CurPage;
//判断是否具有页面跳转的请求
if (Request.QueryString["Page"] != null)
CurPage = Convert.ToInt32(Request.QueryString["Page"]);
else
CurPage =1;
Response.Cookies["PageIndex"].Value= CurPage.ToString();
Response.Cookies["PageIndex"].Expires = DateTime.Now.AddDays(1);//设置COOKIES的过期时间为一天
//Session["PageIndex"] = CurPage.ToString();//把当前页的索引放入Session变量里
//设置当前页的索引
pageDataSource.CurrentPageIndex = CurPage - 1;
//显示状态信息
LabelPage.Text = "当前页:第" + CurPage.ToString() + "页,共" + pageDataSource.PageCount.ToString() + "页";
lblPageNumber.Text = Convert.ToString(pageDataSource.PageSize);
lblInfoCount.Text = Convert.ToString(pageDataSource.DataSourceCount);
//如果当前页面不是首页
if (!pageDataSource.IsFirstPage)
{
//定义"上一页"超级链接的URL为:当前执行页面的虚拟路径,并传递下一页面的索引值
LinkPrevious.NavigateUrl = Request.CurrentExecutionFilePath + "?Page=" + Convert.ToString(CurPage - 1);
//首页的链接
hplinkFristPage.NavigateUrl = "index.aspx";
}
//如果当前页面不是最后一页
if (!pageDataSource.IsLastPage)
{
//定义"下一页"超级链接的URL为:当前执行页面的虚拟路径,并传递下一页面的索引值
LinkNext.NavigateUrl = Request.CurrentExecutionFilePath + "?Page=" + Convert.ToString(CurPage + 1);
//尾页的链接
hplinkLastPage.NavigateUrl = Request.CurrentExecutionFilePath + "?Page=" + Convert.ToString(pageDataSource.PageCount.ToString());
}
//进行数据绑定
MyDatalist.DataSource = pageDataSource;
MyDatalist.DataBind();这个是本人之前做的一个投票系统,现在把分页的代码贴出来给你看下。希望对你能有帮助。