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

更新提示成功但supplier_location表未更新,仅supplier表更新问题

问题分析与解决方案

核心问题:OleDb参数匹配规则错误

OleDb不支持按参数名称匹配,它严格按照SQL语句中参数出现的顺序来匹配你添加的参数。你的第一个更新语句中,SQL参数顺序是:@House_num → @Province → @City → @Barangay → @locationID,但你添加参数的顺序是先加@locationID,再依次添加其他参数,导致参数值完全错位,WHERE条件里的location_id拿到的是txtHouseNumber.Text的值,自然找不到要更新的记录,所以supplier_location表无变化。

其他潜在问题

  • 直接将文本框字符串赋值给Integer类型参数,可能引发类型转换错误,需显式转换类型。
  • 未使用事务,若其中一张表更新失败,另一张会依然更新,导致数据不一致。
  • 数据库连接未用Using语句,可能造成连接泄漏。

修正后的代码

' 使用事务保证两张表要么都更新成功,要么都回滚
Using con As New OleDbConnection("你的数据库连接字符串")
    con.Open()
    Dim trans As OleDbTransaction = con.BeginTransaction()
    Try
        ' 第一个更新:supplier_location,参数顺序严格匹配SQL中的顺序
        Dim query As String = "Update supplier_location set House_Num = @House_num, Province = @Province, City = @City, Barangay = @Barangay where location_id = @locationID"
        Using cmd As New OleDbCommand(query, con, trans)
            ' 按SQL中参数出现的顺序添加:@House_num → @Province → @City → @Barangay → @locationID
            cmd.Parameters.AddWithValue("@House_num", CInt(txtHouseNumber.Text))
            cmd.Parameters.AddWithValue("@Province", txtProvince.Text)
            cmd.Parameters.AddWithValue("@City", txtCity.Text)
            cmd.Parameters.AddWithValue("@Barangay", txtBarangay.Text)
            cmd.Parameters.AddWithValue("@locationID", CInt(txtSearch.Text))
            
            Dim affectedRows As Integer = cmd.ExecuteNonQuery()
            If affectedRows = 0 Then
                Throw New Exception("未找到要更新的supplier_location记录")
            End If
        End Using

        ' 第二个更新:supplier
        query = "UPDATE supplier set Supplier_id = @supplier_id, First_Name = @supplier_fname, Middle_Name = @supplier_mname, Last_name = @supplier_lname where supplier_id = @searchID"
        Using cmd As New OleDbCommand(query, con, trans)
            ' 按SQL参数顺序添加:@supplier_id → @supplier_fname → @supplier_mname → @supplier_lname → @searchID
            cmd.Parameters.AddWithValue("@supplier_id", CInt(txtSupplierID.Text))
            cmd.Parameters.AddWithValue("@supplier_fname", txtFirstName.Text)
            cmd.Parameters.AddWithValue("@supplier_mname", txtMiddleName.Text)
            cmd.Parameters.AddWithValue("@supplier_lname", txtLastName.Text)
            cmd.Parameters.AddWithValue("@searchID", CInt(txtSearch.Text))
            
            Dim affectedRows As Integer = cmd.ExecuteNonQuery()
            If affectedRows = 0 Then
                Throw New Exception("未找到要更新的supplier记录")
            End If
        End Using

        ' 提交事务
        trans.Commit()
        clearAllTextBox()
        MessageBox.Show("更新成功", "Eagle Clothing", MessageBoxButtons.OK, MessageBoxIcon.Information)
        showData()
    Catch ex As Exception
        ' 回滚事务
        trans.Rollback()
        MessageBox.Show($"更新失败:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error)
    End Try
End Using

关键修正点

  • 调整参数添加顺序,严格对应SQL语句中参数出现的先后顺序。
  • 用CInt()显式转换文本框内容为Integer类型,避免隐式转换错误。
  • 使用Using语句管理连接和命令对象,自动释放资源。
  • 添加事务控制,确保两张表的更新操作原子性(要么都成功,要么都失败)。
  • 增加受影响行数检查,及时发现未找到记录的情况。

内容的提问来源于stack exchange,提问作者Shinzowou

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 04:08:16