如何在VB.NET中逐行读取DataGridView行并关联数据库查询?
VB.NET逐行读取DataGridView并同步查询数据库的正确实现
原代码的核心问题
- 循环全程使用
TextBox2.Text作为查询条件,没有读取当前DataGridView行的item_id,完全未实现逐行处理的需求 - 直接拼接字符串生成SQL语句,存在严重的SQL注入风险
- 数据库资源(连接、命令、阅读器)未正确释放,易导致连接泄漏
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
相关产品推荐
相关产品推荐

