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

在VB.NET中用文本框查询MS Access中的发票编号

开票软件发票编号查询功能实现

需求说明

  • 开发开票软件的已存账单查询窗体
  • 通过名为SrchwtInvTBx的文本框和按钮,查询MS Access数据库中Invoice表内与指定发票编号关联的条目
  • 数据库中同一发票编号可能对应多条条目,查询结果需显示在名为DGV的DataGridView中
  • 查询结果需按数据库Sl_No列的数值排序

原参考代码(按客户名称查询成功版)

Private Sub SrchwtInvoice()
    If String.IsNullOrEmpty(SrchwtInvTBx.Text) Then
        MsgBox("Please Search with an Invoice Number")
    Else
        Dim Searcher As Integer
        Try
            con = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\MSDB.accdb")
            con.Open()
            cmd = con.CreateCommand()
            cmd.CommandType = CommandType.Text
            cmd.CommandText = "select * from Invoice where Inv_ID = '" + SrchwtInvTBx.Text + "'"
            cmd.ExecuteNonQuery()
            dt = New DataTable()
            da = New OleDbDataAdapter(cmd)
            da.Fill(dt)
            Searcher = Convert.ToInt32(dt.Rows.Count.ToString)
            DGV.DataSource = dt
            con.Close()
        Catch ex As Exception
            con.Close()
            MessageBox.Show(ex.Message)
        End Try
    End If
End Sub

修改后的实现代码(满足发票编号查询+排序需求)

Private Sub SrchwtInvoice()
    If String.IsNullOrEmpty(SrchwtInvTBx.Text.Trim()) Then
        MsgBox("请输入发票编号进行查询")
        Return
    End If

    Dim dt As New DataTable()
    ' 使用Using语句自动释放数据库资源,避免连接泄漏
    Using con As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\MSDB.accdb")
        Try
            con.Open()
            ' 添加ORDER BY Sl_No实现排序,同时用参数化查询避免SQL注入
            Dim cmdText As String = "SELECT * FROM Invoice WHERE Inv_ID = @InvID ORDER BY Sl_No"
            Using cmd As New OleDbCommand(cmdText, con)
                ' 根据InvID实际数据类型调整参数类型,文本型用VarChar,数字型用Integer
                cmd.Parameters.Add("@InvID", OleDbType.VarChar).Value = SrchwtInvTBx.Text.Trim()
                
                Dim da As New OleDbDataAdapter(cmd)
                da.Fill(dt)

                DGV.DataSource = dt
                ' 无结果时提示用户
                If dt.Rows.Count = 0 Then
                    MsgBox("未找到对应发票编号的记录")
                End If
            End Using
        Catch ex As Exception
            MessageBox.Show($"查询出错:{ex.Message}")
        End Try
    End Using
End Sub

关键修改说明

  • 排序逻辑:在SQL语句末尾加入ORDER BY Sl_No,确保结果按Sl_No列数值从小到大排序
  • 安全优化:用参数化查询替换字符串拼接,避免SQL注入风险,同时适配不同数据类型的发票编号
  • 资源管理:使用Using语句自动释放数据库连接和命令对象,无需手动关闭,避免连接泄漏
  • 体验优化:增加输入空格去除、中文提示,无结果时主动告知用户
  • 冗余清理:删除不必要的cmd.ExecuteNonQuery()(DataAdapter的Fill()方法会自动执行查询)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 22:04:57