C# WinForm库存管理系统:销售时数据库库存数量未减少问题求助
解决C# WinForm库存更新代码不生效的问题
嘿,我来帮你梳理下你的库存管理系统里的问题——这段更新库存的代码没生效,主要有几个关键的地方需要修正,咱们一步步来:
核心问题分析
1. SqlDataAdapter的使用场景不对
SqlDataAdapter主要是用来和DataSet/DataTable配合,实现批量数据填充或更新的。你只是初始化了它,但没有触发任何执行逻辑(比如调用Update()方法),所以这条UPDATE命令根本没被发送到数据库。而且对于这种单一的更新操作,用SqlCommand会更直接高效。
2. 逻辑错误:同一个TextBox复用了不同含义的值
你的SQL语句里,Vcount-('"+textBox4.Text+"')(销售数量)和WHERE id=('"+textBox4.Text+"')(商品ID)用的都是textBox4的内容,这显然不符合业务逻辑——商品ID和销售数量肯定是两个不同的输入项,应该对应两个不同的输入控件(比如一个输入商品ID,一个输入卖出的数量)。
3. 字符串拼接SQL的安全和语法隐患
直接把用户输入拼到SQL里,不仅存在SQL注入的严重安全风险,还可能因为输入内容不是合法数字(比如用户输入了字母)导致SQL语法错误,最终更新失败。
修正后的代码示例
下面是优化后的代码,解决了上述所有问题:
// 假设:textBoxProductId是商品ID输入框,textBoxSaleQty是销售数量输入框 string updateSql = "UPDATE Stock SET Vcount = Vcount - @SaleQty WHERE id = @ProductId"; // 使用using语句自动管理资源,避免连接泄漏 using (SqlConnection conn = new SqlConnection("你的数据库连接字符串")) using (SqlCommand cmd = new SqlCommand(updateSql, conn)) { try { // 添加参数化查询,避免注入+保证类型正确 cmd.Parameters.Add("@SaleQty", SqlDbType.Int).Value = int.Parse(textBoxSaleQty.Text); cmd.Parameters.Add("@ProductId", SqlDbType.Int).Value = int.Parse(textBoxProductId.Text); conn.Open(); int affectedRows = cmd.ExecuteNonQuery(); // 根据受影响行数判断更新结果 if (affectedRows > 0) { MessageBox.Show("库存更新成功!"); } else { MessageBox.Show("未找到对应商品ID,更新失败!"); } } catch (FormatException) { MessageBox.Show("请输入有效的数字!"); } catch (Exception ex) { MessageBox.Show($"更新出错:{ex.Message}"); } }
关键优化点说明
- 使用
SqlCommand.ExecuteNonQuery()执行更新命令:这个方法专门用于执行不返回数据集的SQL语句(UPDATE/INSERT/DELETE),还会返回受影响的行数,方便判断操作是否成功。 - 参数化查询:彻底避免SQL注入,同时自动处理数据类型转换,不会因为字符串拼接导致语法错误。
using语句:自动帮你关闭数据库连接、释放资源,不用手动写conn.Close(),代码更可靠。
内容的提问来源于stack exchange,提问作者Safdar Shar
相关产品推荐
相关产品推荐

