「[[Open棟梁 wiki>https://opentouryo.osscons.jp]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-[[戻る>アプリケーション設計のポイント]]

*目次 [#f632d0c9]
#contents

*概要 [#ff71b0a1]
一覧ページ制御方式を決定しておく。

-[[最大表示件数・取得件数>#m6e81074]]
-[[ページ制御の有・無>#ubc2ad44]]

*最大表示件数・取得件数 [#m6e81074]
最大表示件数(1画面に表示する最大件数)・最大取得件数(1回の検索で取得する最大レコード件数)は、~
configファイルなどに設定し、基本的に、この最大表示件数・最大取得件数に従ってページ制御をする。~
ただし、業務要件に応じて件数が異なる可能性があることを考慮し、個別の対応もする。

**最大取得件数の指定方法 [#f4eafd61]
最大取得件数の指定方法は以下の通り。

***Oracleの場合 [#w92dea7a]
Oracle8i R8.1.5以降で、[Row1]列の昇順に上位10件を取得するような場合、ROWNUMを使用できる。

 SELECT * FROM (SELECT * FROM Table1 ORDER BY Row1) WHERE ROWNUM <= 10

***SQL Serverの場合 [#x955098f]
Microsoft SQL Server 7.0以降で、例えば[Row1]列の昇順に上位10件を取得するような場合、TOP句を使用できる。

 SELECT TOP 10 * FROM Table1 ORDER BY Row1

*ページ制御の有・無 [#ubc2ad44]
一覧を表示する際のページ制御の有・無は、業務要件に応じて設定する。

**アプリケーションによる制御 [#s6eb412d]
SQL Server、DB2データベースなど、.NETのデータ プロバイダは、サーバ カーソルをサポートしていないものが多い。~
このため、ページ制御をする場合は、はじめに主キー(IDなどの代理キー)のみの結果セットを取得し、その結果セットから~
表示対象ページのレコードの主キー(IDなどの代理キー)を抽出、再度検索処理をかけ、対象ページの一覧を取得すると良いと考える。

2008/04月現在、~
唯一OracleのODP.NETデータ プロバイダのDataReaderクラスは、サーバ カーソルをサポートしており、FetchSizeに指定したレコード数だけを順次取得する。~
このため巨大な結果セットを取得して落ちることが無く、DataAdapterを使用したデータアクセスより信頼性は高いと言える。~
ただし、順方向専用カーソルしかサポートしていないため「ページング処理の行の順送り」で多くのラウンド トリップが発生してしまう。

**ストアド プロシージャによる制御 [#e5a32aac]
ストアド プロシージャを使用すれば、サーバ サイドでOrder Byで整列した結果セットに対して、データ絞込みのカーソル操作が可能である。~
このため、ストアド プロシージャに検索条件と、表示するデータの範囲(例えば、101-200件目までなど)を渡すなどしてデータを絞り込むことができる。

**SQLによる制御 [#o06129c3]
SQLを使用した、ページ制御方法は以下の通り。

***Oracleの場合 [#uf024b1e]
 SELECT
   EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO
 FROM 
   EMP
 ORDER BY
   EMP.ENAME

↓ ページングしたいSQL(上記)を下記のように書き直す。

 SELECT * FROM (
   SELECT
     EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO,
     ROW_NUMBER() OVER (ORDER BY EMP.ENAME) RNUM
   FROM EMP
 ) WHERE RNUM BETWEEN 3 AND 5

***SQL Serverの場合(2005以上で利用可能) [#ucd7f7fb]
 SELECT
   ShipperID, CompanyName, Phone
 FROM
   Shippers
 ORDER BY
   Shippers.CompanyName

↓ ページングしたいSQL(上記)を下記のように書き直す。

 WITH OrderedShippers AS (
   SELECT
     ShipperID, CompanyName, Phone,
     ROW_NUMBER() OVER (ORDER BY Shippers.CompanyName) AS RNUM
   FROM Shippers
 )
 
 SELECT * FROM OrderedShippers WHERE RNUM BETWEEN 3 AND 5

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS