直播中
怎么實(shí)現(xiàn)數(shù)據(jù)記錄的分頁(yè)顯示(作者:DarkMan)
怎么實(shí)現(xiàn)數(shù)據(jù)記錄的分頁(yè)顯示 (1)
通過(guò)Recordset的GetRows方法,可以實(shí)現(xiàn)數(shù)據(jù)記錄的分頁(yè)顯示。下面是一個(gè)完整的例子:
<%@ Language = VBSCRIPT %>
<% Option Explicit %>
<%
Dim iStart, iOffset
iStart = Request("Start")
iOffset = Request("Offset")
if Not IsNumeric(iStart) or Len(iStart) = 0 then
iStart = 0
else
iStart = CInt(iStart)
end if
if Not IsNumeric(iOffset) or Len(iOffset) = 0 then
iOffset = 10
else
iOffset = Cint(iOffset)
end if
Response.Write "察看 " & iOffset & " 個(gè)記錄從 " & iStart & "開(kāi)始 <BR>"
Dim objConn, objRS
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open "Provider=SQLOLEDB.1;Data Source=(local);uid=sa;pwd=;Initial Catalog=pubs"
Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.Open "SELECT * FROM Authors", objConn
Dim aResults
aResults = objRS.GetRows
objRS.Close
Set objRS = Nothing
objConn.Close
Set objConn = Nothing
Dim iRows, iCols, iRowLoop, iColLoop, iStop
iRows = UBound(aResults, 2)
iCols = UBound(aResults, 1)
If iRows > (iOffset + iStart) Then
iStop = iOffset + iStart - 1
Else
iStop = iRows
End If
For iRowLoop = iStart to iStop
For iColLoop = 0 to iCols
Response.Write aResults(iColLoop, iRowLoop) & " "
Next
Response.Write "<BR>"
Next
Response.Write "<P>"
if iStart > 0 then
'顯示“前 10個(gè)”連接
Response.Write "<A HREF=""paging.asp?Start=" & iStart-iOffset & _
"&Offset=" & iOffset & """>前 " & iOffset & "</A>"
end if
if iStop < iRows then
'顯示“后 10個(gè)”連接
Response.Write " <A HREF=""paging.asp?Start=" & iStart+iOffset & _
"&Offset=" & iOffset & """>后 " & iOffset & "</A>"
end if
%>
怎么實(shí)現(xiàn)數(shù)據(jù)的分頁(yè)顯示(2)
這里介紹另外一種分頁(yè)顯示的方法,是通過(guò) MS SQL的存儲(chǔ)過(guò)程。本方法不適用于Access數(shù)據(jù)庫(kù)。
假設(shè)我們要對(duì)數(shù)據(jù)表MyTable的數(shù)據(jù)實(shí)現(xiàn)分頁(yè)顯示,首先寫一個(gè)存儲(chǔ)過(guò)程 如下:
CREATE PROCEDURE sp_PagedItems
(
@Page int,
@RecsPerPage int
)
AS
-- 加快表的 插入速度
SET NOCOUNT ON
-- 開(kāi)始記錄 號(hào)
DECLARE @RecCount int
SELECT @RecCount = @RecsPerPage * @Page + 1
--創(chuàng)建臨時(shí) 表
CREATE TABLE #TempItems
(
ID int IDENTITY,
Name varchar(50),
Price currency
)
-- 準(zhǔn)備臨時(shí) 表
INSERT INTO #TempItems (Name, Price)
SELECT Name,Price FROM MyTable ORDER BY Price
-- 求出要查 詢的最小ID和最大ID
DECLARE @FirstRec int, @LastRec int
SELECT @FirstRec = (@Page - 1) * @RecsPerPage
SELECT @LastRec = (@Page * @RecsPerPage + 1)
-- 得到實(shí)際 的記錄,并返回是否還有數(shù)據(jù)!
SELECT *,
MoreRecords =
(
SELECT COUNT(*)
FROM #TempItems TI
WHERE TI.ID >= @LastRec
)
FROM #TempItems
WHERE ID > @FirstRec AND ID < @LastRec
-- 恢復(fù)設(shè)置
SET NOCOUNT OFF
在這個(gè)存儲(chǔ)過(guò)程里,我們首先創(chuàng)建一個(gè)全部 記錄的臨時(shí)表,并增加了一個(gè)自動(dòng)編號(hào)的字段ID。這樣,不同的記錄就有一個(gè)遞增的唯一標(biāo)志。
根據(jù)當(dāng)前的頁(yè)號(hào)和每頁(yè)的記錄數(shù),可以計(jì)算 出每頁(yè)的最小和最大的ID。從而得到當(dāng)前頁(yè)的所有記錄。
為了顯示的方便,存儲(chǔ)過(guò)程還計(jì)算了 MoreRecords字段,作為顯示下一頁(yè)的判斷條件。
利用了這個(gè)存儲(chǔ)過(guò)程的程序代碼如下:
<%
'每頁(yè)顯示10條
Const iRecordsPerPage = 10
Dim currentPage '當(dāng)前頁(yè)號(hào)
Dim bolLastPage '在最后一頁(yè)?
if len(Request.QueryString("page")) = 0 then
currentPage = 1
else
currentPage = CInt(Request.QueryString("page"))
end if
'得到當(dāng)前頁(yè)的記錄
strSQL = "sp_PagedItems " & currentPage & "," & iRecordsPerPage
objRS.Open strSQL, objConn
'判斷是否在最后一頁(yè)
if Not objRS.EOF then
if CInt(objRS("MoreRecords")) > 0 then
bolLastPage = False
else
bolLastPage = True
end if
end if
%>
<P>
<TABLE BORDER=0 CELLSPACING=1 CELLPADDING=4 ALIGN=CENTER>
<TR><TH COLSPAN=2 BGCOLOR=NAVY>
<FONT SIZE=+1 COLOR=WHITE>
List of Items
</FONT>
</TH></TR>
<%
Do While Not objRS.EOF %>
<TR><TD ALIGN=LEFT BGCOLOR=GRAY>
<%=objRS("Name")%>
</TD><TD ALIGN=CENTER BGCOLOR=GRAY>
<%=FormatCurrency(objRS("Price"))%>
</TD></TR>
<% objRS.MoveNext
Loop %>
</TABLE>
<P>
<CENTER>
<%
'第一頁(yè)不 顯示“前一頁(yè)”
if currentPage > 1 then %>
<INPUT TYPE=BUTTON VALUE="<< 前 <%=iMaxRecords%> 記錄 "
ONCLICK="document.location.href='thispage.asp?page=<%=currentPage-1%>'"> ;
<% end if
'最后一頁(yè) 不顯示“后一頁(yè)”
if Not bolLastPage then %>
<INPUT TYPE=BUTTON VALUE="后 <%=iMaxRecords%> 記錄 >>"
ONCLICK="document.location.href='thispage.asp?page=<%=currentPage+1%>'"> ;
<% end if %>
</CENTER>