Asp.net 准备好数据后逐个绑定GridView行
我有大量的学生考试数据,我处理这些数据来显示学生的成绩。虽然它似乎可以工作,但显示结果所需的时间要长得多。时间一天比一天多Asp.net 准备好数据后逐个绑定GridView行,asp.net,gridview,webforms,Asp.net,Gridview,Webforms,我有大量的学生考试数据,我处理这些数据来显示学生的成绩。虽然它似乎可以工作,但显示结果所需的时间要长得多。时间一天比一天多 我有一个问题表(tblQuestions)来存储问题和正确答案 我有一个测试实例表(tblTestInstance),它存储学生给出的每个测试的测试实例 我拥有的最大的表是tblTestDetails,它存储学生选择的问题ID和选项 我将GridView与学生表绑定,并在GridView的数据绑定事件上,为每个学生计算学生尝试的每个问题的正确答案。我计算数据表中的数据 问题
计算标记后,我会显示它们。一个技巧是使用
Response.flush()刷新数据代码>
这里有一个例子
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:TemplateField HeaderText="Item" >
<ItemTemplate>
<%#cRenderLine(Container.DataItem)%>
<%
// show every 10 lines what I have
if (++cLine % 10 == 0)
{
Response.Flush();
// simulate the delay here
// System.Threading.Thread.Sleep(1000);
}
%>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
我看不出逐行处理在这里是如何提高速度的——几乎在所有情况下,逐行处理都比使用数据引擎和sql查询提取数据慢得多。我的意思是,用户不能查看或看到超过1页的数据-您在这里拉了多少行?一页数据应该几乎是即时的——即使对于毛茸茸的超级丑陋的sql来说也是如此——这样的页面看起来是即时的。这里的一些细节没有意义。我的意思是这里有多少行数据?我的意思是,100行世界上最差的sql仍然会在1秒之内出现。数据项绑定实际上是逐行处理。缺少一些重要的细节。逐行处理或使用项目数据绑定相当于一件事。这里的数据量应该不重要,但重要的是您执行的单独sql请求的数量,这具有很高的成本,通常在大多数情况下,大量单独的sql查询比提取的数据量要昂贵得多。这表明在on数据绑定事件中执行了太多从头开始的“新”sql查询。将数据一次性拉入datatable并将其持久化为数据绑定事件。执行的SQL查询不多。概括地说,我使用SELECT来吸引学生。我为每个学生收集问题集。然后使用db表根据正确答案对每个问题进行评估。如果一个班级有1000名学生,他们进行了测试,每个测试有150个问题,那么数据绑定事件将产生较慢的结果。我希望,一个接一个的方法会更有帮助,而不是一起等待结果。用户至少会在10分钟内看到一些东西,而不是空白页面。也许更好地匹配sql例程和答案会有所帮助?可能是视图中的一组子需求进行了匹配?我想你可以显示学生,然后选择一行向下钻取。我仍然不认为每个学生150个匹配是一个问题,除非sql查询不能匹配Q和A,并且这里正在进行逐行处理。如果这些问题+答案匹配不能用sql完成,那么这将很慢。总结一下@AlbertD.Kallal,如果可能,您应该使用存储过程或类似方法进行一次,也只能进行一次数据库调用。如果您正在为每个返回的初始行对db进行后续调用,难怪这需要几分钟的时间。
public int cLine = 0;
List<int> oMainIds = new List<int>();
protected void Page_Load(object sender, EventArgs e)
{
for (int i = 0; i < 10000; i++)
{
oMainIds.Add(i);
}
GridView1.DataSource = oMainIds;
GridView1.DataBind();
}
protected string cRenderLine(object oItem)
{
return oItem.ToString();
}