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

如何将CheckedListBox的已选/未选项分别存入Access表的单个字段

解决CheckedListBox选中/未选中项存入Access字段的问题

原代码存在的核心问题

  • SQL语句与变量错误:x、z未初始化就直接引用,SQL字符串拼接时引号配对混乱,且直接拼接用户输入会引发SQL注入风险,还容易因特殊字符导致语法错误。
  • 循环逻辑失效:循环中把循环变量i赋值给x、z,根本没实现遍历收集所有选中/未选中项的功能,最终只能拿到错误的单个项。
  • 数据操作逻辑颠倒:先创建INSERT命令再处理CheckedListBox的项,导致后续循环无法修改已固定的SQL语句;同时用DataAdapter.Fill执行INSERT是错误的,该方法仅用于查询填充DataTable。

修正后的完整代码

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    ' 初始化存储选中、未选中项的字符串
    Dim piecesFourni As String = ""
    Dim piecesManquant As String = ""

    ' 遍历CheckedListBox,分类收集项
    For i = 0 To CheckedListBox1.Items.Count - 1
        If CheckedListBox1.GetItemChecked(i) Then
            ' 选中项:用逗号分隔追加到字符串
            If piecesFourni <> "" Then piecesFourni &= ", "
            piecesFourni &= CheckedListBox1.Items(i).ToString()
        Else
            ' 未选中项:用逗号分隔追加到字符串
            If piecesManquant <> "" Then piecesManquant &= ", "
            piecesManquant &= CheckedListBox1.Items(i).ToString()
        End If
    Next

    ' 构造参数化SQL语句,避免注入和语法错误
    Dim sql As String = "INSERT INTO tab_asso(id_dossier, denomination, date_recep, nom_prenom, adresse, wilaya, code_wilaya, region, pieces_fourni, pieces_manquant) " & _
                        "VALUES (@id_dossier, @denomination, @date_recep, @nom_prenom, @adresse, @wilaya, @code_wilaya, @region, @pieces_fourni, @pieces_manquant)"

    ' 使用Using自动管理数据库资源
    Using cn As New OleDbConnection("你的数据库连接字符串") ' 替换为实际连接字符串
        Using cmd As New OleDbCommand(sql, cn)
            ' 绑定参数,对应表中字段
            cmd.Parameters.AddWithValue("@id_dossier", TextBox1.Text)
            cmd.Parameters.AddWithValue("@denomination", TextBox2.Text)
            cmd.Parameters.AddWithValue("@date_recep", DateTimePicker1.Value.Date)
            cmd.Parameters.AddWithValue("@nom_prenom", TextBox6.Text)
            cmd.Parameters.AddWithValue("@adresse", TextBox7.Text)
            cmd.Parameters.AddWithValue("@wilaya", ComboBox1.Text)
            cmd.Parameters.AddWithValue("@code_wilaya", TextBox4.Text)
            cmd.Parameters.AddWithValue("@region", TextBox5.Text)
            cmd.Parameters.AddWithValue("@pieces_fourni", piecesFourni)
            cmd.Parameters.AddWithValue("@pieces_manquant", piecesManquant)

            Try
                cn.Open()
                cmd.ExecuteNonQuery()
                MessageBox.Show("数据插入成功")
            Catch ex As Exception
                MessageBox.Show("插入失败:" & ex.Message)
            End Try
        End Using
    End Using
End Sub

关键改进说明

  • 正确收集项:通过循环遍历每个列表项,按选中状态分类拼接成逗号分隔的字符串,确保所有项都被存入对应字段。
  • 参数化查询:用@占位符代替直接字符串拼接,彻底避免SQL注入,同时解决特殊字符导致的语法问题。
  • 资源自动管理:Using语句会自动释放数据库连接和命令资源,避免连接泄漏。
  • 异常捕获:添加Try-Catch块捕获错误,方便排查插入失败的原因。

内容的提问来源于stack exchange,提问作者Kamel Brahouni

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 15:45:19