如何对COUNT统计列求和并在Label中显示?代码报错求助
解决VB.NET读取MySQL统计总和时的列不存在错误
看起来你犯了一个常见的SQL查询逻辑错误——你的原查询并没有生成SUM(Attendance)这个字段,所以DataReader自然找不到它。另外你的代码还有个小问题:在While i.Read循环内部调用i.Close()会导致循环只执行一次就关闭了DataReader,这也会影响结果。让我帮你拆解问题并给出两种解决方案:
问题根源
你的SQL语句是按idNumber分组,统计每个用户当月的出勤天数(别名Attendance),返回的结果集只有IdNumber和Attendance两列,并没有对Attendance做求和操作,所以直接读取SUM(Attendance)必然会报错。
方案一:修改SQL直接计算总和(推荐)
让MySQL在数据库层面直接完成求和操作,效率更高,尤其是数据量较大时:
' 修改后的SQL,通过子查询先分组统计每个用户的出勤,再求和 Dim cmd As New MySqlCommand("SELECT SUM(Attendance) AS TotalAttendance FROM (SELECT IdNumber, COUNT(DISTINCT date) AS 'Attendance' FROM record WHERE MONTH(date) = MONTH(CURRENT_DATE()) AND YEAR(date) = YEAR(CURRENT_DATE()) GROUP BY idNumber) AS subquery", cn) Dim i As MySqlDataReader = cmd.ExecuteReader() ' 读取结果,注意处理空值情况(比如当月没有任何出勤记录) If i.Read() Then Label1.Text = If(IsDBNull(i("TotalAttendance")), "0", i("TotalAttendance").ToString()) End If i.Close() ' 把Close放在读取操作外面,避免提前关闭Reader
方案二:在代码中遍历累加
如果你需要同时获取每个用户的出勤数据,再手动计算总和,可以用这种方式:
Dim totalAttendance As Integer = 0 Dim cmd As New MySqlCommand("SELECT IdNumber, COUNT(DISTINCT date) AS 'Attendance' FROM record WHERE MONTH(date) = MONTH(CURRENT_DATE()) AND YEAR(date) = YEAR(CURRENT_DATE()) GROUP BY idNumber ", cn) Dim i As MySqlDataReader = cmd.ExecuteReader() While i.Read() ' 累加每个用户的出勤天数,同时可以在这里处理单个用户的数据 If Not IsDBNull(i("Attendance")) Then totalAttendance += Convert.ToInt32(i("Attendance")) End If End While i.Close() ' 必须在循环结束后关闭Reader Label1.Text = totalAttendance.ToString()
内容的提问来源于stack exchange,提问作者Keith
相关产品推荐
相关产品推荐

