ストアド プロシージャにページングを実装する
著者:Eve Cole
更新時間:2009-07-01 15:55:30
私はあまり経験豊富なプログラマーではないので、プロジェクト中に多くの問題に遭遇するでしょう。データベースでのページングの使用は、インターネットから多くの情報を調べました。ただし、一時データ テーブルを作成するのが最も簡単な方法だと思います。Membership 拡張機能を実行していたときに、Microsoft もこの方法を使用していることがわかりました。Membership ストアド プロシージャを開いて確認するだけです。
これ以上言っても無駄です。コードを見ればすぐにわかります(笑)。
1CREATE PROCEDURE dbo.CreateSimple
2(
3 @PageIndex int、
4 @PageSize int
5)
6AS
7始まり
8 -- 3 つの変数を定義します。
9 -- @PageLowerBound: 取得されるレコードの下限。
10 -- @PageUpperBound: 取得するレコードの上限。
11 -- @TotalRecords: 主にページ計算に使用されるレコードの合計数を返します。
12 @PageLowerBound int を宣言します
13 @PageUpperBound int を宣言します
14 @TotalRecords int を宣言します
15
16 --上限値と下限値を計算します。
17 SET @PageLowerBound=@PageIndex * @PageSize
18 SET @PageUpperBound=@PageLowerBound+@PageSize-1
19
20 -- 一時テーブルを作成します。
21 -- IndexId は識別子であり、自動的に 1 ずつ増加します。
22 -- SimpleId はデータ テーブル [Simple] によって入力されます。
23 テーブル #PageIndexForSimple の作成
24 (
25 IndexId int アイデンティティ(0,1) NOT NULL、
26 SimpleId int
27)
28 -- 一時テーブルへの書き込み
29 #PageIndexForSimple(SimpleId) に挿入
30 SELECT s.[SimpleId]
31 FROM [シンプル]
32 --WHERE 条件と ODER BY ステートメントをここに追加できます
33
34 --レコードの合計数を取得します。実際には、影響を受ける行の数がレコードの合計数になります。
35 SELECT @TotalRecords=@@ROWCOUNT
36
37 --欲しいレコードを手に入れましょう。
38 セレクト*
39 FROM [シンプル] s,#PageIndexForSimple p
40 WHERE s.[SimpleId]=p.[SimpleId]
41 AND p.[IndexId]>=@PageLowerBound
42 AND P.[IndexId]< =@PageUpperBound
43 ORDER BY s.【シンプル】
44
45 --レコードの総数を返します。
46 りゅー
47END 上のコメントからもわかると思いますが、ここに書いたので、プログラムのコードも書きます。
1Public List<Simple> GetSimple(int pageIndex,int pageIndex,out int totalRecords){
2 List<Simple> エンティティ=new List<Simple>();
3 SqlParameter[]param=新しい SqlParameter[]{
4 新しい SqlParameter("@PageIndex",SqlDbType.Int),
5 新しい SqlParameter("@PageSize",SqlDbType.Int)、
6 新しい SqlParameter("@ReturnValue",SqlDbType.Int),
7};
8 param[0].Value=pageIndex;
9 param[1].Value=ページサイズ;
10 param[2].Direction = ParameterDirection.ReturnValue;
11 SqlDataReader Reader=SqlHelper.ExecuteReader(CommandType.StoredProcedure, "GetSimple", param);
12 While(reader.Read()){
13 エンティティ.Add(GetSimpleEntity(reader))
14}
15 リーダー.Close();
16 トライ{
17 totalRecords=(int)param[2].Value;
18 }キャッチ{}
19 返送エンティティ。
20} 上記の関数の一部は私が書いたものです。
SqlHelper クラス: 簡素化されたデータベース クエリ クラス。
GetSimpleEntity (SqlDataReader リーダー): 基本的なエンティティ クラスの取得はプロジェクトでよく使用されるため、再利用のために別のプライベート関数が作成されます。
なお、総レコード数を取得する場合、型がDbNullとなりエラーとなる場合があります。
http://www.cnblogs.com/xdotnet/archive/2006/09/19/procedure_for_paging_select.html