ADOがデータベースにアクセスするときのページ表示方法

8351 ワード

データベースのクエリー結果をページングするにはどうすればいいのでしょうか.実は方法はたくさんありますが、主に2つあります.
一、データベース内のクエリー条件を満たすすべてのレコードを一度にrecordsetに読み込み、メモリに保存し、ADO Recordsetオブジェクトが提供するいくつかのページング処理を専門にサポートする属性:PageSize(ページサイズ)、PageCount(ページ数)、AbsolutePage(絶対ページ)によってページング処理を管理する.
二、お客様の指示により、照会条件を満たすレコードから所定数のレコード数をそれぞれ読み出して表示する.
両者の主な違いは、前者は、全ての記録を一度にメモリに読み込んだ後、指示に従って順次判断分析を行い、ページング表示の効果を達成することであり、後者は、指示に基づいて判断し、所定数のクエリー条件に合致する記録をメモリに読み込んで、直接ページング表示の機能を達成することである.
データベース内のレコード数が1万以上に達すると、1つ目のメソッドの実行効率は2つ目のメソッドよりも著しく低下することが明らかになります.なぜなら、各クライアントがページをクエリーする際に、条件に合致するすべてのレコードをサーバメモリに格納し、ページ分けなどの処理を行い、同時に100以上のクライアントがオンラインクエリーを行う場合、ASPアプリケーションの実行効率に大きな影響を与えます.しかし,サーバ上のデータベースの記録数や同時オンラインの人数がそれほど多くない場合,両者は実行効率においてほぼ同じであるが,この場合,第1の方法のASPプログラム作成は第2の方法に比べて簡明であるため,第1の方法を採用するのが一般的である.
ここで著者らは、一般的に使用されているASP BBSプログラムを例に、BBSプログラムでページング表示機能を実現する方法を分析します.一般的に使用されているBBSプログラムのデータベース記録数と同時にアクセスする人数はあまり多くないので、以下のプログラムの例は、以前に紹介した最初のページング表示方法を使用します.
ADOアクセスデータベースを行う際のページング表示は,Recordsetのレコードを操作することである.まず、Reordsetオブジェクトのプロパティと方法を理解する必要があります:BOFプロパティ:現在の指標はRecordSetの最初のペンを指しています.
EOF属性:現在の指標はRecordSetの最後の一筆を指す.
Moveメソッド:レコードに指標を移動します.
AbsolutePageプロパティ:現在のレコードの位置を設定します.AbsolutePositionプロパティ:RecordSetの現在の指標の位置.
PageCountプロパティ:Recordsetオブジェクトに含まれる「ページ」のデータを表示します.
PageSizeプロパティ:Recordsetオブジェクトの各ページに表示されるレコード数を表示します.
RecordCountプロパティ:Recordsetオブジェクトレコードの合計数を表示します.
これらの重要な属性と方法を詳しく理解してみましょう
一、BOFとEOF属性
通常、ASPプログラムでコードを作成してBOFとEOFの属性を検証し、現在の指標が指すRecordSetの位置を知る.BOFとEOFの属性を使用して、1つのRecordsetオブジェクトに記録が含まれているかどうか、または移動記録行がそのRecordsetオブジェクトの範囲を超えているかどうかを知ることができる.
例:<%if not rs.eof then...%>
   < % if not (rs.bof and rs.eof) %>
現在のレコードの位置がRecordsetオブジェクトの最初の行のレコードの前である場合、BOF属性はtrueを返し、逆にfalseを返します.
現在のレコードの位置がRecordsetオブジェクトの最後の行のレコードの後である場合、EOF属性はtrueを返し、逆にfalseを返します.
BOFもEOFもFalse:指標がRecordSetの中にあることを示す.
BOFはTrue:現在の指標はRecordSetの最初の記録を指す.EOFはTrue:現在の指標はRecordSetの最後の記録を指す.
BOFもEOFもTrue:RecordSetには何の記録もありません.
二、ムーブ方法
Moveメソッドを使用して、RecordSetのレコードに指標を移動できます.構文は次のとおりです.
  rs.Move NumRecords,Start
ここで「rs」は、現在の記録位置を移動したいRecordsetオブジェクトを表すオブジェクト変数である.「NumRecords」は、現在の記録位置の移動数を設定する正負数演算式である.「start」は、レコードの開始ラベルを指定するオプションのアイテムです.
すべてのRecordsetオブジェクトは、NumRecordsパラメータがゼロより大きい場合、現在の記録位置が末尾方向に移動するMoveメソッドをサポートします.ゼロより小さい場合、現在の記録位置は先頭の方向に移動します.空のRecordsetオブジェクトがMoveメソッドを呼び出すと、エラーが発生します.
MoveFirstメソッド:現在の記録位置を最初の記録に移動します.
MoveLastメソッド:現在の記録位置を最後の記録に移動します.
MoveNextメソッド:現在の記録位置を次の記録に移動します.MovePreviousメソッド:現在の記録位置を前の記録に移動します.
Move[n]メソッド:nペン目のレコードに指標を移動し,nを0から算出する.
三、AbsolutePage属性
AbsolutePageプロパティは、現在のレコードの位置がどのページにあるページ番号かを設定します.PageSizeプロパティを使用してRecordsetオブジェクトを論理的なページ数に分割します.各ページのレコード数はPageSizeです(最後のページを除いてPageSizeより少ないレコード数がある場合があります).ここでは、すべてのデータプロバイダがこのプロパティをサポートしているわけではないので、注意して使用してください.
AbsolutePositionプロパティと同様にAbsolutePageプロパティは1から始まり、現在レコードがRecordsetの最初の行レコードであればAbsolutePageは1になります.AbsolutePageプロパティを設定して、指定したページの最初の行のレコード位置に移動できます.
四、AbsolutePosition属性
現在の指標がRecordSetにある場所を特定する必要がある場合は、AbsolutePositionプロパティを使用します.
AbsolutePosition属性の数値は,現在の指標が第1ペンに対する位置であり,1から計算すると,第1ペンのAbsolutePositionは1である.
なお、RecordSetへのアクセスでは、RecordSetが毎回同じ順序で現れることは保証されない.
AbsolutePositionを有効にするには、ユーザー側cursor(ポインタ)を使用するように設定する必要があります.aspコードは次のとおりです.
  rs2.CursorLocation = 3
五、PageCount属性
PageCountプロパティを使用して、Recordsetオブジェクトに含まれる「ページ」のデータを決定します.ここでの「ページ」はデータレコードの集合であり,大きさはPageSize属性の設定に等しく,最後のページのレコード数がPageSizeの値より少なくても,最後のページはPageCountの1ページである.このプロパティは、すべてのデータプロバイダがサポートしているわけではありません.
六、PageSize属性
PageSizeプロパティは、ADOがデータベースにアクセスするときにページを分割して表示する方法を決定する鍵であり、論理的な「ページ」を構成するレコードの数を決定するために使用します.AbsolutePageプロパティを使用して他の論理ページの最初のレコードに移動できるように、ページのサイズを設定して作成します.PageSize属性はいつでも設定できます.七、RecordCount属性
これも非常に一般的で重要な属性であり、RecordCount属性を使用して、Recordsetオブジェクトにどれだけのレコードが含まれているかを特定します.例:<%totle=RS.RecordCount%>
Recordsetオブジェクトの上記の属性と方法を理解した後,それらをどのように用いてページ表示の目的を達成するかを考えてみよう.まず、PageSizeプロパティに値を設定して、レコードグループから取り出したページを構成する行数を指定できます.レコードの合計数は、RecordCount属性によって決定される.さらに記録総数をPageSizeで割ると表示されるページ総数が得られる.最後にAbsolutePageプロパティを使用すると、指定したページへのアクセスが完了します.複雑ではないようですが、プログラムがどのように実現されるか見てみましょう.
データベースには、「ID」、各投稿の自動番号の5つのフィールドがあります.「subject」、各投稿のトピック;「name」は、ユーザーの名前を書き込みます.「email」、ユーザーの電子メールアドレス.「postdate」、投稿の時間.データベースのDSNは「bbs」です.投稿のページングを表示するすべての手順を、「ShowList()」という名前のプロセスで簡単に呼び出すことができます.手順は次のとおりです.

'----BBS       ----
< % Sub ShowList() %>
< %
PgSz=20 '    ,             ,   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>   ,          !< /center>< /P>"
else
RS.PageSize = Cint(PgSz) '  PageSize    
Total=INT(RS.recordcount / PgSz * -1)*-1 '          
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.RecordCout
end if 
Response.Write "< P>< font color='Navy'>< B>       :< /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>    < /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 %>

みんなが上のプログラムを完全に読めると信じているので、編集者はここで詳しく説明しません.このプログラムでは、ASPファイルを呼び出すたびにデータを渡すための「暗道」として、プログラムを呼び出すたびに現在のページ番号を表すパラメータを渡す必要があるため、sessionを使用することを考えるかもしれません.しかし、システムリソースの節約と汎用性から言えば、このような隠れたformでデータを伝達すると、より良い効果が得られます.
以上が本文のすべての内容で、みんなの学習に役立つことを望みます.