Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用自定义页面控件对整个GridView进行排序_C#_Sql_Asp.net_Sql Server 2008_Gridview - Fatal编程技术网

C# 使用自定义页面控件对整个GridView进行排序

C# 使用自定义页面控件对整个GridView进行排序,c#,sql,asp.net,sql-server-2008,gridview,C#,Sql,Asp.net,Sql Server 2008,Gridview,在GridView中,我在创建自定义分页控件时关闭了分页。我有一个SQL存储过程,在这里我传入页码作为参数返回。我现在的问题是,除了返回的当前记录(1000条)之外,排序不再有效。当我打开排序时,将对当前1000条记录集进行排序,而不是对整个记录集进行排序。我确信这是因为我的存储过程也只返回1000条记录。我能想到的完成我要做的事情的唯一方法是将所有列名作为case语句传入,并根据它们作为附加参数进行排序。一定有比这更好的办法。有什么想法吗 这就是我目前正在做的,不需要排序就可以正常工作@Sta

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

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

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

@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

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

SET @SqlString = N'SELECT... ORDER BY ' + @Sort
EXECUTE sp_executesql @SQLString
您将需要真正地约束@Sort字符串,这样您就不会受到sql注入的攻击,但如果您确保该字符串已被清除,那么这应该是正常的。
此外,出于同样的原因(为了防止sql注入),您可能希望将startrow和endrow视为参数,或者再次对它们进行清理,然后将它们作为文本插入到SqlString中。

我应该提到,我在这个站点上有数百个报告,并且为每个报告创建了存储过程。考虑到这一点,按照你上面建议的路线走是行不通的。我不明白为什么不行。在存储过程的最后一个代码段中,您只需将最后一个select语句替换为一个构建的sql字符串,然后使用sp_executesql执行该字符串。这比将case语句添加到每个存储过程要简单,不是吗?
SET @SqlString = N'SELECT... ORDER BY ' + @Sort
EXECUTE sp_executesql @SQLString