- 追加された行はこの色です。
- 削除された行はこの色です。
[[Open棟梁>https://github.com/OpenTouryoProject]] wiki
「[[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