4

好的,

一直在我的 GridView 中测试相对较小的数据集,并且一切正常。但是,我现在已经进入适当的 UAT 并尝试将 17,000 条记录加载到我的网格中,这基本上使我的网络应用程序陷入了停滞。

基本上,用户登录,并在验证后加载所有数据网格,其中一个包含 17k 条记录。直到所有内容都加载完毕,最终用户才会留在登录页面上。所以我需要修复它。

网格的代码是:

DataTable dtValueDateCurrency = null;               
SqlConnection conn = new SqlConnection(WebConfigurationManager.ConnectionStrings["Reporting"].ConnectionString);
using (conn)
{
    conn.Open();
    //Load all other grid data
    using (SqlDataAdapter sqlAdapter = new SqlDataAdapter(TSQL1, conn))
    {
        dtValueDateSummary = new DataTable();
        sqlAdapter.Fill(dtValueDateSummary);
        grdValueDateSummary.DataSource = dtValueDateSummary;
        grdValueDateSummary.DataBind();
    }
 }

有没有办法增加加载时间?分页不是一个选项,因为我正在使用 JQuery 来处理这个问题。

4

5 回答 5

6

在一个查询中加载 17,000 条记录是要你的命。我强烈建议分页您的gridview。

首先,您需要按如下方式更改您的存储过程。

ALTER PROCEDURE [dbo].[SomeTable_GetPagedResults] 
( 
        @StartRowIndex      int, 
        @MaximumRows        int 
) 

AS 
SET NOCOUNT ON 

Select 
    RowNum, 
    [ID], 
    [foo],
    [bar]
From 
    (Select 
        [ID], 
        [foo], 
        [bar], 
        Row_Number() Over(Order By [ID] Desc) As RowNum 
        From dbo.[SomeTable] t) 
As DerivedTableName 
Where RowNum Between @StartRowIndex And (@StartRowIndex + @MaximumRows) 

现在你有了一个可分页的查询。

您还需要一个查询来获取完整的行数。

ALTER PROCEDURE [dbo].[SomeTable_GetRowCount] 

AS 
SET NOCOUNT ON 

return (Select Count(ID) As TotalRecords From SomeTable) 

每次更改页面时都会绑定网格。

protected void gridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
  gridView1.PageIndex = e.NewPageIndex;
  BindGrid(); // this is whatever method you call to bind your data and execute your stored procedure.
}

BindGrid()方法将调用您的两个存储过程(一个获取完整的行数,一个获取与当前页面相关的结果)

附加阅读

于 2013-07-31T19:51:11.120 回答
2

您需要建立数据库分页。

这将涉及创建自定义排序、自定义过滤和自定义分页,但它会显着提高代码的性能,因为您一次只能从数据库中检索一页数据,而不是全部 17,000 行一次。

我在一个银行应用程序中实现了这一点,该应用程序旨在显示、排序和过滤数十万笔贷款。答案太复杂,无法举一个简单的例子,但首先要研究数据库分页。使用 LINQ,它将为您提供实现分页的简单方法Take和最简单的方法。Skip

于 2013-07-31T20:10:02.627 回答
1

您应该考虑在 Web 服务器上缓存查询,尤其是在不经常更新的情况下。这样,所有客户端都可以简单地浏览缓存而不是无情地访问数据库。

看到这个问题

于 2013-07-31T19:50:05.640 回答
0

确实,即使用户无法一次看到全部 17k 记录,一次加载 17k 记录也没有用。我建议您将分页与DataTable.Merge有助于分块加载记录并将新获取的数据附加到前一个数据的功能一起使用。我只是做了一个快速测试并找到了解决方案。试试这个。

于 2014-03-30T21:52:43.983 回答
-1

没有解决办法分页很慢,会一次又一次调用数据库,所以你需要把

<style>.body{display:none;}</style>

页首和页尾

<style>.body{display:block;}</style>
于 2020-09-21T09:59:47.397 回答