处理分页和“延迟加载”;数据集

本文关键字:延迟加载 数据集 分页 处理 | 更新日期: 2023-09-27 17:48:59

我的公司使用完全通过存储过程填充的原始的、未类型化的数据集。我的任务是找到一种方法来检索非常大的结果集(分页)和获得延迟加载功能的方法(至少我认为这是延迟加载;说实话,我还在学习这些东西,所以我们不会在一个批处理中回调数万行,占用服务器资源。

我个人不太熟悉数据集,因为我尽可能地避免它们,我宁愿在这里完全摆脱它们,但是说"改变一切以使用LINQ/EF"不会是一个有效的答案,因为没有商业价值的管理(它会花费太长时间来重做事情,所以这个想法会立即被击落)。

是否有一些资源,我可以看看得到这种相同的功能,但使用标准的非类型化数据集?

EDIT:另外,我需要一个可以使用不使用存储过程的动态创建的SQL的解决方案。

处理分页和“延迟加载”;数据集

您所需要做的就是修改存储过程以对结果集进行分页。当然,这也意味着你必须传递某些标准作为参数,如页码等。假设您使用的是SQL Server 05或更新版本,请查看以下内容:

http://www.codeproject.com/KB/database/PagingResults.aspx

需要在存储过程中实现分页。我假设你正在使用Sql Server,所以这里有一个链接:

http://www.davidhayden.com/blog/dave/archive/2005/12/30/2652.aspx

请注意,这与dataset 本身无关。假设,您的代码从存储过程调用生成DataSet。如果你重写你的进程来做分页,你的代码将生成一个只包含被请求页面记录的DataSet。

您可以使用原始程序返回的数据集来实现分页,通过缓存数据集并仅将选定的行返回给客户端(或者更准确地说,仅使用数据集的选定行来生成客户端HTML),但这是一个超级超级,非常糟糕的想法。

我在asp.net 2.0网站上遇到了同样的问题,没有"延迟加载"的解决方案。为了对数据集进行分页,我使用了2个进程,这将帮助我在每次选择时包装分页功能。

CREATE PROCEDURE [dbo].[Generic_Counting]
    @tables VARCHAR(MAX),
    @filter VARCHAR(MAX) = '1=1'    
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @strQuery VARCHAR(8000)
    SET @strQuery = ' SELECT COUNT(*) FROM '+ @tables +'
             WHERE '+ @filter 
    execute     (@strQuery)
    IF @@ERROR<>0 
    BEGIN 
        --error on generic count
        SET NOCOUNT OFF
        RETURN 10067
    END
    SET NOCOUNT OFF
    RETURN 0
END
GO
CREATE PROCEDURE [dbo].[Generic_Paging]
    @tables VARCHAR(1000),
    @pk VARCHAR(100), 
    @pageNumber INT = 1,
    @pageSize INT = 10, 
    @fields VARCHAR(MAX) = '*',
    @filter VARCHAR(MAX) = '1=1',
    @orderBy VARCHAR(MAX) = NULL
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @strQuery VARCHAR(8000) 
    DECLARE @strMinRecord VARCHAR(12);
    DECLARE @strMaxRecord VARCHAR(12);
    SET @strMinRecord = CONVERT(VARCHAR(12),((@pageNumber -1)*@pageSize + 1))  
    SET @strMaxRecord = CONVERT(VARCHAR(12), (@pageNumber * @pageSize)) 
        -- Use ROW_NUMBER function
    SET @strQuery ='
    WITH Generic_CTE As
    (
        SELECT ''RowNumber'' = ROW_NUMBER() OVER(ORDER BY ' +
        ISNULL(@orderBy,@pk) +'),' + 
        @fields + 
        ' FROM ' + @tables +
        ' WHERE ('+ @filter +')
    )
    SELECT ' + @fields + '
    FROM Generic_CTE
    WHERE RowNumber BETWEEN ' + @strMinRecord +' AND '+ @strMaxRecord 

    --print @strQuery
    execute (@strQuery)
    IF @@ERROR<>0 
    BEGIN 
        --error on generic paging
        SET NOCOUNT OFF
        RETURN 10066
    END
    SET NOCOUNT OFF 
    RETURN 0
END
GO

您可以看看值列表处理程序模式,设计用于"客户端需要项列表…为演示。列表中的项目数量是未知的,在许多情况下可能相当大。"

示例(在上面的链接和这里)是针对Java的,但是应该可以很容易地转换为asp.net。