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

如何按InvoiceNo排序将数据表记录检索至DataGridView?

按InvoiceNo排序并将数据加载到DataGridView的正确实现方案

我来帮你搞定这个问题,咱们一步步修正和完善你的代码,同时解决潜在的风险:

先说说你现有代码的几个问题

  • 你的SQL查询没有添加排序逻辑,所以不会按InvoiceNo排序
  • 直接把变量No拼接到SQL语句里存在SQL注入风险,这在生产环境是绝对要避免的
  • DataGridView的显示写法DataGridView2.Show.item是错误的,WinForms里正确的绑定方式是设置DataSource属性

正确的实现方案(以VB.NET为例)

1. 使用参数化查询+排序逻辑

首先修改SQL语句,添加ORDER BY InvoiceNo实现排序,同时用参数化查询替代字符串拼接,避免注入风险:

2. 正确绑定数据到DataGridView

直接将查询得到的DataTable赋值给DataGridView的DataSource,控件会自动生成列并填充数据。

下面是完整的可运行代码示例:

' 替换成你的数据库连接字符串
Dim connectionString As String = "Server=你的服务器;Database=你的数据库;Uid=用户名;Pwd=密码;"

' 1. 构造带排序的参数化SQL
Dim sqlQuery As String = "SELECT * FROM tblInvoicedeteils WHERE InvoiceNo = @InvoiceNo ORDER BY InvoiceNo"

' 2. 使用Using块自动释放资源(最佳实践)
Using conn As New SqlConnection(connectionString)
    Using cmd As New SqlCommand(sqlQuery, conn)
        ' 添加参数,避免SQL注入
        cmd.Parameters.AddWithValue("@InvoiceNo", No)
        
        conn.Open()
        
        ' 填充DataTable
        Dim dataAdapter As New SqlDataAdapter(cmd)
        Dim resultTable As New DataTable()
        dataAdapter.Fill(resultTable)
        
        ' 3. 绑定到DataGridView
        If resultTable.Rows.Count > 0 Then
            DataGridView2.DataSource = resultTable
            ' 可选:设置列自动填充宽度,优化显示效果
            DataGridView2.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
        Else
            ' 无数据时清空控件或提示
            DataGridView2.DataSource = Nothing
            MessageBox.Show("未找到匹配InvoiceNo的记录")
        End If
    End Using
End Using

如果你用的是自定义的DbSelect方法

如果你的DbSelect是封装好的数据访问方法,那需要修改它支持参数化查询,然后这样调用:

' 构造带排序的SQL
Dim sql As String = "SELECT * FROM tblInvoicedeteils WHERE InvoiceNo = @InvoiceNo ORDER BY InvoiceNo"

' 准备参数(假设DbSelect支持接收参数集合)
Dim parameters As New Dictionary(Of String, Object) From {
    {"@InvoiceNo", No}
}

' 调用自定义方法查询
Dim LoadRec As DataTable = DbSelect(sql, parameters)

' 绑定数据
If LoadRec.Rows.Count > 0 Then
    DataGridView2.DataSource = LoadRec
    DataGridView2.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
Else
    DataGridView2.DataSource = Nothing
End If

额外说明

  • 如果需要按InvoiceNo降序排列,把SQL里的ORDER BY InvoiceNo改成ORDER BY InvoiceNo DESC
  • 永远不要直接拼接用户输入到SQL语句里,参数化查询是防范SQL注入的核心手段
  • 设置AutoSizeColumnsMode是为了让列宽自动适配内容,提升用户体验

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 10:34:05