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

VB.NET对接phpMyAdmin管理的MySQL服务 如何实现每日自动删除表记录

代码问题排查及修正方案

原代码存在的核心问题

  • 语法错误:代码中“Data Deleted!”外层使用了中文全角引号,会直接导致编译失败
  • 逻辑判断无效:定义的query只是未执行的SQL字符串,直接和日期字符串比较没有任何实际意义,会触发无条件执行删除操作
  • 删除语句无效:DELETE FROM tbl_attendance WHERE 0的WHERE条件恒为假,执行后不会删除任何数据
  • 异常处理逻辑颠倒:删除成功的提示放在了Catch异常捕获块中,只有程序报错时才会弹出“删除成功”提示,完全不符合预期
  • 数据库连接资源泄漏:只有触发异常时才会关闭连接,正常执行完成后连接会持续处于打开状态,占用数据库资源
  • 日期处理存在兼容风险:直接将日期转为dd/MM/yyyy格式字符串和数据库字段比较,容易因数据库时区、字段类型、格式设置差异出现判断错误
  • 缺少SQL注入防护:没有使用参数化查询,后续调整筛选条件时容易出现注入风险

修正后代码

场景1:每日结束清空tbl_attendance全表数据

Try
    ' TRUNCATE比DELETE清空表效率更高,适合全表删除场景
    Dim deleteSql As String = "TRUNCATE TABLE `tbl_attendance`"
    con.Open()
    Dim mysc As New MySqlCommand(deleteSql, con)
    mysc.ExecuteNonQuery()
    MessageBox.Show("数据删除成功!", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information)
Catch ex As Exception
    MessageBox.Show(ex.Message, "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
Finally
    ' 无论执行成功还是失败都强制关闭连接,避免资源泄漏
    If con.State = ConnectionState.Open Then
        con.Close()
    End If
End Try

注意:TRUNCATE操作会重置表的自增ID,且无法回滚,确认需求后再使用


场景2:只保留当日考勤数据,删除所有历史数据

Try
    ' 使用参数化查询传递日期,规避格式兼容问题
    Dim deleteSql As String = "DELETE FROM `tbl_attendance` WHERE emp_date < @today"
    con.Open()
    Dim mysc As New MySqlCommand(deleteSql, con)
    ' 直接传递日期类型参数,不需要转字符串
    mysc.Parameters.AddWithValue("@today", DateTime.Now.Date)
    mysc.ExecuteNonQuery()
    MessageBox.Show("历史数据删除成功!", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information)
Catch ex As Exception
    MessageBox.Show(ex.Message, "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
Finally
    If con.State = ConnectionState.Open Then
        con.Close()
    End If
End Try

补充建议

如果是每日固定时间执行删除操作,更推荐直接在MySQL中配置定时事件实现,不需要通过业务代码触发,稳定性更高。

内容的提问来源于stack exchange,提问作者Leo Ganas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 16:06:02