2012-01-02 1 views
4

데이터베이스에서 사용자 지정 페이징을 사용하는 검색 솔루션 (분명히 일부 검색 매개 변수 사용)을 구현하기 위해 PetaPoco와 씨름하고 있습니다. 나는 (전혀 다른 질문 인) ASP.NET DataPager로 PetaPoco 페이징을 구성하는 방법을 알 수 없었다. 어쨌든 데이터베이스에서 사용자 지정 페이징을 사용하려고합니다.PetaPoco를 사용하여 매개 변수화 된 저장 프로 시저 실행

: 지금은 아래처럼이 저장 발동를 호출하는 두 가지 방법이

ALTER PROCEDURE [dbo].[GetUsersCount] 
    @name nvarchar(300) = NULL, 
    @email nvarchar(100) = NULL 
    AS 
    BEGIN 
    SELECT COUNT(*) 
     FROM UserInfo 
     WHERE 
    (Nickname LIKE '%'[email protected]+'%' 
    OR FirstName LIKE '%'[email protected]+'%' 
    OR LastName LIKE '%'[email protected]+'%' 
    OR @name IS NULL) 
     AND 
    (Email = @email OR @email IS NULL) 
    END 

: 저장된 프로 시저 다음과 같은

ALTER PROCEDURE [dbo].[GetUsersPaged] 
@startRowIndex int, 
@maximumRows int, 
@name nvarchar(300) = NULL, 
@email nvarchar(100) = NULL 
AS 
BEGIN 
    SELECT * 
    FROM 
    (
    SELECT *, 
      ROW_NUMBER() OVER(ORDER BY Id) AS RowRank 
      FROM UserInfo 
      WHERE 
     (Nickname LIKE '%'[email protected]+'%' 
     OR FirstName LIKE '%'[email protected]+'%' 
     OR LastName LIKE '%'[email protected]+'%' 
     OR @name IS NULL) 
      AND 
     (Email = @email OR @email IS NULL) 

    ) AS UsersPagedList 
    WHERE RowRank BETWEEN @startRowIndex AND (@startRowIndex + @maximumRows) 
END 

GetUsersCount :

은 내가 저장된 프로 시저는 다음과 같은 GetUsersPaged를 불렀다

[DataObjectMethod(DataObjectMethodType.Select, false)] 
    public List<DAL.UserInfo> GetPagedUserSearchResults(int startRowIndex, int pageSize, string name, string email) 
    { 
     DBService dbService = new DBService(); 
     var db = dbService.GetDatabase(); 
     var list = new List<DAL.UserInfo>(); 

     if(name != string.Empty && email != string.Empty) 
      list = db.Fetch<DAL.UserInfo>(@"EXEC GetUsersPaged @@startRowIndex = @0, @@maximumRows = @1, 
              @@name = @2, @@email = @3", startRowIndex, pageSize, name, email); 

     else if(name == string.Empty && email != string.Empty) 
      list = db.Fetch<DAL.UserInfo>(@"EXEC GetUsersPaged @@startRowIndex = @0, @@maximumRows = @1, 
              @@email = @2", startRowIndex, pageSize, email); 

     else if(name != string.Empty && email == string.Empty) 
      list = db.Fetch<DAL.UserInfo>(@"EXEC GetUsersPaged @@startRowIndex = @0, @@maximumRows = @1, 
              @@name = @2", startRowIndex, pageSize, name); 

     else if(name == string.Empty && email == string.Empty) 
      list = db.Fetch<DAL.UserInfo>(@"EXEC GetUsersPaged @@startRowIndex = @0, @@maximumRows = @1" 
              ,startRowIndex, pageSize); 
     return list; 
    } 

    [DataObjectMethod(DataObjectMethodType.Select, false)] 
    public int GetPagedUserSearchResultsCount(string name, string email) 
    { 
     DBService dbService = new DBService(); 
     var db = dbService.GetDatabase(); 
     IEnumerable<DAL.UserInfo> count = null; 

     if (name != string.Empty && email != string.Empty) 
      count = db.Query<DAL.UserInfo>("EXEC GetUsersCount @@name = @0, @@email = @1", name, email); 

     else if (name == string.Empty && email != string.Empty) 
      count = db.Query<DAL.UserInfo>("EXEC GetUsersCount @@email = @0", email); 

     else if(name != string.Empty && email == string.Empty) 
      count = db.Query<DAL.UserInfo>("EXEC GetUsersCount @@name = @0", name); 

     else if (name == string.Empty && email == string.Empty) 
      count = db.Query<DAL.UserInfo>("EXEC GetUsersCount"); 

     return count.Count<DAL.UserInfo>(); 
    } 

제 질문은 : 실행 중일 때 모든 것이 정상입니다. DB에 저장된 procs를 테스트하고 테스트합니다 (SQL Management Studio 내부). 모든 결과는 페이징 매개 변수와 관련됩니다. 그러나 PetaPoco를 사용하여 동일한 저장된 procs를 호출하면 모든 것을 가져오고 페이징은 무시됩니다.

내가

@startRowIndex = 0 
@maximumRows = 1 

와 SQL Management Studio의 저장 발동을 테스트하고 내가 @name@email에 대해 아무것도 보내지 않는 예를 들어, 완전히 정확 하나의 행을 반환합니다. 그러나 PetaPoco를 사용하는 것과 같은 일은 목록에 3 개의 행을 반환합니다. 어떤 생각이 어떤 문제입니까?

+2

SqlProfiler를 사용하여 데이터베이스에 대해 실제로 실행 된 내용을 확인 했습니까? – Schotime

+0

실제로는 아닙니다. 하지만 아마도 이것은 PetaPoco의 버그 일 수 있습니다. –

+1

아마도 시도해보십시오. db.Fetch ("; EXEC GetUsersPaged @@ startRowIndex = @ 0, @@ maximumRows = @ 1, @@ name = @ 2", startRowIndex, pageSize, name); 또는 시도하십시오 : db.Fetch ("; EXEC @ 0, @ 1, @ 2", startRowIndex, pageSize, name); - 왜 두 번째가 첫 번째보다 더 효과가 있을지 모르겠지만 (아직 그렇지 않다면) 모든 것을 시도해 볼 가치가있다. –

답변

0

EnableAutoSelect = false로 설정해 보셨습니까? 이 설정을 기본 설정으로 두었을 때 호출은 모든 레코드를 반환했습니다.