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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 14:15:34