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

VB.NET中DataGridView数据存入AccessDB时首条记录重复插入问题

解决DataGridView数据重复插入Access数据库的问题

问题原因

你的代码中,cmd对象的参数集合没有在每次循环前清空。第一次循环添加的参数会一直留在集合中,后续循环执行AddWithValue时,会新增同名参数而非覆盖原有值。ADO.NET执行SQL时,会优先使用第一个匹配名称的参数值,导致第一条记录被重复插入。

修正方案1:循环内清空参数集合

在每次循环开始前调用cmd.Parameters.Clear(),确保参数集合只包含当前行的参数:

Public Sub insert_items()
    ds.Clear()
    str = ""

    If cn.State = ConnectionState.Open Then
        cn.Close()
    End If

    DBConfig.conn()
    cn.Open()
    
    ' 提前设置Command的连接和SQL语句,避免重复赋值
    cmd.Connection = cn
    cmd.CommandText = "insert into invoice_items([invoice_id],[item_name],[qty],[rate],[item_code])Values(@invoice_id,@item_name,@qty,@rate,@item_code)"
    
    For i As Integer = 0 To DataGridView1.Rows.Count - 2
        cmd.Parameters.Clear() ' 关键:清空上一次循环的参数
        cmd.Parameters.AddWithValue("@invoice_id", invoice_id.Text.ToString)
        cmd.Parameters.AddWithValue("@item_name", DataGridView1.Rows(i).Cells(2).Value)
        cmd.Parameters.AddWithValue("@qty", DataGridView1.Rows(i).Cells(3).Value)
        cmd.Parameters.AddWithValue("@rate", DataGridView1.Rows(i).Cells(4).Value)
        cmd.Parameters.AddWithValue("@item_code", DataGridView1.Rows(i).Cells(1).Value)

        cmd.ExecuteNonQuery()
    Next
    
    cn.Close()
End Sub

修正方案2:使用Using语句创建Command对象(更规范)

每次循环新建OleDbCommand对象,利用Using自动释放资源,彻底避免参数残留问题:

Public Sub insert_items()
    ds.Clear()
    str = ""

    DBConfig.conn()
    Using cn As OleDbConnection = cn ' 假设DBConfig.conn返回OleDbConnection实例
        cn.Open()
        Dim sql As String = "insert into invoice_items([invoice_id],[item_name],[qty],[rate],[item_code])Values(@invoice_id,@item_name,@qty,@rate,@item_code)"
        
        For i As Integer = 0 To DataGridView1.Rows.Count - 2
            Using cmd As New OleDbCommand(sql, cn)
                cmd.Parameters.AddWithValue("@invoice_id", invoice_id.Text.ToString)
                cmd.Parameters.AddWithValue("@item_name", DataGridView1.Rows(i).Cells(2).Value)
                cmd.Parameters.AddWithValue("@qty", DataGridView1.Rows(i).Cells(3).Value)
                cmd.Parameters.AddWithValue("@rate", DataGridView1.Rows(i).Cells(4).Value)
                cmd.Parameters.AddWithValue("@item_code", DataGridView1.Rows(i).Cells(1).Value)

                cmd.ExecuteNonQuery()
            End Using
        Next
    End Using
End Sub

额外注意事项

  • 确保DataGridView1.Rows.Count - 2的计算正确,避免处理空白行(如果DataGridView允许添加新行,最后一行是空白行)
  • 建议使用参数化查询时,指定参数的OleDbType,而非依赖AddWithValue的自动推断,避免类型匹配问题

内容的提问来源于stack exchange,提问作者John MacClain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 08:45:46