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

如何在VB.NET中逐行读取DataGridView行并关联数据库查询?

VB.NET逐行读取DataGridView并同步查询数据库的正确实现

原代码的核心问题

  1. 循环全程使用TextBox2.Text作为查询条件,没有读取当前DataGridView行的item_id,完全未实现逐行处理的需求
  2. 直接拼接字符串生成SQL语句,存在严重的SQL注入风险
  3. 数据库资源(连接、命令、阅读器)未正确释放,易导致连接泄漏
  4. TextBox4.Text被反复覆盖,只能保留最后一次查询结果,不符合逐行处理的预期

修正后的实现代码

Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
    ' 清空历史结果,避免数据混乱
    ListBox1.Items.Clear()
    TextBox4.Text = ""

    ' 遍历DataGridView的每一行,跳过未提交的空行
    For Each row As DataGridViewRow In DataGridView1.Rows
        ' 跳过系统自动生成的新行(未输入数据的空行)
        If row.IsNewRow Then Continue For

        ' 获取当前行的item_id(假设第1列索引为0的列存储item_id)
        Dim itemId As String = row.Cells(0).Value?.ToString()
        If String.IsNullOrEmpty(itemId) Then
            ListBox1.Items.Add($"行 {row.Index}:item_id为空,跳过查询")
            Continue For
        End If

        ' 使用Using语句自动释放数据库资源,杜绝连接泄漏
        Using conn As New SqlConnection("你的数据库连接字符串") ' 替换为实际连接字符串
            conn.Open()
            ' 参数化查询:避免SQL注入,同时提升数据库执行效率
            Dim sqlStr As String = "SELECT item_id FROM Pr_MasterItem WHERE item_id = @ItemId"
            Using cmd As New SqlCommand(sqlStr, conn)
                ' 绑定参数,指定数据类型(根据实际数据库字段类型调整)
                cmd.Parameters.Add("@ItemId", SqlDbType.VarChar).Value = itemId

                Using rd As SqlDataReader = cmd.ExecuteReader()
                    If rd.HasRows Then
                        rd.Read()
                        Dim foundItemId As String = rd("item_id").ToString()
                        ListBox1.Items.Add($"行 {row.Index}:找到item_id - {foundItemId}")
                        ' 拼接所有查询结果到TextBox,避免覆盖
                        TextBox4.Text &= $"{foundItemId}{Environment.NewLine}"
                    Else
                        ListBox1.Items.Add($"行 {row.Index}:未找到item_id - {itemId}")
                    End If
                End Using
            End Using
        End Using
    Next
End Sub

关键实现要点

  • 逐行读取DGV数据:通过row.Cells(0).Value获取当前行的item_id,同时判断IsNewRow跳过空行
  • 参数化查询:用@ItemId参数替代字符串拼接,彻底规避SQL注入风险,同时让数据库缓存执行计划提升性能
  • 资源自动管理:用Using语句包裹所有数据库对象,确保使用后自动释放资源,避免连接泄漏
  • 结果合理处理:清空历史结果后,用ListBox记录每一行的查询状态,TextBox用换行拼接所有匹配结果,避免覆盖
  • 空值校验:检查item_id是否为空,跳过无效的数据库查询

内容的提问来源于stack exchange,提问作者Ari's

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 18:15:03