如何使用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
相关产品推荐
相关产品推荐

