【问题标题】:Sorting Entire GridView with Custom Page Control使用自定义页面控件对整个 GridView 进行排序
【发布时间】:2015-08-11 11:11:09
【问题描述】:

在我的 GridView 中,我在创建自定义分页控件时关闭了分页。我有一个 SQL 存储过程,我在其中传递页码以作为参数返回。我现在遇到的问题是,除了返回的当前记录为 1000 之外,排序不再起作用。当我打开排序时,对当前的 1000 条记录集进行排序,而不是对整个记录集进行排序。我确定那是因为我的存储过程也只返回 1000 条记录。我认为完成我想要做的唯一方法是将所有列名作为 case 语句传递,并根据它们作为附加参数进行排序。一定有比这更好的方法。有什么想法吗?

这就是我目前正在做的事情,并且无需排序即可正常工作。 @StartRow 和 @EndRow 始终基于传递的页码,其中 @StartRow 等于页码 * 1000(每页返回 1000 行)。

@StartRow INT,
@EndRow INT
AS

SELECT * FROM
    (
    SELECT ROW_NUMBER() OVER (ORDER BY EmployeeID) AS Row,
        HR.EmployeeID, HR.FirstName, HR.LastName,
        ISNULL(Locations.City,'') + ', ' + ISNULL(Locations.State,'') as LocationName
    FROM HR
        INNER JOIN Locations ON HR.LocationID = Locations.LocationID
    ) AS X
GROUP BY X.Row, X.EmployeeID, X.FirstName, X.LastName
HAVING X.Row BETWEEN @StartRow AND @EndRow
ORDER BY X.Row

这是我能想到的在使用自定义分页控件时完成排序的唯一方法。虽然我在想还有一种更好的方法,但我还没有想到。

@StartRow INT,
@EndRow INT,
@Sort nvarchar(25)
AS

CREATE TABLE #Temp1
(
            EmployeeID nvarchar(25),
            FirstName nvarchar(25),
            LastName nvarchar(25),
            LocationName nvarchar(25)
)

INSERT INTO #Temp1
SELECT * FROM
    (
    SELECT 
        HR.EmployeeID, HR.FirstName, HR.LastName,
        ISNULL(Locations.City,'') + ', ' + ISNULL(Locations.State,'') as LocationName
    FROM HR
        INNER JOIN Locations ON HR.LocationID = Locations.LocationID
    ) AS X
GROUP BY X.EmployeeID, X.FirstName, X.LastName, X.LocationName

SELECT * FROM
    (
    SELECT ROW_NUMBER() OVER (ORDER BY 
                                CASE 
                                    WHEN @Sort = 'EmployeeID' THEN #Temp1.EmployeeID 
                                    WHEN @Sort = 'FirstName' THEN #Temp1.FirstName
                                    WHEN @Sort = 'LastName' THEN #Temp1.LastName
                                    WHEN @Sort = 'LocationName' THEN #Temp1.LocationName
                                    ELSE #Temp1.EmployeeID
                                END 
    ) AS Row, *
    FROM #Temp1 
    ) AS X
WHERE X.Row BETWEEN @StartRow AND @EndRow

drop table #Temp1

【问题讨论】:

    标签: c# sql asp.net sql-server-2008 gridview


    【解决方案1】:

    您可以构建一个包含您的 sql 语句的字符串,然后执行该字符串...

    SET @SqlString = N'SELECT... ORDER BY ' + @Sort
    EXECUTE sp_executesql @SQLString
    

    您将需要真正限制 @Sort 字符串,这样您就不会受到 sql 注入的攻击,但是如果您确保该字符串已被清理,那么这应该没问题。

    此外,出于同样的原因(为了防止 sql 注入),您将希望将 startrow 和 endrow 视为参数,或者再次清理它们,然后将它们作为文字插入 SqlString。

    【讨论】:

    • 我应该提到我在这个站点上有数百个报告,并且为每个报告创建了存储过程。考虑到这一点,走你上面建议的路线不会很好。
    • 我不明白为什么不这样做。在您的最后一个代码 sn-p 中,在您的存储过程中,您只需将最后一个 select 语句替换为构建的 sql 字符串,然后使用 sp_executesql 执行该语句。这会比将 case 语句添加到每个存储过程更简单,不是吗?
    猜你喜欢
    • 1970-01-01
    • 2015-11-26
    • 2010-11-25
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    • 2016-07-22
    • 2018-12-12
    相关资源
    最近更新 更多