Выполнение параметризованных хранимых процедур с использованием PetaPoco - PullRequest
4 голосов
/ 02 января 2012

Уже два дня я борюсь с PetaPoco, чтобы реализовать поисковое решение (очевидно, с некоторыми параметрами поиска), которое имеет настраиваемый пейджинг в базе данных.Я не мог понять, как настроить пейджинг PetaPoco с ASP.NET DataPager (это совсем другой вопрос).В любом случае я хочу использовать пользовательский пейджинг в базе данных.

У меня есть сохраненный процесс с именем GetUsersPaged, как показано ниже:

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 '%'+@name+'%' 
         OR FirstName LIKE '%'+@name+'%' 
         OR LastName LIKE '%'+@name+'%' 
         OR @name IS NULL) 
            AND 
        (Email = @email OR @email IS NULL)

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

и GetUsersCount, сохраненный процесс, как показано ниже:

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

Теперь у меня есть два метода для вызова этих хранимых процедур, как показано ниже:

    [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>();
    }

Мой вопрос: все хорошо, когда я выполняю и проверяю хранимые процессы в БД (в SQL Management Studio)).Все результаты относятся к параметрам подкачки.Но когда я вызываю одни и те же хранимые процедуры с помощью PetaPoco, он получает все, и подкачка игнорируется.

Например, когда я тестирую хранимые процедуры в SQL Management Studio с помощью

@startRowIndex = 0
@maximumRows = 1

, и я ничего не отправляю для @name и @email, он возвращает только одну строку, котораясовершенно правильно.Но то же самое с PetaPoco, он возвращает 3 строки в списке.Есть идеи, в чем проблема?

1 Ответ

0 голосов
/ 10 июля 2013

Вы пытались установить EnableAutoSelect = false? Когда я оставил это значение по умолчанию, вызов вернул все записи.

...