如何实现产品尺码存在时更新库存、不存在时新增数据?
解决VB.NET中产品尺码存在时更新库存、不存在时新增数据的问题
看起来你已经实现了产品尺码存在时的库存更新逻辑,但缺少了尺码不存在时新增记录的分支,而且原查询语句有个小问题——只按product_code查询会返回该产品所有尺码的记录,没法精准判断指定尺码是否存在。下面是完整的解决方案:
核心问题分析
你的现有代码只处理了「找到对应产品记录」的情况,但:
- 查询条件仅匹配
product_code,无法精准判断指定尺码是否存在(同一个产品可能有多个尺码) - 没有处理「尺码不存在时新增记录」的分支逻辑
完整修改方案
首先调整查询逻辑,同时匹配product_code和product_size,然后分别处理「更新」和「新增」两种场景:
Public Sub addProductsExtension() Try dbConnection() ' 假设这是你自定义的数据库连接方法 ' 修改查询语句:同时匹配产品编码和尺码,精准判断目标尺码是否存在 search_query = "SELECT product_stocks FROM tblproducts_extension WHERE product_code = @product_code AND product_size = @product_size;" command = New SqlCommand With command .Connection = connection .CommandText = search_query .Parameters.Clear() .Parameters.AddWithValue("@product_code", productsView.txtPCode.Text) ' 假设尺码从txtSize控件获取,你可以根据实际业务调整来源 .Parameters.AddWithValue("@product_size", productsView.txtSize.Text) dataReader = .ExecuteReader() If dataReader.HasRows Then ' 尺码存在:读取当前库存并更新 dataReader.Read() Dim currentStock As Integer = Convert.ToInt32(dataReader("product_stocks")) ' 新增的库存数量,假设从txtAddStock控件获取 Dim addStock As Integer = Convert.ToInt32(productsView.txtAddStock.Text) updateExtension(currentStock + addStock) MsgBox("Updated stocks successfully!") Else ' 尺码不存在:插入新的尺码库存记录 Dim newStock As Integer = Convert.ToInt32(productsView.txtAddStock.Text) insertExtension(newStock) MsgBox("New size stock added successfully!") End If dataReader.Close() connection.Close() End With Catch ex As Exception MsgBox("Error: " & ex.Message) ' 异常时确保资源被正确释放 If dataReader IsNot Nothing AndAlso Not dataReader.IsClosed Then dataReader.Close() End If If connection IsNot Nothing AndAlso connection.State = ConnectionState.Open Then connection.Close() End If End Try End Sub ' 负责更新库存的私有方法 Private Sub updateExtension(newStock As Integer) Try update_query = "UPDATE tblproducts_extension SET product_stocks = @newStock WHERE product_code = @product_code AND product_size = @product_size;" command = New SqlCommand With command .Connection = connection .CommandText = update_query .Parameters.Clear() .Parameters.AddWithValue("@newStock", newStock) .Parameters.AddWithValue("@product_code", productsView.txtPCode.Text) .Parameters.AddWithValue("@product_size", productsView.txtSize.Text) .ExecuteNonQuery() End With Catch ex As Exception Throw ex ' 抛出异常让上层统一处理 End Try End Sub ' 负责新增尺码库存的私有方法 Private Sub insertExtension(stock As Integer) Try insert_query = "INSERT INTO tblproducts_extension (product_code, product_size, product_stocks) VALUES (@product_code, @product_size, @stock);" command = New SqlCommand With command .Connection = connection .CommandText = insert_query .Parameters.Clear() .Parameters.AddWithValue("@product_code", productsView.txtPCode.Text) .Parameters.AddWithValue("@product_size", productsView.txtSize.Text) .Parameters.AddWithValue("@stock", stock) .ExecuteNonQuery() End With Catch ex As Exception Throw ex ' 抛出异常让上层统一处理 End Try End Sub
关键说明
- 精准判断尺码存在性:查询时同时指定
product_code和product_size,确保只针对当前操作的尺码进行判断,避免误更新其他尺码的库存 - 参数化查询:全程使用参数化SQL,彻底避免SQL注入风险,同时提升查询稳定性
- 资源安全管理:在异常处理中强制关闭数据库连接和DataReader,防止资源泄漏
- 逻辑分支清晰:明确区分「更新」和「新增」场景,拆分到独立方法中,代码更易维护
额外优化建议
如果你的dbConnection()方法没有使用Using语句,建议改成下面的形式,能更安全地管理数据库连接(自动释放资源):
Private Function dbConnection() As SqlConnection Dim connString As String = "你的数据库连接字符串" Return New SqlConnection(connString) End Function
然后在addProductsExtension()中用Using包裹连接:
Using connection As SqlConnection = dbConnection() connection.Open() ' 后续的command、dataReader逻辑全部放在Using块内 End Using
这样连接会在Using块结束后自动关闭,无需手动处理,进一步降低资源泄漏风险。
内容的提问来源于stack exchange,提问作者Jhon Th
相关产品推荐
相关产品推荐

