Microsoft の ASP プログラミング システムでは、ADO オブジェクトの確立により、Web ページからデータベースに簡単にアクセスできるようになり、特に ADO の Recordset オブジェクトにより、データの出力と表示をより便利かつ自由に制御できるようになります。 Visual InterDev6.0(以下、VI6.0)では、スクリプト オブジェクト モデル(以下、SOM)、デザインタイム コントロール(以下、DTC)、データ環境オブジェクトなどのオブジェクト モデルの導入により、モデル (以下、DEOM と呼びます)。これにより、Web ページからデータベースにアクセスする設計がより便利になります。
データベース接続に関する主題のため、以下ではコードと簡単なコメントのみを示し、Recordset オブジェクト (またはコントロール) を使用してデータ レコードのページング表示を実現する方法に焦点を当てます。私の理解によれば、ページング表示の鍵は、ADO の Recordset オブジェクトまたは DTC の Recordset コントロール (デザインタイム コントロール) のプロパティとメソッドの習熟度にあります。
ページに表示されるこれら 7 種類の武器は、次の 4 つのカテゴリに要約できます。
1 つ目と 2 つ目の方法を仮に純粋 ASP 方式と呼びますが、これは国内の ASP Web サイトで最も一般的に使用されている方法でもあり、両者の違いは実装技術のみです。これら 2 つのメソッドの実装は最も理解しやすく、使用するオブジェクトの概念が最も少なく、開発環境の要件も最も低くなります (メモ帳だけで十分です)。これら 2 つのメソッドの本質は依然として CGI プログラミングのアイデアであると言えますが、ADO オブジェクトがプログラムに導入されています。
4 番目と 5 番目の DHTML メソッドは、一時的に SOM と呼ばれます。これら 2 つの方法では、Microsoft によって提案されたスクリプト オブジェクト モデルと、VI6.0 環境の DHTML の Table オブジェクトの新しいデータベース バインディング機能を使用する必要があります (多くの書籍や記事では、DHTML の CSS 機能のみが紹介されています。スタイルで使用されています)設計を変更し、そのデータ バインディング機能の導入を無視して、クライアント側でページめくりを制御します。ただし、ユーザーのブラウザが Microsoft Internet Explorer 4.0 以降などの DHTML をサポートしている必要があります。
6 番目のメソッドは、一時的に SOM サーバー側メソッドと呼ばれます。 VI6.0 環境で開発する必要があり、Microsoft が提案するスクリプト オブジェクト モデルのいくつかの DTC コントロール (Recordset、PageObject、Grid など) を使用して、サーバー側 (クライアント) でページめくり制御を実装します。これは、Web ページをオブジェクトとして扱うエキサイティングな新しいプログラミング手法です (このオブジェクト モデルは、従来の DOM ドキュメント オブジェクト モデルとは異なります。DOM はクライアントのみを制御できますが、SOM はサーバーとクライアントを制御できます)。オブジェクトを真に実現します。 Web ページの指向性プログラミング。しかし、残念ながら私の個人的な能力のせいでしょうか、この技術はまだあまり成熟していないと思います。たとえば、後で詳しく説明しますが、ブラウザとの統合はあまり良くありません。
7番目の方法を仮にDEOM法と名付けます。また、VI6.0 で確立されたデータ環境オブジェクト モデルを使用して Recordset オブジェクトを作成します。これも Web プログラミングでは比較的新しい方法であり、SOM モデルと比較して独自の利点があります。これについては後で詳しく説明します。
以下に挙げるサンプル ソース コードはすべて、原則を理解する必要がなく、太字と斜体の部分を対応するデータベース名またはフィールド名に置き換えるだけで、コピーして使用できます。
さまざまなページング方法を詳しく紹介する前に、まずデータベースを作成しましょう。Office97 のアクセスを使用して Employee.mdb を作成し、その中にテーブル emp を作成し、emp ID、姓、名という 3 つのフィールドだけを設定します。なぜこれほど単純なのかというと、レコードセットの結果をどのように処理するかが重要だからです。
1つ目の方法:パラメータを直接置換する方法
この方法では、Recordset オブジェクトを手動で作成し、その pagesize (ページごとに指定された表示レコード数)、pagecount (合計ページ番号)、およびAbsolutepage (現在のページ番号) プロパティを使用してページング出力を制御します。ページングでは、<href> を使用してページ番号パラメータを直接取得し、ページめくりを制御します。 Web ページの名前は emp1.asp です。ソースコードは次のとおりです。
<%//employee.mdb データベースとの接続を確立します。
conn = Server.CreateObject(ADODB.Connection) を設定します
conn.Open driver={Microsoft Access Driver (*.mdb)};dbq=employee.mdb
// emp テーブルの Recordset オブジェクト インスタンス rs を作成します。
Set rs = Server.CreateObject(ADODB.Recordset)
rs.emp、conn、3 を開く
PageSize = 10 //pagesize 属性は、各ページに表示されるレコードの数を指定します
Page = CLng(Request(Page)) 'string型をlong型に変換
ページ < 1 の場合、ページ = 1
ページ > rs.PageCount の場合、ページ = rs.PageCount
ページ<> 1 の場合は
Response.Write <A HREF=emp1.asp?Page=1>最初のページ</A>
Response.Write <A HREF=emp1.asp?Page= & (Page-1) & >前のページ</A>
終了する場合
If Page <> rs.PageCount then
Response.Write <A HREF=emp1.asp?Page= & (Page+1) & >次のページ </A>
Response.Write <A HREF=emp1.asp?Page=&rs.PageCount & >最後のページ</A>
終了する場合
Response.write ページ番号: & Page & / & rs.PageCount & </font>
//各ページの表示
// ヘッダーを表示します
Response.Write <CENTER><TABLE BORDER=1>
Response.WRITE <TR><TD> & rs.Fields(emp ID).Name & </TD>
Response.WRITE <TD> & rs.Fields(姓).Name & </TD>
Response.WRITE <TD> & rs.Fields(名).Name & </TD></TR>
//ループして各レコードを表示します
rs.AbsolutePage = Page //現在のページの最初のレコード番号を知るために、absolutepage 属性にページ番号を割り当てます。
iPage = 1 から rs.PageSize //
Response.WRITE <TR><TD> & rs.Fields(emp ID).Value & </TD>
Response.WRITE <TD> & rs.Fields(名).Value & </TD>
Response.WRITE <TD> & rs.Fields(last name).Value & </TD></TR>
rs.次へ移動
rs.EOF の場合は終了します
次
Response.Write </TABLE></CENTER>%>
2 番目のタイプ: フォーム送信パラメータ方式
このメソッドは、Recordset オブジェクトを作成するときの最初のメソッドと同じですが、ページめくりを制御するときに、<input> と case ステートメントを使用してページめくりを実現します。 Web ページの名前は emp2.asp です。この方法には、プログラミング ロジックに欠点があります。ブラウザーで「前ページ」または「次ページ」ボタンを押した後、更新ボタンを押すと、ページが自動的に切り替わります。ソースコードは次のとおりです。
if Pagenum = then Pagenum = 1 //最初のページから表示を開始します
//データベース接続と Recordset オブジェクト インスタンス rs を確立します。
最初の方法と同じなので、ここでは省略します。
RS.Pagesize = 10 '1 ページに表示されるレコード数を 10 に設定します
// ページめくりの動作を決定する
ケースリクエスト選択(NAV)
場合
セッション(ページ番号) = 1
case First ' 最初のレコード
セッション(ページ番号) = 1
case Prev ' 前のレコード
セッション(ページナム) > 1の場合
セッション(ページ番号) = セッション(ページ番号) - 1
終了する場合
case 次の ' 次のレコード
if session(Pagenum)<RS.PageCount then
セッション(ページナム) = セッション(ページナム) + 1
次の場合に終了
case Last ' 最後のレコード
セッション(ページ番号) = RS.PageCount
エンドセレクト
RS.Absolutepage = Clng(session(Pagenum)) //現在のページの最初のレコード番号を決定します
// 現在のページを表示
最初の方法と同じなので、ここではスキップします。
// ナビゲーションページボタンの設定
<フォームメソッド=GETアクション=emp2.asp>
<入力タイプ=送信名=NAV値=ホームページ>
<入力タイプ=送信値=前のページ名=NAV>
<入力タイプ=送信値=次ページ名=NAV>
<入力タイプ=送信値=最終ページ名=NAV></form>
3 番目のタイプ: グリッド コントロールを使用してページングを設計する
すべての方法の中で、これが最も簡単です。 DTC の Recordset コントロールと Grid コントロールを ASP Web ページにドラッグするだけです。さらに、ページめくりをサーバー プラットフォームで制御するかクライアント プラットフォームで制御するかを選択することもできます。欠点は、テーブルで指定された形式で表示する必要があり、テーブルの表示形式を自分で自由に制御できないことです。
その方法は次のとおりです。
VI6.0 でプロジェクト emp.vip を作成します。次に、ASP Web ページ (emp3.asp) をプロジェクトに追加します。
ステップ 1: VI6.0 のメニュー バーで [データ接続の追加...] を選択し、開発ツールのナビゲーション プロンプトに従ってください。Employee.mdb データベースとの接続を簡単に確立できます。 Recordset コントロールを DTC ツールバーから Web ページにドラッグし、そのプロパティを設定します。図に示すように:
コントロールを Web ページにドラッグすると、VI6.0 はスクリプト オブジェクト モデルを使用するかどうかを自動的に尋ねるプロンプトを表示します。[はい] を押します。
ステップ 3: グリッド コントロールを DTC ツールバーから Web ページにドラッグし、マウスを右クリックして次のようなプロパティを設定します。 2 番目のステップで作成した Recordset コントロールの名前を選択し、emp テーブル内のフィールドを選択します。 、各ページの表示件数や表示形式など。とてもシンプルで便利です。ナビゲーションの指示に従うだけです。
4 番目のメソッド: DHTML メソッド 1。
データ レコードは HTML テーブルに表示されます。 DHTML のテーブルのデータ バインディング機能を使用して、レコードのページング表示を制御します。欠点は、ページめくりの方法が特定の方法に限定されることです。つまり、最初と最後のページではなく、前後のページのみに限定されることです。ページめくりはクライアント側で制御されるため、この方法と 5 番目の方法が最も高速ですが、残念ながら、DHTML をサポートするブラウザでのみ使用できます。
DHTML では、<TABLE> の DATASRC 属性によってテーブルをデータ ソースにバインドできるようになり、別の属性 DATAPAGESIZE によってページに一度に表示されるレコードの数が指定されます。
次の例を見てみましょう。
ステップ 1: Recordset コントロールを新しく作成した Web ページ emp4.htm にドラッグし、そのプロパティを設定します。この方法は 3 番目の方法と同じであるため、ここでは省略します。
ステップ 2: 次のコードを入力します。
<TABLE ID=Table1 DATASRC=#Recordset1_RDS DATAPAGESIZE=5> //以前は Recordset コントロールに Recordset1 という名前が付けられていたとします。 1 ページに 5 件のレコードを表示します。
<ヘッド>
<TH ALIGN=left WIDTH=150>Emp ID</TH> //ヘッダを出力
<TH ALIGN=左 WIDTH=200>姓</TH>
<TH ALIGN=左 WIDTH=200>名</TH>
</ヘッド>
<TR>
<TD><DIV DATAFLD=Emp ID></DIV></TD> //テーブル内容を出力
<TD><DIV DATAFLD=姓></DIV></TD>
<TD><DIV DATAFLD=名></DIV></TD>
</TR>
</TABLE>
ステップ 3: 次に、ページ ナビゲーション用の DTC ボタン ボタン コントロールのペアを追加します。1 つは btnPrevious (前のページ) という名前で、もう 1 つは btnNext (次のページ) という名前です。対応するスクリプトは次のとおりです。
<スクリプト言語=VBScript>
関数 btnPrevious_onclick()
Table1.previousPage()
終了機能
関数 btnNext_onclick()
Table1.nextPage()
終了機能
</スクリプト>
5 番目のメソッド: DHTML メソッド 2
この方法は 4 番目の方法を改良したものです。スクリプトを手動で記述する方法を使用すると、トップ ページと最終ページのナビゲーション ボタンを作成し、各レコードの位置 (レコード番号) を決定できます。紙面の都合上、以下では具体例のみを紹介し、簡単に説明させていただきます。 DHTML および Recordset コントロールに関するその他のプロパティとメソッドについては、関連する書籍を参照してください。ここで注意する必要があるのは、Recordset コントロールは、1 番目と 2 番目のメソッドで紹介された ADO Recordset オブジェクトとは若干異なることです。Recordset コントロールは、ページサイズやページカウントなどのプロパティを直接提供せず、説明されているメソッドを使用して計算する必要があります。下に。
ステップ 1: Recordset コントロールを新しく作成した Web ページ emp5.htm にドラッグし、Recordset1 という名前を付け、そのプロパティを設定します。この方法は 3 番目の方法と同じなので、ここでは省略します。
ステップ 2: 3 つのグローバル変数を定義し、Recordset1 の ondatasetcomplete (データ設定が完了) スクリプトを記述します。
Dim gCurrentPageNumber //現在のページ番号
Dim gMaxPageNumber //最大ページ数
Dim gRecordsPerPage //ページごとのレコード数を表示します
gRecordsPerPage = 5 //ページごとに表示されるレコード数を 5 レコードに設定します。
関数 Recordset1_ondatasetcomplete()
totalRecordCount = Recordset1.getCount() //レコードの総数
gMaxPageNumber = Int(totalRecordCount / gRecordsPerPage) //最大ページ数を取得する
(totalRecordCount Mod gRecordsPerPage) > 0 の場合
gMaxPageNumber = gMaxPageNumber + 1
終了する場合
終了機能
ステップ 3: ページ ナビゲーション ボタンを作成します。
関数 btnFirst_onclick() 'ホームページに移動
g現在のページ番号 = 1
DisplayData()
終了機能
関数 btnPrevious_onclick() '前のページに移動
if gCurrentPageNumber > 1 then
gCurrentPageNumber = gCurrentPageNumber - 1
DisplayData()
終了する場合
終了機能
関数 btnNext_onclick() '次のページに移動
if gCurrentPageNumber < gMaxPageNumber then
gCurrentPageNumber = gCurrentPageNumber + 1
DisplayData()
終了する場合
終了機能
関数 btnLast_onclick() '最後のページに移動
gCurrentPageNumber = gMaxPageNumber
DisplayData()
終了機能
ステップ 4: 各ページを表示する関数を作成します。多くの DHTML 属性とメソッドが使用されているため、関連する書籍を参照することをお勧めします。
サブディスプレイデータ()
startRecord = ((gCurrentPageNumber - 1) * gRecordsPerPage) + 1 //各ページの先頭に表示されるレコード数(位置、番号)を計算します
行Ctr = 1
lblPageNumber.innerHTML = gCurrentPageNumber & / & gMaxPageNumber
For recordPtr = startRecord To (startRecord + gRecordsPerPage - 1) //ページの各レコードを表示するループ
If recordPtr > Recordset1.getCount() then //空のテーブルを表示
Table1.rows(rowCtr).cells(0).innerHTML = <P> </P>
Table1.rows(rowCtr).cells(1).innerHTML = <P> </P>
Table1.rows(rowCtr).cells(2).innerHTML = <P> </P>
Table1.rows(rowCtr).cells(3).innerHTML = <P> </P>
Else //各ページを具体的に表示する
Recordset1.moveAbsolute(recordPtr) //レコードポインタを移動します。
empID = Recordset1.fields.getValue(emp ID)
empLName = Recordset1.fields.getValue(名)
empFName = Recordset1.fields.getValue(姓)
Table1.rows(rowCtr).cells(0).innerText = RecordPtr ' カウンタ
Table1.rows(rowCtr).cells(1).innerText = empID
Table1.rows(rowCtr).cells(2).innerText = empLName
Table1.rows(rowCtr).cells(3).innerText = empFName
終了する場合
行Ctr = 行Ctr + 1
次
エンドサブ
さらに、ウィンドウ オブジェクトの onload イベントに次のスクリプトを記述する必要もあります。
rowCtr = 1 の場合、gRecordsPerPage まで
Table1.insertRow(rowCtr) '新しい列を挿入
cellCtr = 0 ~ 3 の場合
Table1.rows(rowCtr).insertCell()
次
次
6番目の方法: サーバー側制御のページめくり方法。
サーバー側でデータをページ分割して HTML ステートメントを作成し、それをクライアントに出力する場合、ブラウザーが DHTML をサポートしていなくても問題はありません。ただし、サーバー側メソッドを使用すると、ページをめくるたびに Recordset コントロールを再生成する必要があるため、DHTML メソッドを使用するよりも速度が明らかに遅くなります。しかし、サーバーが十分に高速であれば、この遅いクライアントはそれに気づきません。
次の例では、新しい DTC コントロール PageObject を紹介します。この制御により、指定された Web ページが Web ページ オブジェクトとなり、この Web ページのサーバー スクリプト内でユーザーが編成したサブルーチンや関数が Web ページ オブジェクトのメソッドとみなすことができます。これは、状態情報を管理する高度な方法を提供します。Web ページ オブジェクトにはいくつかのプロパティ (変数) があり、ユーザーはこれらのプロパティの有効期間を定義できます。上記の特性により、ページめくりスクリプトをコンパイルするのに非常に便利です。
ただし、この方法の欠点は、「前ページ」または「次ページ」ボタンを押してからブラウザの更新ボタンを押すと、Web ページが自動的に切り替わってしまうことです。また、ブラウザの戻るボタンを押してからページ送りボタンを押すと、ランダムなページが表示される場合があります。これはすべて、Web ページ オブジェクトのプロパティ (グローバル変数) によって引き起こされます。
ステップ 1: Recordset コントロールを新しく作成した Web ページ emp6.asp にドラッグし、Recordset1 という名前を付け、そのプロパティを設定します。この方法は 3 番目の方法と同じなので、ここでは省略します。
ステップ 2: PageObject コントロールを Web ページにドラッグし、emplist という名前を付けます。次に、このコントロールを右クリックしてプロパティ ページを開き、MaxPageNumber、RecordsPerPage、および CurrentPageNumber の 3 つのプロパティ (グローバル変数) を設定します。 VI6.0 では、get メソッドと set メソッドを使用して値を読み書きできます。具体的な使用方法については、関連情報を参照してください。
ステップ 3: Recordset1 の ondatasetcomplete イベントを書き込みます。
関数 Recordset1_ondatasetcomplete()
ページあたりのレコード = 5
empList.setRecordsPerPage(recordsPerPage)//Web ページ オブジェクトのページあたりのレコード数属性を 5 に設定します
totalRecordCount = Recordset1.getCount()//レコードセット内のレコードの総数を取得します
mpn = Int(totalRecordCount / recordsPerPage) //mpn を総ページ数として計算します
(totalRecordCount Mod recordsPerPage) > 0 の場合
mpn = mpn + 1
終了する場合
empList.setMaxPageNumber(mpn)
終了機能
ステップ 4: 4 つのボタン コントロールを Web ページにドラッグし、ページめくり制御スクリプトを作成します。ページめくりは主に、Web ページ オブジェクトの CurrentPageNumber プロパティの値を変更することで実現します。
関数 btnFirst_onclick() 'ホームページに移動
empList.setCurrentPageNumber(1)
終了機能
関数 btnPrevious_onclick() '前のページに移動
cpn = empList.getCurrentPageNumber()
cpn > 1 の場合
empList.setCurrentPageNumber(cpn - 1)
終了する場合
終了機能
関数 btnNext_onclick() '次のページに移動
cpn = empList.getCurrentPageNumber()
if cpn < empList.getMaxPageNumber() then
empList.setCurrentPageNumber(cpn + 1)
終了する場合
終了機能
関数 btnLast_onclick() '最後のページに移動
empList.setCurrentPageNumber( empList.getMaxPageNumber() )
終了機能
初めてページに入ったときに最初のページが表示されるようにするには、Web ページ オブジェクトの onEnter イベントも記述する必要があります。
関数empList_onEnter()
empList.firstEntered の場合
empList.setCurrentPageNumber(1)
終了する場合
終了機能
ステップ 5: 各ページを表示するスクリプトを作成します。
<HR><TABLE BORDER=0><TR>//ヘッダーを表示
<TH ALIGN=左 WIDTH=35></TH>
<TH ALIGN=left WIDTH=150>エンプID</TH>
<TH ALIGN=左 WIDTH=200>姓</TH>
<TH ALIGN=左 WIDTH=200>名</TH></TR>
<%
pageNumber = empList.getCurrentPageNumber()//DHTMLメソッド2と同様にページめくりに必要な各種パラメータを計算します
recordsPerPage = empList.getRecordsPerPage()
startRecord = ((ページ番号 - 1) * ページごとのレコード) + 1
lastRecord = Recordset1.getCount()
RecordPtr = startRecord To (startRecord + recordsPerPage - 1)%> の場合
<%レコードセット1.EOF = Trueの場合%>
<TR>
<TD> </TD>
<TD> </TD>
<TD> </TD>
<TD> </TD>
</TR>
<%その他%>
<%Recordset1.moveAbsolute(recordPtr)%>
<TR>
<% If recordPtr <= lastRecord then %>
<TD><%=recordptr%></TD>
<%その他%>
<TD> </TD>
<%End If %>
<TD><%=Recordset1.fields.getValue(emp ID)%></TD>
<TD><%=Recordset1.fields.getValue(姓)%></TD>
<TD><%=Recordset1.fields.getValue(名)%></TD>
</TR>
<%End If%>
<%次%>
</TABLE><HR>
7つ目の方法:Data Environment Object Model(データ環境オブジェクトモデル)方法
データ環境オブジェクト モデルは、ADO オブジェクト モデルとそのオブジェクト (Connection、Command、Recordset、Field、および Parameter オブジェクト) をより単純な形式に抽象化します。データ環境オブジェクト モデルは、コマンドをメソッドとして公開します。ユーザーはこれらのメソッドを呼び出すことができ、コマンドを実行して結果のレコードセットを返します。 DEOM オブジェクト モデルの詳細については、関連書籍を参照してください。次の Web ページ emp7.asp の例を見てみましょう。
ステップ 1: VI6.0 のプロジェクト エクスプローラー ウィンドウでプロジェクトを右クリックし、ポップアップ メニューからデータ接続の追加を選択します。 VI によって与えられるナビゲーション プロンプトに従ってデータベースへの接続を確立した後、ユーザーは ASP アプリケーションからデータベースにアクセスするためのデータ コマンドを追加します。同時に、プロジェクト エクスプローラー ウィンドウの global.asa ファイルの下にデータ環境オブジェクトが表示されます。
ステップ 2: データ環境オブジェクトを右クリックし、ポップアップ メニューから [データ コマンドの追加] オプションを選択して、データ コマンド Command1 を追加します。 VI6.0 のナビゲーション プロンプトに従って、Command1 プロパティ ポップアップ ウィンドウの一般ページで SQL ステートメントを選択し、「select * from emp」と入力できます。 OKを押して戻ります。
ステップ 3: データ コマンドを作成すると、データ環境オブジェクトのメソッドが作成されます。このメソッドをスクリプトから呼び出すと、メソッドはユーザーにレコードセットを返します。
thisPage.createDE() //SOM モードでは、thisPage は現在の Web ページ オブジェクトを表し、createDE() メソッドは DE オブジェクトを作成します。
DE.Command1//DE オブジェクトのコマンドを実行します。このコマンドの後にパラメータを続けることができます。これは、条件付きクエリを実行するときに非常に便利です。
Set rs=DE.rsCommand1//DE.rscommand1 は、rs オブジェクトを ADO Recordset オブジェクトと完全に同等にします。
ステップ 4: rs は ADO オブジェクトであるため、次のページめくりコードは上で紹介したいくつかのメソッドを完全に参照しているため、ここではスキップされます。
その他、FrontPage2000のデータベースナビゲーションに実装されているメソッドなどもありますが、本題とは関係ないのでここでは割愛します。
要約すると、これまでに紹介した各方法には多くの新しい技術が含まれていますが、紙面の制約により詳しく説明することはできません。この記事では、ページめくりの具体的な例を通じて ASP Web ページ プログラミングのさまざまな方法を紹介し、Web ページを作成する際の VI6.0 の強力な機能を体験し、ADO、DHTML、DTC コントロールの使用方法を理解してもらいたいと考えています。 , SOM オブジェクト モデルと DEOM オブジェクト モデルは、Web ページをコンパイルする際により多くの選択肢と参照を提供できることを願っています。