對於Recordset分頁時出現負數的現象,相信會有很多人遇到過這個問題,有時百度、GOOGLE也不得其解,現在由我來總結一下。
出現負數,主要和游標類型有關係。 (為舉例方便,假設已經有一個conn.asp鏈接數據庫的文件並且已經include)現在舉一個例子,代碼如下:
sql=Select * from表名where條件order by ID desc'這裡的order by 條件可根據自己需要改寫
Set rs=conn.execute(sql)'===注意一下這一句===
rs.pagesize=10 '===設置每頁的記錄數為10===
page=request.querystring(page)
If page= Then page=1
If Not IsNumeric(page) Then page=1
page=clng(page)
If page<1 Then page=1
If page>rs.pagecount Then page=Vrs.pagecount
rs.absolutepage=page
dim c
c=1
Do while Not rs.eof And c<=rs.pagecount
'輸出內容
c=c+1
rs.movenext
Loop
'做頁面的鏈接
根據上面的代碼,RecordSet對象直接由代碼:Set rs=conn.execute(sql),使用該句後,RecordSet對象默認的游標為0,即游標只能向前滾動,鎖定類型為0,表示只讀鎖定,不能更新RecordSet對象。
所以,對於分頁時如果出現負數,則檢查RecordSet對像是否寫為以上形式,要寫成:
Set rs=Server.CreateObject(adodb.recordset)
rs.open sql,conn,1,3
以上表示游標為1,可向前向後移動;鎖定類型為3,可批量更新多條記錄。
根據上述方法做基本上不再會有問題,但為保險,根據RecordSet分頁的原理是根據讀取所有記錄後獲取記錄數,所以先讓游標滾動一圈,在級rs.pagesize=10 後面加上以下兩句:
rs.movelast '游標移至最後
rs.movefirst '游標移到最前
已知RecordSet的分頁原理為先把整個數據庫裡面的記錄讀出後才能獲取rs.Recordcount(記錄總數)的值。這種分頁方法比較簡單,但是有一個致命的壞處,當數據庫裡記錄數有很多條時,根據其分頁原理,這樣就會佔用很高的系統資源,非常浪費,建議在實際編程中不使用該方法。現在給大家一個思路,可以在SQL查詢語句裡做分頁處理,每次讀取固定的記錄數,具體如下:
從數據庫表中的第M條記錄開始取N條記錄,利用Top關鍵字:注意如果Select語句中既有top,又有order by,則是從排序好的結果集中選擇:
SELECT*
FROM(SELECTTopN*
FROM(SELECTTop(M+N-1)*FROM表名OrderbyIDdesc)t1)t2
OrderbyIDdesc
用以上SQL語句進行分頁,錯誤會比較少,最重要得是效率比較高。