posts - 5, comments - 2, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          今天在網(wǎng)上查找信息的時(shí)候看的這個(gè)帖子,我相信以后他會(huì)給我很大的幫助,所以我將有用的都留了下來,希望可以對自己和大家都有一定的幫助。這里有兩個(gè)方法:
          第一種:(ASP分頁顯示)
           一、將數(shù)據(jù)庫中所有符合查詢條件的記錄一次性的都讀入   recordset   中,存放在內(nèi)存中,然后通過   ADO   Recordset   對象所提供的幾個(gè)專門支持分頁處理的屬性:   PageSize(   頁大小   )、   PageCount(   頁數(shù)目   )   以及AbsolutePage(   絕對頁   )   來管理分頁處理。  
            二、根據(jù)客戶的指示,每次分別從符合查詢條件的記錄中將規(guī)定數(shù)目的記錄數(shù)讀取出來并顯示。  
            兩者的主要差別在于前者是一次性將所有記錄都讀入內(nèi)存然后再根據(jù)指示來依次做判斷分析從而達(dá)到分頁顯示的效果,而后者是先根據(jù)指示做出判斷并將規(guī)定數(shù)目的符合查詢條件的記錄讀入內(nèi)存,從而直接達(dá)到分頁顯示的功能。  
            我們可以很明顯的感覺到,當(dāng)數(shù)據(jù)庫中的記錄數(shù)達(dá)到上萬或更多時(shí),第一種方法的執(zhí)行效率將明顯低于第二種方法,因?yàn)楫?dāng)每一個(gè)客戶查詢頁面時(shí)都要將所有符合條件的記錄存放在服務(wù)器內(nèi)存中,然后在進(jìn)行分頁等處理,如果同時(shí)有超過   100   個(gè)的客戶在線查詢,那么   ASP   應(yīng)用程序的執(zhí)行效率將大受影響。但是,當(dāng)服務(wù)器上數(shù)據(jù)庫的記錄數(shù)以及同時(shí)在線的人數(shù)并不是很多時(shí),兩者在執(zhí)行效率上是相差無幾的,此時(shí)一般就采用第一種方法,因?yàn)榈谝环N方法的   ASP   程序編寫相對第二種方法要簡單明了得多。  
            在這里作者就以我們常見的   ASP   BBS   程序?yàn)槔瑏斫o大家分析一下如何在   BBS   程序里實(shí)現(xiàn)分頁顯示功能,由于我們一般使用的   BBS   程序的數(shù)據(jù)庫記錄數(shù)和同時(shí)訪問的人數(shù)都不會(huì)太多,所以以下程序?qū)嵗鞘褂玫南惹八榻B的第一種分頁顯示方法。  
            進(jìn)行   ADO   存取數(shù)據(jù)庫時(shí)的分頁顯示,其實(shí)就是對   Recordset   的記錄進(jìn)行操作。所以我們首先必須了解   Reordset   對象的屬性和方法:  
            BOF   屬性:目前指標(biāo)指到   RecordSet   的第一筆;  
            EOF   屬性:目前指標(biāo)指到   RecordSet   的最后一筆;    
            Move   方法:移動(dòng)指標(biāo)到   RecordSet   中的某一條記錄;  
            AbsolutePage   屬性:設(shè)定當(dāng)前記錄的位置是位于哪一頁;  
            AbsolutePosition   屬性:目前指標(biāo)在   RecordSet   中的位置;  
            PageCount   屬性:顯示   Recordset   對象包括多少“頁”的數(shù)據(jù);    
            PageSize   屬性:顯示   Recordset   對象每一頁顯示的記錄數(shù);  
            RecordCount   屬性:顯示   Recordset   對象記錄的總數(shù)。  
             
            下面讓我們來詳細(xì)認(rèn)識(shí)一下這些重要的屬性和方法  
            一、BOF與EOF屬性  
            通常我們在ASP程序中編寫代碼來檢驗(yàn)BOF與EOF屬性,從而得知目前指標(biāo)所指向的   RecordSet的位置,使用BOF與EOF屬性,可以得知一個(gè)   Recordset   對象是否包含有記錄或者得知移動(dòng)記錄行是否已經(jīng)超出該Recordset   對象的范圍。  
            如:   <   %   if   not   rs.eof   then   ...   %>    
            <   %   if   not   (rs.bof   and   rs.eof)   %>    
            若當(dāng)前記錄的位置是在一個(gè)   Recordset   對象第一行記錄之前時(shí),   BOF屬性返回   true,反之則返回   false。  
            若當(dāng)前記錄的位置是在一個(gè)   Recordset   對象最后一行記錄之后時(shí),   EOF   屬性返回   true,反之則返回   false。  
            BOF與EOF都為False:表示指標(biāo)位于   RecordSet   的當(dāng)中。  
            BOF為   True:目前指標(biāo)指到   RecordSet   的第一筆記錄。  
            EOF為   True:目前指標(biāo)指到   RecordSet   的最后一筆記錄。  
            BOF與   EOF   都為   True:在   RecordSet   里沒有任何記錄。  
             
            二、   Move   方法  
            您可以用   Move   方法移動(dòng)指標(biāo)到   RecordSet   中的某一筆記錄,語法如下:  
            rs.Move   NumRecords,Start  
            這里的“rs”為一個(gè)對象變量,表示一個(gè)想要移動(dòng)當(dāng)當(dāng)前記錄位置的Recordset   對象;“NumRecords”是一個(gè)正負(fù)數(shù)運(yùn)算式,設(shè)定當(dāng)前記錄位置的移動(dòng)數(shù)目;“start”是一個(gè)可選的項(xiàng)目,用來指定記錄起始的標(biāo)簽。  
            所有的   Recordset   對象都支持   Move   方法,如果   NumRecords   參數(shù)大于零,當(dāng)前記錄位置向末尾的方向移動(dòng);如果其小于零,則當(dāng)前記錄位置向開頭的方向移動(dòng);如果一個(gè)空的   Recordset   對象調(diào)用   Move   方法,將會(huì)產(chǎn)生一個(gè)錯(cuò)誤。  
            MoveFirst   方法:將當(dāng)前記錄位置移至第一筆記錄。  
            MoveLast   方法:將當(dāng)前記錄位置移至最后一筆記錄。  
            MoveNext   方法:將當(dāng)前記錄位置移至下一筆記錄。  
            MovePrevious   方法:將當(dāng)前記錄位置移至上一筆記錄。  
            Move   [n]   方法:移動(dòng)指標(biāo)到第   n   筆記錄,   n   由   0   算起。  
             
            三、   AbsolutePage   屬性    
            AbsolutePage   屬性設(shè)定當(dāng)前記錄的位置是位于哪一頁的頁數(shù)編號(hào);  
            使用   PageSize   屬性將   Recordset   對象分割為邏輯上的頁數(shù),每一頁的記錄數(shù)為   PageSize(   除了最后一頁可能會(huì)有少于   PageSize   的記錄數(shù)   )。這里必須注意并不是所有的數(shù)據(jù)提供者都支持此項(xiàng)屬性,因此使用時(shí)要小心。  
            與   AbsolutePosition   屬性相同,   AbsolutePage   屬性是以   1   為起始的,若當(dāng)前記錄為   Recordset   的第一行記錄,   AbsolutePage   為   1。可以設(shè)定   AbsolutePage   屬性,以移動(dòng)到一個(gè)指定頁的第一行記錄位置。  
             
            四、   AbsolutePosition   屬性  
            若您需要確定目前指標(biāo)在   RecordSet   中的位置,您可以用AbsolutePosition   屬性。  
            AbsolutePosition   屬性的數(shù)值為目前指標(biāo)相對於第一筆的位置,由1算起,即第一筆的   AbsolutePosition   為   1。  
            注意   ,   在存取   RecordSet   時(shí),無法保證   RecordSet   每次都以同樣的順序出現(xiàn)。  
            若要啟用   AbsolutePosition,必須先設(shè)定為使用用戶端cursor(   指針   ),   asp   碼如下:  
            rs2.CursorLocation   =   3    
             
            五、   PageCount   屬性  
            使用   PageCount   屬性,決定   Recordset   對象包括多少“頁”的數(shù)據(jù)。這里的“頁”是數(shù)據(jù)記錄的集合,大小等于   PageSize   屬性的設(shè)定,即使最后一頁的記錄數(shù)比   PageSize   的值少,最后一頁也算是   PageCount   的一頁。必須注意也并不是所有的數(shù)據(jù)提供者都支持此項(xiàng)屬性。  
             
            六、   PageSize   屬性  
            PageSize   屬性是決定   ADO   存取數(shù)據(jù)庫時(shí)如何分頁顯示的關(guān)鍵,使用它就可以決定多少記錄組成一個(gè)邏輯上的“一頁”。設(shè)定并建立一個(gè)頁的大小,從而允許使用   AbsolutePage   屬性移到其它邏輯頁的第一條記錄。  
            PageSize   屬性能隨時(shí)被設(shè)定。  
             
            七、   RecordCount   屬性  
            這也是一個(gè)非常常用和重要的屬性,我們常用   RecordCount   屬性來找出一個(gè)   Recordset   對象包括多少條記錄。如:  
            <   %   totle=RS.RecordCount   %>    
            在了解了   Recordset   對象的以上屬性和方法后,我們來考慮一下,如何運(yùn)用它們來達(dá)到我們分頁顯示的目的。首先,我們可以為   PageSize   屬性設(shè)置一個(gè)值,從而指定從記錄組中取出的構(gòu)成一個(gè)頁的行數(shù);然后通過RecordCount   屬性來確定記錄的總數(shù);再用記錄總數(shù)除以   PageSize   就可得到所顯示的頁面總數(shù);最后通過   AbsolutePage   屬性就能完成對指定頁的訪問。





          第二種:

          比如建立這樣一個(gè)簡單的   BBS   應(yīng)用程序,它的數(shù)據(jù)庫中分別有以下五個(gè)字段:“ID”,每個(gè)帖子的自動(dòng)編號(hào);“subject”,每個(gè)帖子的主題;  
            “name”,加帖用戶的姓名;“email”,用戶的電子郵件地址;  
            “postdate”,加帖的時(shí)間。數(shù)據(jù)庫的   DSN   為“bbs”。我們將顯示帖子分頁的所有步驟放在一個(gè)名為“ShowList()”的過程中,方便調(diào)用。  
            程序如下:  
            '----BBS   顯示帖子分頁----  
            <   %   Sub   ShowList()   %>    
            <   %    
            PgSz=20   '設(shè)定開關(guān),指定每一頁所顯示的帖子數(shù)目,默認(rèn)為20帖一頁    
            Set   Conn   =   Server.CreateObject("ADODB.Connection")    
            Set   RS   =   Server.CreateObject("ADODB.RecordSet")    
            sql   =   "SELECT   *   FROM   message   order   by   ID   DESC"    
            '查詢所有帖子,并按帖子的ID倒序排列  
            Conn.Open   "bbs"    
            RS.open   sql,Conn,1,1  
            If   RS.RecordCount=0   then    
            response.write   "<   P><   center>對不起,數(shù)據(jù)庫中沒有相關(guān)信息!  
            <   /center><   /P>"    
            else    
            RS.PageSize   =   Cint(PgSz)   '設(shè)定PageSize屬性的值  
            Total=INT(RS.recordcount   /   PgSz   *   -1)*-1   '計(jì)算可顯示頁面的總數(shù)    
            PageNo=Request("pageno")    
            if   PageNo=""   Then    
            PageNo   =   1    
            else    
            PageNo=PageNo+1  
            PageNo=PageNo-1    
            end   if    
            ScrollAction   =   Request("ScrollAction")    
            if   ScrollAction   =   "   上一頁   "   Then    
            PageNo=PageNo-1    
            end   if  
            if   ScrollAction   =   "   下一頁   "   Then    
            PageNo=PageNo+1    
            end   if    
            if   PageNo   <   1   Then  
            PageNo   =   1    
            end   if  
            n=1  
            RS.AbsolutePage   =   PageNo  
            Response.Write   "<   CENTER>"  
            position=RS.PageSize×PageNo    
            pagebegin=position-RS.PageSize+1    
            if   position   <   RS.RecordCount   then    
            pagend=position    
            else  
            pagend=   RS.RecordCount    
            end   if  
            Response.Write   "<   P><   font   color='Navy'><   B>數(shù)據(jù)庫查詢結(jié)果:<   /B>"    
            Response.Write   "(共有"&RS.RecordCount   &"條符合條件的信息,    
            顯示"&pagebegin&"-"&pagend&")<   /font><   /p>"    
            Response.Write   "<   TABLE   WIDTH=600   BORDER=1   CELLPADDING=4    
            CELLSPACING=0   BGCOLOR=#FFFFFF>"    
            Response.Write   "<   TR   BGCOLOR=#5FB5E2><   FONT   SIZE=2><   TD>    
            <   B>主題<   /B><   /TD><   TD><   B>用戶<   /B><   /TD><   TD><   B>Email<   /B>    
            <   /TD><   TD><   B>發(fā)布日期<   /B><   /TD><   /FONT><   TR   BGCOLOR=#FFFFFF>"    
            Do   while   not   (RS   is   nothing)    
            RowCount   =   RS.PageSize    
            Do   While   Not   RS.EOF   and   rowcount   >   0    
            If   n=1   then    
            Response.Write   "<   TR   BGCOLOR=#FFFFFF>"    
            ELSE    
            Response.Write   "<   TR   BGCOLOR=#EEEEEE>"    
            End   If    
            n=1-n   %>  
            <   TD><   span   style="font-size:9pt">    
            <   A   href='view.asp?key=<   %   =RS("ID")%>'><   %   =RS("subject")%>    
            <   /A><   /span><   /td>    
            <   TD><   span   style="font-size:9pt">    
            <   %   =RS("name")%><   /A><   /span><   /td>    
            <   TD><   span   style="font-size:9pt">    
            <   a   href="mailto:<   %   =RS("email")%>"><   %   =RS("email")%><   /a>    
            <   /span>   <   /TD>    
            <   TD><   span   style="font-size:9pt">    
            <   %   =RS("postdate")%><   /span>   <   /td>    
            <   /TR>  
            <   %    
            RowCount   =   RowCount   -   1    
            RS.MoveNext    
            Loop    
            set   RS   =   RS.NextRecordSet    
            Loop    
            Conn.Close  
            set   rs   =   nothing    
            set   Conn   =   nothing    
            %>    
            <   /TABLE>    
            <   FORM   METHOD=GET   ACTION="list.asp">    
            <   INPUT   TYPE="HIDDEN"   NAME="pageno"   VALUE="<   %   =PageNo   %>">    
            <   %    
            if   PageNo   >   1   Then  
            response.write   "<   INPUT   TYPE=SUBMIT   NAME='ScrollAction'    
            VALUE='   上一頁   '>"    
            end   if    
            if   RowCount   =   0   and   PageNo   <   >Total   then    
            response.write   "<   INPUT   TYPE=SUBMIT   NAME='ScrollAction'    
            VALUE='   下一頁   '>"    
            end   if  
            response.write   "<   /FORM>"    
            End   if    
            %>    
            <   %   End   Sub   %>    
             
            相信大家都應(yīng)該能完全讀懂上面的程序,因此就不在此詳細(xì)解釋了。值得注意的是在這段程序中運(yùn)用了一個(gè)小技巧   <   INPUT   TYPE="HIDDEN"   NAME="pageno"   VALUE="<   %   =PageNo   %>">,這是用來在每次調(diào)用該ASP   文件時(shí)傳遞數(shù)據(jù)的“暗道”,由于我們需要在每次調(diào)用程序時(shí)傳遞代表當(dāng)前頁碼的參數(shù),可能大家會(huì)想到使用   session,但是從節(jié)省系統(tǒng)資源和通用性來講,用這樣一個(gè)隱藏的   form   來傳遞數(shù)據(jù)將會(huì)達(dá)到更好的效果。   
              
           


          只有注冊用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 房山区| 威信县| 泌阳县| 叙永县| 独山县| 元阳县| 冕宁县| 孟津县| 正定县| 永川市| 新乡市| 北安市| 宜州市| 成安县| 讷河市| 汉中市| 霍城县| 晋州市| 西和县| 红桥区| 赤城县| 库车县| 大城县| 青铜峡市| 崇信县| 横山县| 石泉县| 拉孜县| 家居| 石景山区| 石嘴山市| 高要市| 上杭县| 平乐县| 黎川县| 新乐市| 乐业县| 日照市| 称多县| 游戏| 鄢陵县|