使用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的效率是最高的,因此写了一个非常简单的存储过程示例(不含显示第一页):
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控件实现分页。
绑定方法:
1 <asp:DataList ID="DataList1" runat="server" BackColor="White" 2 BorderColor="#CCCCCC" BorderWidth="0px" CellPadding="4" ForeColor="Black" 3 RepeatColumns="2" 4 onitemcommand="DataList1_ItemCommand" BorderStyle="None" Font-Bold="False" 5 Font-Italic="False" Font-Names="微软雅黑" Font-Overline="False" Font-Size="Medium" 6 Font-Strikeout="False" Font-Underline="False" ShowFooter="False" 7 ShowHeader="False" HorizontalAlign="Left" Width="900px" 8 RepeatDirection="Horizontal"> 9 <ItemTemplate> 10 <asp:Label ID="lb_bookname" runat="server"></asp:Label><br /> 11 <asp:Label ID="lb_tbookpress" runat="server" Text="出版社:"></asp:Label> 12 <%# Eval("book_Press")%><asp:Label ID="lb_bookpress" runat="server"></asp:Label><br /> 13 <asp:Label ID="lb_tbookedition" runat="server" Text="版次:"></asp:Label> 14 <%# Eval("book_Edition")%><asp:Label ID="lb_bookedition" runat="server"></asp:Label> </ItemTemplate>
15 </asp:DataList>
具体不再多说明,通过调用存储过程比较容易完成这一工作。
二、搜索功能(待续)