You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

图表仅展示首条学生数据,无法加载全部统计信息的问题求助

图表仅展示首条学生数据,无法加载全部统计信息的问题求助

我来帮你一步步排查这个问题,结合你给的代码和描述,咱们先从最常见的坑开始看:

一、最可能的解决:先清空图表旧数据

你提到这个函数会在两个按钮点击事件里被调用,而且循环里的变量确实能拿到每条学生的数值,但图表只显示第一组。首先要做的是在每次添加新数据前,清空所有图表的已有数据点——如果不清空,旧数据会残留,甚至可能导致新数据无法正常追加(尤其是多次调用函数的场景)。

在执行SQL查询、读取数据之前,加上这段代码:

// 清空所有图表的现有数据点,确保每次都是全新加载
CurrentStreakChart.Series["Current Streak"].Points.Clear();
HighestStreakChart.Series["Highest Streak"].Points.Clear();
NumAttemptedChart.Series["Number of Days Attempted"].Points.Clear();
CardsCreatedChart.Series["Number of Cards Created"].Points.Clear();
OverdueCardsChart.Series["Number of Overdue Cards"].Points.Clear();

二、调试确认:循环是否真的执行了多次

你说SQL查询是正确的,但可以加个简单的输出验证循环是否真的遍历了所有学生数据。在循环里加一行控制台输出:

while (reader.Read())
{
    username = reader.GetString(0);
    currentStreak = reader.GetInt32(1);
    // 新增输出,看控制台是否打印所有学生信息
    Console.WriteLine($"已处理学生:{username},当前连续天数:{currentStreak}");
    
    // 原有的添加图表点代码...
}

如果控制台只输出了一条记录,那说明你的SQL查询其实只返回了一条数据——这时候要检查:

  • 下拉框SelectClassChartCmbBx.Text的内容是否和数据库里的班级名完全匹配(比如大小写、空格)
  • 对应班级下是否真的有多个学生的关联数据

三、图表显示配置排查

如果调试发现数据已经加到图表的Points集合里,但界面没显示,那是图表的配置问题:

  1. 关闭X轴索引模式:检查每个图表系列的IsXValueIndexed属性,如果设为true,X轴会自动索引,可能导致后续点被隐藏。可以在代码里设置:
CurrentStreakChart.Series["Current Streak"].IsXValueIndexed = false;
HighestStreakChart.Series["Highest Streak"].IsXValueIndexed = false;
// 其余图表系列同理设置
  1. 检查图表显示范围:如果图表宽度太小,X轴标签会重叠甚至被截断,试着拉宽图表,或者把X轴标签旋转一定角度(比如45度)避免重叠。

四、调试查看图表Points的小技巧

你不知道怎么看图表的实际数据?在Visual Studio调试时:

  1. 把断点停在reader.Close();之后
  2. 打开「即时窗口」(可以按Ctrl+Alt+I调出)
  3. 输入以下命令并回车,就能看到图表里的点数量:
CurrentStreakChart.Series["Current Streak"].Points.Count

如果数量大于1,说明数据已经加进去了,只是显示配置的问题;如果是1,那就是循环只执行了一次,要回头查SQL和数据库数据。

额外优化:避免SQL注入风险

你的SQL语句是直接拼接字符串的,这很容易触发SQL注入,也会因为班级名含特殊字符报错。改成参数化查询更安全:

cmd.CommandText = @"SELECT StudentAccounts.Username, DeckStats.CurrentStreak, DeckStats.HighestStreak, DeckStats.NumDaysAttempted, DeckStats.FlashcardsCreatedNum, DeckStats.OverdueCardNum 
FROM DeckStats 
INNER JOIN FlashcardDecks ON DeckStats.DeckID = FlashcardDecks.DeckID 
INNER JOIN Classes ON FlashcardDecks.ClassID = Classes.ClassID 
INNER JOIN StudentAccounts ON FlashcardDecks.StudentID = StudentAccounts.StudentID 
WHERE Classes.ClassName = @ClassName";
// 用参数替代字符串拼接
cmd.Parameters.AddWithValue("@ClassName", SelectClassChartCmbBx.Text);

先试试清空图表数据的办法,这是这类问题最常见的解决方向,再结合调试一步步确认问题~

备注:内容来源于stack exchange,提问作者r.m3

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 08:54:31