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

Visual Studio C#结合Access数据库实现员工仅单次签出校验方案

解决方案

你原有逻辑的问题是UPDATE语句没有限制Out_Time的状态,只要Emp_ID匹配就会覆盖更新字段值,只要在WHERE条件中追加Out_Time IS NULL的判断,就能实现仅空白的Out_Time可以写入的需求。同时建议你优化原有代码的SQL注入风险和异常提示逻辑,修改后代码如下:

private void out_btn_Click(object sender, EventArgs e)
{
    try
    {
        con.Open();
        OleDbCommand cmd = con.CreateCommand();
        cmd.CommandType = CommandType.Text;
        // 追加Out_Time为空的判断,同时改用参数化查询避免SQL注入
        cmd.CommandText = "update Daily_emp_track set Out_Time = ? where Emp_ID = ? AND Out_Time IS NULL";
        // OleDb参数按位置匹配,注意参数顺序和SQL中占位符顺序一致
        cmd.Parameters.AddWithValue("@OutTime", time1.Text);
        cmd.Parameters.AddWithValue("@EmpId", id_txt.Text);
        int affectRows = cmd.ExecuteNonQuery();
        con.Close();
        if (affectRows > 0)
        {
            MessageBox.Show("签退成功");
        }
        else
        {
            MessageBox.Show("该员工ID不存在或已完成签退,无需重复操作");
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("操作失败:" + ex.Message);
        // 异常场景下判断连接状态,保证连接正常关闭
        if (con.State == System.Data.ConnectionState.Open)
        {
            con.Close();
        }
    }
}

优化点说明

  • 原有代码直接拼接SQL字符串存在SQL注入风险,改用参数化查询可以规避该问题,同时也能避免时间格式、特殊字符等导致的SQL语法错误。
  • 新增执行行数判断,可以区分「ID不存在」和「已签退」两种异常场景,比原有统一提示ID无效的反馈更准确。
  • 异常捕获逻辑增加了连接状态判断,避免异常抛出时数据库连接未正常关闭的资源泄露问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 16:36:03