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
相关产品推荐
相关产品推荐

