我想从sqlserver表中绑定gridview中的至少30,000条记录。我想用网格视图一次只绑定50条记录。网格也有分页,当我点击下一页时,接下来要显示50条记录,另一页下一页再点击50条记录。
我该如何优化这个东西。我希望如果30,000条记录具有约束力,那么网格应该作为绑定的50条记录。
谢谢,
答案 0 :(得分:1)
将GridView
绑定到ObjectDataSource
,并在两者上启用分页。
在SQL端,使用CTE选择所需的行。例如:
;WITH MyCTE ([row], [Item]) AS (
SELECT ROW_NUMBER() OVER (ORDER BY Id) [row], [Item]
FROM SourceTable
)
SELECT [row], [Item]
FROM MyCTE
WHERE [row] BETWEEN @startrow AND @startrow + @pagesize - 1
如果有帮助,我会在本书中提供一个完整的高性能示例,说明如何使用异步I / O并包含代码:Ultra-Fast ASP.NET。
答案 1 :(得分:1)
有很多方法可以像其他人所说的那样这样做。 我想补充一些
a)从后端处理(这是我在当前项目中的表现)
--Usage : USP_DataListing 0,12
ALTER PROCEDURE [dbo].[USP_DataListing]
-- Add the parameters for the stored procedure here
(@StartIndex INT, @ItemsToDisplay INT)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
DECLARE @EndIndex INT
SET @StartIndex = @StartIndex * @ItemsToDisplay
SET @EndIndex = @StartIndex + @ItemsToDisplay
BEGIN
SELECT
SlNo
,Column(s)
FROM (
SELECT
ROW_NUMBER() OVER (ORDER BY GETDATE() DESC) AS SlNo
,i.Column(s)
FROM dbo.tblName i)X
WHERE X.SlNo BETWEEN @StartIndex+1 AND @EndIndex
END
2)如果您使用的是dotnet 3.0+版,您可以获得linq的Take() and Skip()方法的帮助
答案 2 :(得分:0)
在SQL Server上处理分页效率更高。如果你只是让gridview处理分页,甚至是本地运行的数据源,它将从数据库中将所有30,000条记录加载到前端,然后检索页面的记录。
答案 3 :(得分:0)
您可以将GridView绑定到LinqDataSource控件。据我所知,当它处理分页时,它只请求数据库中的可见行,而不是整个表。有关如何将GridView绑定到LinqDataSource here的好文章。