使用DataList和SQL2005实现分页显示数据(应用举例:站内简单搜索)
2012-10-31 23:07
801 查看
使用ASP.NET与SQL2005做一个书籍管理类型网站的时候,遇到了模糊搜索和分页显示搜索结果的问题。
一、分页
先讨论分页技术吧。
经过了解,我们得知网站的分页大概有两种形式:
1、加载全部数据进行分页(
×)
就像ASP.NET中的GridView控件可以自动实现分页显示的功能,但是这是要花一定代价的,就是把数据全部加载完成。当我们的数据量非常大的时候,就不能够采取这种“加载-分页显示”的方法了。一般使用的是下面一种方法。
2、加载用户请求的某一页的数据(√)
顾名思义就是在代码端规定好分页的一些参数,例如:每页显示数据条数A。在用户请求显示第N页的时候,就在数据库检索出第N页的数据返回进行显示。也许你会问了,数据库怎么知道返回什么给程序端?这个时候我们规定的一些参数如每页显示数据条数A就起作用了,数据库可以通过总数据条数和每页数据行数进行计算出该显示那些数据,但是这一切都不是自动完成的,而是需要我们操作控制的。
(1)数据库端的实现(SQL2005)
通过实践和上网查找,发现大概的分页方法有五种:
1)利用select top和select not in
2)利用select top 和 select max(最高效√)
3)利用select top和中间变量
4)利用Row_number() 此方法为SQL server 2005中新的方法,利用Row_number()给数据行加上索引(很方便易用√)
5)利用临时表及Row_number
通过资料查找,发现第二种也就是利用select top 和 select max的效率是最高的,因此写了一个非常简单的存储过程示例(不含显示第一页):
在写这个存储过程中,对初学者来说,最难的并不是逻辑的理解,而是语法的问题。
写出来之后,我还找了一下怎么样能够实现最优化,通过上网查找,有人在最高效率的第二种方法的基础上进行了二分法的优化,进行耗时对比之后,发现经过二分法优化的第二种使用select top 和 select max进行分页的方法效率是最高的也是很稳定的。
如果觉得很难理解和在编写过程中过于复杂,我建议采取第四种方法。
先看代码。
最关键的是在检索的时候加多一列:ROW_NUMBER() AS RowNumber作为每行的索引项,然后根据条件给出结果!
(2)网页端的实现(ASP.NET)
在网页端我们使用DataList控件实现分页。
绑定方法:
具体不再多说明,通过调用存储过程比较容易完成这一工作。
二、搜索功能(待续)
一、分页
先讨论分页技术吧。
经过了解,我们得知网站的分页大概有两种形式:
1、加载全部数据进行分页(
×)
就像ASP.NET中的GridView控件可以自动实现分页显示的功能,但是这是要花一定代价的,就是把数据全部加载完成。当我们的数据量非常大的时候,就不能够采取这种“加载-分页显示”的方法了。一般使用的是下面一种方法。
2、加载用户请求的某一页的数据(√)
顾名思义就是在代码端规定好分页的一些参数,例如:每页显示数据条数A。在用户请求显示第N页的时候,就在数据库检索出第N页的数据返回进行显示。也许你会问了,数据库怎么知道返回什么给程序端?这个时候我们规定的一些参数如每页显示数据条数A就起作用了,数据库可以通过总数据条数和每页数据行数进行计算出该显示那些数据,但是这一切都不是自动完成的,而是需要我们操作控制的。
(1)数据库端的实现(SQL2005)
通过实践和上网查找,发现大概的分页方法有五种:
1)利用select top和select not in
2)利用select top 和 select max(最高效√)
3)利用select top和中间变量
4)利用Row_number() 此方法为SQL server 2005中新的方法,利用Row_number()给数据行加上索引(很方便易用√)
5)利用临时表及Row_number
通过资料查找,发现第二种也就是利用select top 和 select max的效率是最高的,因此写了一个非常简单的存储过程示例(不含显示第一页):
CREATE PROCEDURE page ( @PageSize int, --页面大小 @PageIndex int --页面索引 ) AS declare @strSQL varchar(2000) --主语句 set @strSQL='select top '+str(@pageSize)+' * From person where(ID>(select max(ID) From (select top '+str(@pageSize*@pageIndex)+' ID From person order by ID) as TempTable)) order by ID' execute(@strSQL)
在写这个存储过程中,对初学者来说,最难的并不是逻辑的理解,而是语法的问题。
写出来之后,我还找了一下怎么样能够实现最优化,通过上网查找,有人在最高效率的第二种方法的基础上进行了二分法的优化,进行耗时对比之后,发现经过二分法优化的第二种使用select top 和 select max进行分页的方法效率是最高的也是很稳定的。
如果觉得很难理解和在编写过程中过于复杂,我建议采取第四种方法。
先看代码。
CREATE PROCEDURE Book_showpaging @PageSize int, --每页数据行数 @PageNumber int, --显示第几页 @PageCount int output --输出共有几页 AS Declare @RowStart int Declare @RowEnd int Declare @count int --统计总页数 SELECT @count = ( SELECT COUNT(*) FROM (你的表) WHERE (你的条件) ) SET @PageCount=@count/@PageSize IF(@count%@PageSize>0) SET @PageCount=@PageCount+1 --统计完毕 IF @PageNumber > 0 Begin SET @PageNumber = @PageNumber - 1 SET @RowStart = @PageSize * @PageNumber + 1 SET @RowEnd = @RowStart + @PageSize - 1; WITH temppaging AS ( SELECT Name,Press,Edition,ROW_NUMBER() AS RowNumber FROM (你的表) WHERE (你的条件) )SELECT * FROM temppaging WHERE RowNumber >= @RowStart and RowNumber <= @RowEnd END
最关键的是在检索的时候加多一列:ROW_NUMBER() AS RowNumber作为每行的索引项,然后根据条件给出结果!
(2)网页端的实现(ASP.NET)
在网页端我们使用DataList控件实现分页。
绑定方法:
<asp:DataList ID="DataList1" runat="server" BackColor="White" BorderColor="#CCCCCC" BorderWidth="0px" CellPadding="4" ForeColor="Black" RepeatColumns="2" onitemcommand="DataList1_ItemCommand" BorderStyle="None" Font-Bold="False" Font-Italic="False" Font-Names="微软雅黑" Font-Overline="False" Font-Size="Medium" Font-Strikeout="False" Font-Underline="False" ShowFooter="False" ShowHeader="False" HorizontalAlign="Left" Width="900px" RepeatDirection="Horizontal"> <ItemTemplate> <asp:Label ID="lb_bookname" runat="server"></asp:Label><br /> <asp:Label ID="lb_tbookpress" runat="server" Text="出版社:"></asp:Label> <%# Eval("book_Press")%><asp:Label ID="lb_bookpress" runat="server"></asp:Label><br /> <asp:Label ID="lb_tbookedition" runat="server" Text="版次:"></asp:Label> <%# Eval("book_Edition")%><asp:Label ID="lb_bookedition" runat="server"></asp:Label> </ItemTemplate>
</asp:DataList>
具体不再多说明,通过调用存储过程比较容易完成这一工作。
二、搜索功能(待续)
相关文章推荐
- ASP.NET 使用DataList控件实现分页显示数据
- 使用PagedDataSource类实现DataList和Repeater控件的分页显示
- 五滴水:使用Ajax+jQuery来实现前端收到的数据在console上显示+简单的主页设计与bootstrap插件实现图片轮播
- 数据分页显示的简单实现
- 使用PagedDataSource类实现DataList和Repeater控件的分页显示
- List集合切割实现对已有数据的分页显示(LIST容器数据量不大的情况下推荐使用)
- 使用DataList分页显示数据,双向排序,添加checkbox控件。
- 使用PagedDataSource类实现DataList和Repeater控件的分页显示功能
- 使用PagedDataSource类实现DataList和Repeater控件的分页显示[转]
- oracle12c JSON数据 使用SQL语句实现多表左外连接 显示无效数据 分页查询
- Android应用中使用GridView实现数据网格显示
- PHP实现数据分页显示的简单实例
- 使用PagedDataSource类实现DataList和Repeater控件的分页显示
- 使用PagedDataSource类实现DataList和Repeater控件的分页显示
- [置顶] ExtJs4.2应用:使用ExtJs扩展组件searchfield实现数据搜索功能
- Android应用中使用ListView实现数据列表显示(传智播客视频笔记)
- Android应用中使用GridView实现数据网格显示(传智播客视频笔记)
- Android应用中使用ListView实现数据列表显示(传智播客视频笔记)
- 使用PagedDataSource类实现DataList和Repeater控件的分页显示功能
- 使用PagedDataSource类实现DataList和Repeater控件的分页显示(转)