You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现产品尺码存在时更新库存、不存在时新增数据?

解决VB.NET中产品尺码存在时更新库存、不存在时新增数据的问题

看起来你已经实现了产品尺码存在时的库存更新逻辑,但缺少了尺码不存在时新增记录的分支,而且原查询语句有个小问题——只按product_code查询会返回该产品所有尺码的记录,没法精准判断指定尺码是否存在。下面是完整的解决方案:

核心问题分析

你的现有代码只处理了「找到对应产品记录」的情况,但:

  1. 查询条件仅匹配product_code,无法精准判断指定尺码是否存在(同一个产品可能有多个尺码)
  2. 没有处理「尺码不存在时新增记录」的分支逻辑

完整修改方案

首先调整查询逻辑,同时匹配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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:11:53