写出代码之前,先说明一下原理,比较简单。有一张表(test)如下
结构是:id(自动编号) txt 假设40条记录)
现在要每页显示10条记录,则每页要显示的数据应该是:
第一页:1----10
第二页:11----20
第三页:21----30
第四页:31----40
如要显示第一页,最简单的方法就是 select top 10 * from test 就OK了。
第二页开始呢?怎么做呢?请接着看:
比如我要显示第三页:也就是21----30
原理:找出不要的数据也就是1----20,最大的id,这是里20
再找出大于这个id(20) 前10条记录就OK了。
原理知道后写代码就简单了,前台界面比较简单,不多说,代码如下后台代码:
<asp:LinkButtonid="lbtnFirst"Runat="server">首頁</asp:LinkButton>
<asp:LinkButtonid="lbtnBack"Runat="server">上頁</asp:LinkButton>
<asp:LinkButtonid="lbtnNext"Runat="server">下頁</asp:LinkButton>
<asp:LinkButtonid="lbtnLast"Runat="server">尾頁</asp:LinkButton>
<asp:Labelid="Label1"runat="server">当前页:</asp:Label>
<asp:Labelid="lblCurrentPage"runat="server">1</asp:Label>
<asp:Labelid="Label2"runat="server">总页:</asp:Label>
<asp:Labelid="lblPageCount"runat="server">200</asp:Label>
<asp:Labelid="Label3"runat="server">跳转:</asp:Label>
<asp:TextBoxid="txtToPage"runat="server"Width="88px"></asp:TextBox>
<asp:Buttonid="btnToPage"runat="server"Text="go"></asp:Button>
<asp:DataGridid="DataGrid1"runat="server"AllowPaging="True"AllowCustomPaging="True"></asp:DataGrid>
privatevoidPage_Load(objectsender,System.EventArgse)

{
if(!Page.IsPostBack)

{
//开始显示第一页
ShowDate(Convert.ToInt64(lblCurrentPage.Text));
}
}

/**////<summary>
///显示数据
///</summary>
///<paramname="page"></param>
privatevoidShowDate(longpage)

{


/**//*-------------------设置参数------------------*/
stringtblName="test";
stringfldName="id";
stringorderStr="asc";
intPageSize=10;

/**//*-------------------设置结束------------------*/
byte[]t=Convert.FromBase64String(System.Configuration.ConfigurationSettings.AppSettings["conStr"]);
stringconStr=System.Text.ASCIIEncoding.ASCII.GetString(t);

SqlConnectionconn=newSqlConnection(conStr);
conn.Open();
SqlCommandcmd=newSqlCommand("selectcount(*)from"+tblName,conn);
lblPageCount.Text=Convert.ToString(((int)cmd.ExecuteScalar()/PageSize+1));
DataGrid1.VirtualItemCount=Convert.ToInt32(lblPageCount.Text);//datadrid每次就显示一页,所有要手动加上总页
stringsql=string.Empty;
sql="selecttop"+Convert.ToString((page-1)*PageSize)+""+fldName+"from"+tblName+"orderby"+fldName+""+orderStr;//排除的记录部分
sql="selectmax("+fldName+")from("+sql+")ast";//得到排除记录里的最大ID号
sql="selecttop"+PageSize.ToString()+"*from"+tblName+"where"+fldName+">("+sql+")orderby"+fldName+""+orderStr;

if(page==1)
{sql="selecttop"+PageSize+"*from"+tblName;lblCurrentPage.Text="1";}
try

{
SqlDataAdapterda=newSqlDataAdapter(sql,conn);
System.Data.DataSetds=newDataSet();
da.Fill(ds);
DataGrid1.DataSource=ds.Tables[0].DefaultView;
DataGrid1.DataBind();
conn.Close();
}
catch(Exceptionex)

{
Response.Write(ex.Message.ToString());
}
}

/**////首页
privatevoidlbtnFirst_Click(objectsender,System.EventArgse)

{
lblCurrentPage.Text="1";
ShowDate(1);
}

/**////上页
privatevoidlbtnBack_Click(objectsender,System.EventArgse)

{
if(lblCurrentPage.Text!="1")

{
lblCurrentPage.Text=Convert.ToString(Convert.ToInt64(lblCurrentPage.Text)-1);
ShowDate(Convert.ToInt64(lblCurrentPage.Text));
}
}

/**////下页
privatevoidlbtnNext_Click(objectsender,System.EventArgse)

{
if(lblCurrentPage.Text!=lblPageCount.Text)

{
lblCurrentPage.Text=Convert.ToString(Convert.ToInt64(lblCurrentPage.Text)+1);
ShowDate(Convert.ToInt64(lblCurrentPage.Text));
}
}

/**////尾页
privatevoidlbtnLast_Click(objectsender,System.EventArgse)

{
lblCurrentPage.Text=lblPageCount.Text;
ShowDate(Convert.ToInt64(lblPageCount.Text));
}

/**////跳转
privatevoidbtnToPage_Click(objectsender,System.EventArgse)

{
if(Convert.ToInt64(txtToPage.Text.Trim())>0&&Convert.ToInt64(txtToPage.Text.Trim())<Convert.ToInt64(lblPageCount.Text))

{
lblCurrentPage.Text=txtToPage.Text;
ShowDate(Convert.ToInt64(txtToPage.Text));
}
}

/**////dataGrid单击的页数
privatevoidDataGrid1_PageIndexChanged(objectsource,System.Web.UI.WebControls.DataGridPageChangedEventArgse)

{
DataGrid1.CurrentPageIndex=e.NewPageIndex;
lblCurrentPage.Text=Convert.ToString(e.NewPageIndex+1);
ShowDate(e.NewPageIndex+1);
}
本文介绍了一种在SQL中实现高效分页查询的方法,通过逐步排除不需要的数据来提高查询速度,适用于大量数据的分页展示。
602

被折叠的 条评论
为什么被折叠?



