如何在C#桌面应用中实现超市商品售出后数据库库存扣减功能
超市系统商品售出库存扣减的C#实现方案
原代码的问题
你写的SQL用了字符串拼接变量,不仅有SQL注入风险,还犯了语法错误:数值类型的售出数量被加了单引号,数据库会把它当成字符串处理,自然执行失败。
正确实现(参数化查询)
用参数化查询是标准解决方案,既安全又能避免语法/类型问题,以下是完整的C#代码示例(假设用SQL Server数据库):
using System.Data.SqlClient; // 替换成你实际的变量值 string targetProductName = "可口可乐"; int soldQuantity = 3; // 替换成你的数据库连接字符串,比如"Server=.;Database=SuperMarketDB;Trusted_Connection=True;" string dbConnStr = "你的数据库连接字符串"; try { // using语句自动释放资源,不用手动关闭连接 using (SqlConnection conn = new SqlConnection(dbConnStr)) { // 参数化SQL,用@定义参数占位符 string updateQuery = "UPDATE ProductTable SET Product_Quantity = Product_Quantity - @SoldQty WHERE Product_Name = @ProdName"; conn.Open(); using (SqlCommand cmd = new SqlCommand(updateQuery, conn)) { // 绑定参数,指定值和类型(AddWithValue会自动识别类型,也可以用Add指定更精确的类型) cmd.Parameters.AddWithValue("@SoldQty", soldQuantity); cmd.Parameters.AddWithValue("@ProdName", targetProductName); // 执行更新,返回受影响的行数 int updatedRows = cmd.ExecuteNonQuery(); if (updatedRows > 0) { // 库存扣减成功,这里可以加提示、日志等逻辑 Console.WriteLine("库存更新完成"); } else { // 没找到对应商品,提示异常 Console.WriteLine("未找到指定商品,库存未变动"); } } } } catch (SqlException dbEx) { // 捕获数据库相关错误,比如连接失败、约束冲突(比如库存为负) Console.WriteLine($"数据库出错:{dbEx.Message}"); } catch (Exception ex) { // 处理其他意外错误 Console.WriteLine($"操作失败:{ex.Message}"); }
额外提示
- 如果是同时扣减多个商品,建议加事务处理,确保所有商品的库存更新要么都成功,要么都回滚,避免数据不一致。示例:
// 在conn.Open()后添加 SqlTransaction tran = conn.BeginTransaction(); cmd.Transaction = tran; // 执行完所有更新后 tran.Commit(); // 成功就提交 // 如果出错,在catch里执行 tran.Rollback(); - 可以在SQL里加库存判断,比如
WHERE Product_Name = @ProdName AND Product_Quantity >= @SoldQty,避免库存被扣成负数。
内容的提问来源于stack exchange,提问作者NAM3L3SSRJ
相关产品推荐
相关产品推荐

