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
相关产品推荐
相关产品推荐

