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

Windows Forms应用操作Access数据库无法执行更新删除操作求助

问题排查及解决方案

1. 核心问题:更新/删除语句未执行

你当前贴出的代码中,UPDATE和DELETE仅定义了SQL字符串,没有绑定到DbCommand对象、也没有调用执行方法,自然不会生效。参考你前面插入逻辑的写法,需要补全执行步骤。

2. SQL语法错误

  • id字段大概率是数值类型,不需要用单引号包裹,也不要用LIKE做匹配(LIKE是用于字符串模糊匹配的语法),直接用=做精确匹配即可
  • 注意Access的日期字段如果用字符串拼接,需要用#包裹而不是单引号,否则会识别为普通字符串导致匹配/写入失败

3. 资源未释放导致的连接阻塞

你前面执行查询的DbDataReader使用完后没有主动关闭,DataReader会独占当前数据库连接,导致后续的写操作无法正常执行。

4. 额外风险:字符串拼接SQL存在注入漏洞,且容易触发特殊字符语法错误

建议改用参数化查询,避免拼接字符串引发的各类问题。


修正后的参考代码

// 前面查询逻辑修正:用完Reader即时释放
if (!string.IsNullOrEmpty(this.txb_Box.Text) && !string.IsNullOrEmpty(this.txb_Teil.Text))
{
    string selectSql = "SELECT * FROM Lagerhaltung WHERE BoxNr=@BoxNr AND Reklamation=@Reklamation";
    using (DbCommand command2 = connection2.CreateCommand())
    {
        command2.CommandText = selectSql;
        // 添加参数(根据你的实际字段类型调整DbType)
        var boxParam = command2.CreateParameter();
        boxParam.ParameterName = "@BoxNr";
        boxParam.Value = this.txb_Box.Text;
        command2.Parameters.Add(boxParam);

        var teilParam = command2.CreateParameter();
        teilParam.ParameterName = "@Reklamation";
        teilParam.Value = this.txb_Teil.Text;
        command2.Parameters.Add(teilParam);

        // 用using自动释放Reader
        using (DbDataReader reader2 = command2.ExecuteReader())
        {
            if(!reader2.HasRows)
            {
                string insertSql = "INSERT INTO Lagerhaltung (BoxNr, Reklamation, EingelagertAm, Artikelnr) VALUES (@BoxNr,@Reklamation,@EingelagertAm, 'Test')";
                using (DbCommand insertCmd = connection2.CreateCommand())
                {
                    insertCmd.CommandText = insertSql;
                    // 补全插入参数,写法和上面参数添加逻辑一致
                    // 执行插入
                    insertCmd.ExecuteNonQuery();
                }
            }
        }
    }
}

// 更新操作补全执行逻辑
string updateSql = "UPDATE Lagerhaltung SET AusgelagertAm=@AusgelagertAm, Erledigt= True WHERE id = @Id";
using (DbCommand updateCmd = connection2.CreateCommand())
{
    updateCmd.CommandText = updateSql;
    var dateParam = updateCmd.CreateParameter();
    dateParam.ParameterName = "@AusgelagertAm";
    dateParam.Value = this.lbl_Datum.Text;
    updateCmd.Parameters.Add(dateParam);

    var idParam = updateCmd.CreateParameter();
    idParam.ParameterName = "@Id";
    idParam.Value = data.id;
    updateCmd.Parameters.Add(idParam);
    // 执行更新,返回受影响行数,可以判断是否执行成功
    int affectedRows = updateCmd.ExecuteNonQuery();
}

// 删除操作补全执行逻辑
string deleteSql = "DELETE FROM Lagerhaltung WHERE id = 1";
using (DbCommand deleteCmd = connection2.CreateCommand())
{
    deleteCmd.CommandText = deleteSql;
    int affectedRows = deleteCmd.ExecuteNonQuery();
}

内容的提问来源于stack exchange,提问作者JuRi-2020

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 02:24:00