分页显示后台数据
上一节我们实现分页显示已经加载到DataTable中的数据。
这一节介绍如何分页显示未加载的数据,在给出具体代码之前,我先给大家一些建议:
1、如果服务端的数据量比较小,将数据加载进来,可以提高处理速度。
2、如果服务端数据量比较大,加载全部数据,可能会耗尽内存,甚至导致系统崩溃。
3、怎样才算小,怎样才算大,这没有标准,请以实际运行效果为准,一般不建议服务端加载超过5万行的数据。
4、如果某个表虽然不加载数据,但是需要对这个表进行增加、删除和修改等操作,那么建议加载这个表的结构,这样就可以利用后台数据处理函数简化代码。
5、建议使用SQL Server作为数据源,容量更大,性能更好,而且SQL Server有Row_Number函数,分页加载方便很多。
完整示例
下面的HttpRequest事件,用于分页显示后台数据,这里假定你使用的是SQL Server作为数据源:
Select
Case e.Path
Case "list.htm"
Dim
page As
Integer = 0
'默认page为0,显示第一页
Dim
pageRows As
Integer = 10
'每页10行
If e.GetValues.ContainsKey("page")
Then
'如果地址中有page参数
Integer.TryParse(e.GetValues("page"),
page)
'提取page参数
End If
Dim
StartRow As
Integer = page *
pageRows
'此页第一行
Dim EndRow
As Integer =
(page + 1) *
pageRows - 1
'此页最后一行
Dim cmd
As New
SQLCommand
cmd.ConnectionName
= "orders"
'记得设置数据源名称
cmd.CommandText
= "Select Count(*) From {订单}"
Dim Count
As Integer =
cmd.ExecuteScalar()
'获取总的行数
cmd.CommandText
= "Select *, [数量]*[单价]*(1-[折扣])
As 金额
From (Select Row_Number() Over(Order by [日期])
As RowNum, * From
订单)
As a "
cmd.CommandText
= cmd.CommandText
& " Where RowNum >=
" & StartRow
& " And RowNum <= "
& EndRow
Dim dt
As DataTable
= cmd.ExecuteReader
'获取该页数据
Dim sb
As New
StringBuilder
Dim nms()
As String =
{"产品","客户","数量","单价","折扣","金额","日期"}
sb.AppendLine("<Table
border='1'>")
sb.AppendLine("<caption>订单浏览<caption></br>")
sb.Append("<tr>")
For Each
nm As
String In
nms
sb.Append("<td>"
& nm
& "</td>")
Next
sb.AppendLine("</tr>")
For Each
r As
DataRow In
dt.DataRows
sb.Append("<tr>")
For Each
nm As
String In
nms
sb.Append("<td>"
& r(nm)
& "</td>")
Next
sb.AppendLine("</tr>")
Next
sb.AppendLine("</Table></br></br>")
If page
> 0 Then
sb.Append("<a
href='list.htm?page=" &
page - 1
&
"'>上一页</a>
")
End If
If
EndRow < Count -1
Then
sb.Append("<a
href='list.htm?page=" &
page + 1
&
"'>下一页
</a>" )
End If
e.WriteString(sb.ToString)
End
Select