[[Open棟梁>https://github.com/OpenTouryoProject]] wiki -[[戻る>アプリケーション設計のポイント]] *目次 [#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