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

如何计算数据库新旧表Quantity字段差值并在VB.NET中查询展示

Quantity差值查询实现方案

1. SQL语句修正

原SQL存在两个问题:一是带空格的表名没有加标识符包裹会报语法错误,二是没有直接计算差值、过滤条件用了id而非输入的pro.no,另外需要做空值兼容避免某张表无匹配记录时返回Null。修正后语句如下:

SELECT 
  COALESCE(B.`Quantity`, 0) - COALESCE(A.`Quantity`, 0) AS QuantityDiff
FROM `Table Current` A 
LEFT JOIN `Table Old` B ON B.`pro.no` = A.`pro.no`
WHERE A.`pro.no` = @inputProNo

说明:COALESCE函数作用是当字段值为Null时返回指定默认值0,避免空值参与运算得到Null结果;@inputProNo是参数占位符,不要直接拼接用户输入到SQL语句中。
如果你用的是SQL Server数据库,把表名和字段名的反引号换成方括号[]即可。

2. VB.NET后端查询方法

首先根据你用的数据库类型引入对应驱动:MySQL项目先安装MySql.Data包,SQL Server直接用内置的System.Data.SqlClient即可,编写封装好的查询方法:

' 引入对应命名空间,MySQL用下面这行
' Imports MySql.Data.MySqlClient
' SQL Server用下面这行
' Imports System.Data.SqlClient

''' <summary>
''' 根据传入的pro.no查询新旧表的数量差值(旧值-新值)
''' </summary>
Function GetProQuantityDiff(proNo As String) As Integer
    Dim result As Integer = 0
    ' 替换为你项目实际的数据库连接字符串
    Dim connectionString As String = "server=你的数据库地址;database=你的库名;uid=账号;pwd=密码;"
    
    Dim querySql As String = "SELECT COALESCE(B.`Quantity`,0) - COALESCE(A.`Quantity`,0) AS QuantityDiff FROM `Table Current` A LEFT JOIN `Table Old` B ON B.`pro.no` = A.`pro.no` WHERE A.`pro.no` = @inputProNo"
    
    ' Using块会自动释放数据库连接资源,不需要手动释放对象
    Using conn As New MySqlConnection(connectionString)
        Using cmd As New MySqlCommand(querySql, conn)
            ' 参数化传值,彻底避免SQL注入问题
            cmd.Parameters.AddWithValue("@inputProNo", proNo.Trim())
            conn.Open()
            Dim readObj = cmd.ExecuteScalar()
            If readObj IsNot DBNull.Value Then
                result = Convert.ToInt32(readObj)
            End If
            conn.Close()
        End Using
    End Using
    Return result
End Function

如果你用SQL Server,把代码里的MySqlConnection、MySqlCommand替换成SqlConnection、SqlCommand即可。

3. 前端文本框自动查询触发

如果是WinForm项目,直接给输入pro.no的TextBox控件添加TextChanged事件,输入内容合法时自动调用查询方法展示结果:

Private Sub ProNoTextBox_TextChanged(sender As Object, e As EventArgs) Handles ProNoTextBox.TextChanged
    Dim inputVal = ProNoTextBox.Text.Trim()
    ' 空输入时清空结果,不执行查询
    If String.IsNullOrWhiteSpace(inputVal) Then
        ResultLabel.Text = ""
        Return
    End If
    ' 可根据你自己的pro.no编码规则加格式校验,比如必须是数字、长度符合要求才查询,减少无效请求
    If Not IsNumeric(inputVal) Then
        ResultLabel.Text = "请输入正确的产品编号"
        Return
    End If
    
    Try
        Dim diff = GetProQuantityDiff(inputVal)
        ResultLabel.Text = $"新旧数量差值(旧值-新值):{diff}"
    Catch ex As Exception
        ResultLabel.Text = $"查询失败:{ex.Message}"
    End Try
End Sub

注意事项

  • 表名包含空格属于不规范的数据库设计,后续迭代建议调整为无空格的下划线命名(如table_current、table_old),减少跨场景语法兼容问题
  • 如果存在旧表有对应pro.no、新表无记录的场景,把SQL里的LEFT JOIN换成FULL OUTER JOIN即可覆盖双边无匹配的情况
  • 不要为了省事直接把用户输入拼接进SQL字符串,会直接导致SQL注入漏洞,必须用参数化方式传值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 11:01:06