百万条数据分页

本文介绍了一种在SQL中实现高效分页查询的方法,通过逐步排除不需要的数据来提高查询速度,适用于大量数据的分页展示。

写出代码之前,先说明一下原理,比较简单。有一张表(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);
}

亲自测试sql2000 460万条记录,显示速度很快
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值