데이터베이스에서 사용자 지정 페이징을 사용하는 검색 솔루션 (분명히 일부 검색 매개 변수 사용)을 구현하기 위해 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 개의 행을 반환합니다. 어떤 생각이 어떤 문제입니까?
SqlProfiler를 사용하여 데이터베이스에 대해 실제로 실행 된 내용을 확인 했습니까? – Schotime
실제로는 아닙니다. 하지만 아마도 이것은 PetaPoco의 버그 일 수 있습니다. –
아마도 시도해보십시오. db.Fetch ("; EXEC GetUsersPaged @@ startRowIndex = @ 0, @@ maximumRows = @ 1, @@ name = @ 2", startRowIndex, pageSize, name); 또는 시도하십시오 : db.Fetch ("; EXEC @ 0, @ 1, @ 2", startRowIndex, pageSize, name); - 왜 두 번째가 첫 번째보다 더 효과가 있을지 모르겠지만 (아직 그렇지 않다면) 모든 것을 시도해 볼 가치가있다. –