在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
相关产品推荐
相关产品推荐

