当数据库的数据量比较大,对执行效率要求比较高的时候,我们可以考虑使用存储过程来实现分页,根据传入的页数返回需要显示的数据表,仅仅select出当前页的数据。(这个比使用PagedDataSource类而言效率要高。)
现在采用Repeater来实现一个数据分页,数据库采用SQL server2000,利用里面的系统表Northwind。
新建存储过程如下:
create PROCEDURE dbo.myPaging ( @pagesize int, @currentPage int, @total int output ) AS create table #temp ( ID int identity(1,1), CustomerID varchar(50), CompanyName varchar(50), ContactName varchar(50), ContactTitle varchar(50), Phone varchar(50) )
insert into #temp(CustomerID,CompanyName,ContactName,ContactTitle,Phone) select CustomerID,CompanyName,ContactName,ContactTitle,Phone from Customers
select @total=(select count(*) from Customers)
declare @startID int declare @endID int set @startID=(@currentpage-1)*@pagesize+1 set @endID=@currentpage*@pagesize
select * from #temp where ID>=@startID and ID<=@endID GO
若不会写存储过程的话,可以参照网站在线生成分页的存储过程:http://www./AspNetPager/utility/sqlspgen.aspx
前台代码:
Code 1<body> 2 <form id="Form1" method="post" runat="server"> 3 <FONT face="宋体"> 4 <asp:DataList id="DataList1" runat="server" Width="744px" DataKeyField="customerID"> 5 <HeaderTemplate> 6 <TABLE id="Table2" cellSpacing="1" cellPadding="0" width="100%" bgColor="#990033" border="0"> 7 <TR> 8 <TD bgColor="#ffffff">公司名称</TD> 9 <TD bgColor="#ffffff">联系人名字</TD> 10 <TD bgColor="#ffffff">联系标题</TD> 11 <TD bgColor="#ffffff">联系电话</TD> 12 </TR> 13 </TABLE> 14 </HeaderTemplate> 15 <ItemTemplate> 16 <TABLE id="Table1" cellSpacing="1" cellPadding="0" width="100%" bgColor="#990033" border="0"> 17 <TR> 18 <TD bgColor="#ffffff"> 19 <asp:Label id="Label1" runat="server" Width="40%"> 20 <%# DataBinder.Eval(Container.DataItem,"CompanyName")%> 21 </asp:Label></TD> 22 <TD bgColor="#ffffff"> 23 <asp:Label id="Label2" runat="server" Width="20%"> 24 <%# DataBinder.Eval(Container.DataItem,"ContactName")%> 25 </asp:Label></TD> 26 <TD bgColor="#ffffff"> 27 <asp:Label id="Label3" runat="server" Width="20%"> 28 <%# DataBinder.Eval(Container.DataItem,"ContactTitle")%> 29 </asp:Label></TD> 30 <TD bgColor="#ffffff"> 31 <asp:Label id="Label4" runat="server" Width="20%"> 32 <%# DataBinder.Eval(Container.DataItem,"Phone")%> 33 </asp:Label></TD> 34 </TR> 35 </TABLE> 36 </ItemTemplate> 37 </asp:DataList></FONT> 38 <TABLE id="Table3" cellSpacing="0" cellPadding="1" width="744" border="0"> 39 <TR> 40 <TD style="height: 20px"><FONT face="宋体"> 41 <P align="center"> 42 <asp:LinkButton id="LinkButton1" runat="server"onclick="LinkButton1_Click">第一页</asp:LinkButton></P> 43 </FONT> 44 </TD> 45 <TD style="height: 20px"> 46 <P align="center"> 47 <asp:LinkButton id="LinkButton2" runat="server"onclick="LinkButton2_Click">上一页</asp:LinkButton></P> 48 </TD> 49 <TD style="height: 20px"> 50 <P align="center"> 51 <asp:LinkButton id="LinkButton3" runat="server"onclick="LinkButton3_Click">下一页</asp:LinkButton></P> 52 </TD> 53 <TD style="height: 20px"> 54 <P align="center"> 55 <asp:LinkButton id="LinkButton4" runat="server"onclick="LinkButton4_Click">最后一页</asp:LinkButton></P> 56 </TD> 57 </TR> 58 <TR> 59 <TD colSpan="2"> 60 <P align="center"><FONT face="宋体">当前第 61 <asp:Label id="Label5" runat="server"></asp:Label>页</FONT></P> 62 </TD> 63 <TD colSpan="2"> 64 <P align="center"><FONT face="宋体">总共 65 <asp:Label id="Label6" runat="server"></asp:Label>页</FONT></P> 66 </TD> 67 </TR> 68 </TABLE> 69 </form> 70 </body> 后台代码如下:
Code 1using System; 2using System.Collections; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Web; 7using System.Web.SessionState; 8using System.Web.UI; 9using System.Web.UI.WebControls; 10using System.Web.UI.HtmlControls; 11using System.Data.SqlClient; 12 13namespace Paging 14{ 15 public partial class WebForm1 : System.Web.UI.Page 16 { 17 18 //定义每页显示的长度 19 int pagesize=5; 20 21 protected void Page_Load(object sender, System.EventArgs e) 22 { 23 int currentpage=1;//设置当前页为1 24 25 if(!IsPostBack) 26 { 27 BindCustomers(pagesize,currentpage); 28 } 29 } 30 31 void BindCustomers(int pagesize,int currentpage) 32 { 33 Label5.Text=currentpage.ToString(); 34 35 string str="server=.;uid=sa;pwd=;database=Northwind"; 36 SqlConnection con=new SqlConnection(str); 37 SqlDataAdapter da=new SqlDataAdapter("myPaging",con);//定义用存储过程 38 da.SelectCommand.CommandType=CommandType.StoredProcedure; 39 da.SelectCommand.Parameters.Add("@pagesize",pagesize);//每页显示页数 40 da.SelectCommand.Parameters.Add("@currentpage",currentpage);//当前页 41 da.SelectCommand.Parameters.Add("@total",SqlDbType.Int);//总共数据的条数 42 43 //指示参数是输出,Output参数是输出参数 44 da.SelectCommand.Parameters["@total"].Direction=ParameterDirection.Output; 45 con.Open(); 46 DataSet ds=new DataSet(); 47 da.Fill(ds); 48 DataList1.DataSource=ds; 49 DataList1.DataBind(); 50 51 //获得总共数据数目 52 int total=Convert.ToInt32(da.SelectCommand.Parameters["@total"].Value); 53 //获得总页数 54 55 int totalpage=Convert.ToInt32(Math.Ceiling(total*1.0/pagesize)); 56 57 Label6.Text=totalpage.ToString(); 58 59 //设置导航按钮的状态 60 if(Label5.Text=="1") //当前页为第一页 61 { 62 LinkButton1.Enabled=false; 63 LinkButton2.Enabled=false; 64 LinkButton3.Enabled=true; 65 LinkButton4.Enabled=true; 66 } 67 else if (Label5.Text == Label6.Text) //当前页为最后一页 68 { 69 LinkButton1.Enabled=true; 70 LinkButton2.Enabled=true; 71 LinkButton3.Enabled=false; 72 LinkButton4.Enabled=false; 73 } 74 else 75 { 76 LinkButton1.Enabled=true; 77 LinkButton2.Enabled=true; 78 LinkButton3.Enabled=true; 79 LinkButton4.Enabled=true; 80 } 81 } 82 83 protected void LinkButton1_Click(object sender, System.EventArgs e) //首页 84 { 85 Label5.Text="1"; 86 int currentpage=int.Parse(Label5.Text); 87 BindCustomers(pagesize,currentpage); 88 } 89 90 protected void LinkButton4_Click(object sender, System.EventArgs e) //尾页 91 { 92 Label5.Text=Label6.Text; 93 int currentpage=int.Parse(Label5.Text); 94 BindCustomers(pagesize,currentpage); 95 } 96 97 protected void LinkButton2_Click(object sender, System.EventArgs e) // 上一页 98 { 99 int currentpage=int.Parse(Label5.Text); 100 currentpage--; 101 Label5.Text=currentpage.ToString(); 102 BindCustomers(pagesize,currentpage); 103 } 104 105 protected void LinkButton3_Click(object sender, System.EventArgs e) //下一页 106 { 107 int currentpage=int.Parse(Label5.Text); 108 currentpage++; 109 Label5.Text=currentpage.ToString(); 110 BindCustomers(pagesize,currentpage); 111 } 112 } 113} 114
|