数据库关联两张表执行扣减操作,点击按钮无报错但数据未更新如何解决
问题诱因
- SQL语法逻辑错误:你使用SQL Server的
UPDATE FROM语法时,更新的主表tblProducts未和JOIN关联的别名t1绑定,导致数据库无法匹配到需要更新的行,最终执行影响行数为0,无报错但无数据变更。 - 无业务过滤条件:代码中已经从Session获取了当前用户ID,但完全没有应用到SQL逻辑中,既没有过滤当前用户对应的待扣减订单商品,也没有校验关联的
tblOrderProducts是否存在有效数据,若没有匹配的关联数据自然不会产生更新。 - 代码执行顺序问题:
Response.Redirect方法默认会立即终止当前请求线程,虽然后续的连接关闭操作在using语法下会自动执行,但如果有事务提交等后续逻辑会被直接中断,也会导致更新不生效。
修正方案
1. SQL语句修正
首先调整UPDATE语法,绑定更新的表别名,同时增加用户过滤条件,需确认tblOrderProducts表中存储用户ID的字段名,假设字段名为UserID,修正后的SQL如下:
UPDATE t1 SET PQuantity = t1.PQuantity - t2.Quantity FROM tblProducts t1 INNER JOIN tblOrderProducts t2 ON t1.PID = t2.OrderProID WHERE t2.UserID = @UserId -- 绑定当前用户ID参数,仅扣减当前用户订单对应的商品
2. C#代码修正
增加参数绑定、执行结果校验、事务控制,避免SQL注入和数据不一致问题,修正后代码如下:
protected void btnBuyNow_Click(object sender, EventArgs e) { // 先校验用户登录状态,避免Session为空报错 if (Session["UserID"] == null) { Response.Redirect("Login.aspx"); return; } string userId = Session["UserID"].ToString(); int affectRows = 0; using (SqlConnection con = new SqlConnection(CS)) { con.Open(); // 开启事务保证数据一致性 using (SqlTransaction tran = con.BeginTransaction()) { try { SqlCommand cmd = con.CreateCommand(); cmd.Transaction = tran; cmd.CommandType = CommandType.Text; // 参数化查询避免SQL注入 cmd.CommandText = @"UPDATE t1 SET PQuantity = t1.PQuantity - t2.Quantity FROM tblProducts t1 INNER JOIN tblOrderProducts t2 ON t1.PID = t2.OrderProID WHERE t2.UserID = @UserId"; cmd.Parameters.AddWithValue("@UserId", userId); affectRows = cmd.ExecuteNonQuery(); tran.Commit(); } catch (Exception ex) { // 出错回滚事务 tran.Rollback(); // 可在此处添加异常日志记录逻辑 Response.Write("<script>alert('库存扣减失败,请重试');</script>"); return; } } } // 确认扣减成功再跳转 if (affectRows > 0) { // 第二个参数传false,不强制终止当前线程,避免逻辑异常 Response.Redirect("OrderConfirmation.aspx", false); Context.ApplicationInstance.CompleteRequest(); } else { Response.Write("<script>alert('未找到对应订单商品,扣减失败');</script>"); } }
额外注意事项
- 可在SQL的WHERE条件中增加
AND t1.PQuantity >= t2.Quantity,避免库存扣减为负数的超卖问题 - 如果
tblOrderProducts中用户的订单商品是当前请求才生成的,需要先保证订单商品插入逻辑执行成功,再执行库存扣减逻辑
内容的提问来源于stack exchange,提问作者user15359738
相关产品推荐
相关产品推荐

