如何在VB.net与MySQL中通过ListView复选框批量更新用户审批数据
问题分析与修正方案
原代码存在的问题
- 遍历
CheckedItems时,却使用ListView1.SelectedItems(0).Text获取ID,导致所有勾选项都更新同一个ID,而非当前勾选项的ID - ID部分直接拼接字符串,存在SQL注入风险
- 每次循环都弹出提示框,操作体验差
- 未确保数据库连接处于打开状态,可能引发执行异常
- 重复创建
MySqlCommand对象,资源利用效率低
修正后的代码
Private Sub btn_approve_Click(sender As Object, e As EventArgs) Handles btn_approve.Click Try ' 确保连接打开 If con.State = ConnectionState.Closed Then con.Open() End If ' 复用Command对象,提升效率 Using cmd As New MySqlCommand("UPDATE tbl_login SET tbl_logincnt = @tbl_logincnt WHERE tbl_loginid = @loginId", con) ' 预先添加参数,循环中只修改值 cmd.Parameters.Add("@tbl_logincnt", MySqlDbType.Int32) cmd.Parameters.Add("@loginId", MySqlDbType.VarChar) cmd.Parameters("@tbl_logincnt").Value = 1 Dim successCount As Integer = 0 For Each item As ListViewItem In ListView1.CheckedItems ' 获取当前勾选项的ID cmd.Parameters("@loginId").Value = item.Text successCount += cmd.ExecuteNonQuery() Next ' 批量操作完成后统一提示 If successCount > 0 Then MsgBox($"成功更新 {successCount} 条数据") Else MsgBox("没有勾选任何数据") End If End Using Catch ex As Exception MsgBox($"执行出错: {ex.Message}") Finally ' 确保连接关闭 If con.State = ConnectionState.Open Then con.Close() End If End Try End Sub
关键优化点
- 遍历
CheckedItems时,直接使用当前ListViewItem的Text作为ID,确保每个勾选项对应正确的更新 - 所有参数都使用参数化查询,彻底避免SQL注入
- 复用
MySqlCommand对象,减少资源开销 - 统一在批量操作完成后提示结果,优化用户体验
- 添加连接状态检查,确保操作前后连接的正确开闭
- 统计成功更新的条数,提供更明确的反馈
内容的提问来源于stack exchange,提问作者jonathan labajo
相关产品推荐
相关产品推荐

