【问题标题】:Executing parameterized stored procedures using PetaPoco使用 PetaPoco 执行参数化存储过程
【发布时间】:2012-01-31 20:53:46
【问题描述】:

两天以来,我一直在与 PetaPoco 角力以实现一个在数据库中具有自定义分页的搜索解决方案(显然带有一些搜索参数)。我不知道如何使用 ASP.NET DataPager 配置 PetaPoco 分页(这是一个完全不同的问题)。无论如何,我想在数据库中使用自定义分页。

我有一个名为 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>();
    }

我的问题是:当我在 db(在 SQL Management Studio 中)执行和测试存储过程时,一切都很好。所有结果都与分页参数有关。但是当我使用 PetaPoco 调用相同的存储过程时,它会获取整个内容并忽略分页。

例如,当我使用

在 SQL Management Studio 中测试存储过程时
@startRowIndex = 0
@maximumRows = 1

我没有为@name@email 发送任何东西,它只返回一行,这是完全正确的。但与 PetaPoco 相同,它在列表中返回 3 行。知道有什么问题吗?

【问题讨论】:

  • 您是否使用 SqlProfiler 检查了实际对数据库执行的操作?
  • 其实不是。但我认为,这可能是 PetaPoco 中的一个错误
  • 也许试试:db.Fetch(";EXEC GetUsersPaged @@startRowIndex = @0, @@maximumRows = @1, @@name = @2", startRowIndex, pageSize,姓名);或尝试:db.Fetch(";EXEC @0, @1, @2", startRowIndex, pageSize, name); - 我不明白为什么第二个会比第一个更有效.. 但为了让它工作(如果仍然没有),值得尝试一切。

标签: sql sql-server stored-procedures petapoco


【解决方案1】:

您是否尝试过设置 EnableAutoSelect = false?当我将其保留为默认设置时,调用返回了所有记录。

【讨论】:

    猜你喜欢
    • 2013-12-06
    • 2012-01-26
    • 2011-10-20
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    相关资源
    最近更新 更多