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

如何使用SQL COUNT函数?实现考勤统计值在TextBox中显示

修正你的SQL COUNT统计代码并优化实现

嘿,我来帮你把这段代码改对,顺便聊聊怎么正确使用SQL COUNT函数,以及安全高效地把结果显示到TextBox里~

首先先说说你原代码里的几个小问题:

  • 你最后用了Convert.ToString(count),但根本没定义count变量,也没从查询结果里取出统计值,这肯定会报错
  • 直接把变量拼进SQL字符串里,存在严重的SQL注入风险,绝对不能这么干!
  • 没有合理管理数据库资源,比如连接对象con如果没正确释放,可能会导致连接泄漏

接下来给你两种改进后的实现方案,你可以根据需求选择:

方案1:修正原DataAdapter写法,用参数化查询

protected void PresentCalculator()
{
    string cur_month = "May";
    int empCode = 2222;
    int presentCount = 0;

    // 用using语句自动释放资源,避免连接泄漏
    using (SqlConnection con = new SqlConnection("你的数据库连接字符串"))
    {
        // 参数化SQL,彻底规避注入风险
        string sql = "SELECT COUNT(*) FROM Attendance WHERE Month = @CurMonth AND EMP_CODE = @EmpCode";
        using (SqlDataAdapter da = new SqlDataAdapter(sql, con))
        {
            // 添加参数,匹配SQL里的占位符
            da.SelectCommand.Parameters.AddWithValue("@CurMonth", cur_month);
            da.SelectCommand.Parameters.AddWithValue("@EmpCode", empCode);

            DataTable dt = new DataTable();
            da.Fill(dt);

            // COUNT查询至少会返回一行结果(哪怕是0),直接取第一行第一列的值
            if (dt.Rows[0][0] != DBNull.Value)
            {
                presentCount = Convert.ToInt32(dt.Rows[0][0]);
            }
        }
    }

    // 把统计结果显示到文本框
    txtPresentDay.Text = presentCount.ToString();
}

方案2:用ExecuteScalar更高效(推荐)

因为你只需要一个聚合统计值,没必要用DataAdapter和DataTable,用ExecuteScalar直接返回结果更节省资源:

protected void PresentCalculator()
{
    string cur_month = "May";
    int empCode = 2222;
    int presentCount = 0;

    using (SqlConnection con = new SqlConnection("你的数据库连接字符串"))
    {
        string sql = "SELECT COUNT(*) FROM Attendance WHERE Month = @CurMonth AND EMP_CODE = @EmpCode";
        using (SqlCommand cmd = new SqlCommand(sql, con))
        {
            cmd.Parameters.AddWithValue("@CurMonth", cur_month);
            cmd.Parameters.AddWithValue("@EmpCode", empCode);

            con.Open();
            // ExecuteScalar返回查询结果的第一行第一列,无结果则返回null
            object result = cmd.ExecuteScalar();
            if (result != null && result != DBNull.Value)
            {
                presentCount = Convert.ToInt32(result);
            }
        }
    }

    txtPresentDay.Text = presentCount.ToString();
}

关于SQL COUNT函数的小提醒

  • COUNT(EMP_CODE)会忽略EMP_CODE为NULL的行,如果你要统计所有符合条件的记录(不管EMP_CODE是否为空),用COUNT(*)或者COUNT(1)更合适,结果更准确
  • 如果你的Month字段是日期类型(不是字符串),别存"May"这种文本,应该用日期范围查询,比如WHERE MONTH(AttendanceDate) = 5(假设字段名为AttendanceDate),这样更规范还能利用索引

内容的提问来源于stack exchange,提问作者varun sharma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:23:30