저장 프로시저에서 페이징 구현
저자:Eve Cole
업데이트 시간:2009-07-01 15:55:30
저는 경험이 많은 프로그래머가 아니기 때문에 프로젝트를 진행하는 동안 많은 문제에 직면하게 되는데, 프로젝트를 진행하는 동안 페이징을 사용하는 것은 인터넷에서 많은 정보를 확인하면서 겪었던 문제 중 하나였습니다. 하지만 임시 데이터 테이블을 만드는 것이 가장 간단한 방법이라고 생각합니다. 제가 Membership 확장을 할 때 Microsoft에서도 이 방법을 사용했다는 것을 알았습니다. Membership 저장 프로시저를 열어서 살펴보면 됩니다.
더 말해봐야 소용없으니 코드만 보면 이해가 될 겁니다. 하하.
1프로시저 생성 dbo.CreateSimple
2(
3 @PageIndex 정수,
4 @PageSize 정수
5)
6AS
7시작
8 --세 가지 변수를 정의합니다.
9 -- @PageLowerBound: 검색된 레코드의 하한입니다.
10 -- @PageUpperBound: 검색할 레코드의 상한입니다.
11 -- @TotalRecords: 주로 페이지 계산에 사용되는 총 레코드 수를 반환합니다.
12 @PageLowerBound int 선언
13 @PageUpperBound int 선언
14 @TotalRecords int 선언
15
16 --상한값과 하한값을 계산합니다.
17 SET @PageLowerBound=@PageIndex * @PageSize
18 세트 @PageUpperBound=@PageLowerBound+@PageSize-1
19
20--임시 테이블 생성:
21--IndexId는 식별자이며 자동으로 1씩 증가합니다.
22--SimpleId는 데이터 테이블 [Simple]에 의해 채워집니다.
23 테이블 생성 #PageIndexForSimple
스물넷(
25 IndexId int 신원(0,1) NOT NULL,
26 SimpleId 정수
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 RETURE @TotalRecords
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 매개변수[0].Value=pageIndex;
9 매개변수[1].Value=pageSize;
10 param[2].Direction = ParameterDirection.ReturnValue;
11 SqlDataReader 리더=SqlHelper.ExecuteReader(CommandType.StoredProcedure, "GetSimple", param);
12 동안(리더.읽기()){
13 엔터티.Add(GetSimpleEntity(reader))
14}
15 리더.닫기();
16 시도{
17 totalRecords=(int)param[2].값;
18 }잡기{}
19 반환 엔터티;
20} 위 함수 중 일부는 직접 작성했습니다.
SqlHelper 클래스: 단순화된 데이터베이스 쿼리 클래스입니다.
GetSimpleEntity (SqlDataReader 리더): 기본 엔터티 클래스 획득은 프로젝트에서 자주 사용되므로 재사용을 위해 별도의 전용 함수가 작성됩니다.
총 레코드 수를 얻을 때 유형이 DbNull이어서 오류가 발생할 수 있다는 점은 주목할 가치가 있습니다.
http://www.cnblogs.com/xdotnet/archive/2006/09/19/procedure_for_paging_select.html