DataGridView多行存入同一数据库ID仅插入一行问题求助
问题分析与解决
核心问题1:循环逻辑错误
你的For循环条件写法完全错误,DataGridView2.Rows.Count = 1是布尔判断,会被转成整数(True为-1,False为0),导致循环只执行一次甚至不执行。正确的循环范围应该遍历所有有效行:
For i As Integer = 0 To DataGridView2.Rows.Count - 1 ' 跳过DataGridView自动生成的空行(如果开启了AllowUserToAddRows) If Not DataGridView2.Rows(i).IsNewRow Then p_id = DataGridView2.Rows(i).Cells(0).Value p_description = DataGridView2.Rows(i).Cells(1).Value p_from = DataGridView2.Rows(i).Cells(2).Value p_to = DataGridView2.Rows(i).Cells(3).Value ' 每一行数据对应一次插入操作,把SQL执行代码放在这里 InsertRowToDB(petition_id.Text.Trim, petitioner_name.Text.Trim, p_id, p_description, p_from, p_to) End If Next
核心问题2:SQL执行位置错误
你把SQL插入代码放在了循环外面,循环结束后只会用最后一次循环的变量值执行一次插入,自然只有一行数据存入数据库。必须把插入操作放到循环内部,每遍历一行就执行一次插入。
核心问题3:SQL语法错误与注入风险
你的SQL拼接有语法错误:'"petition_id.Text.Trim"'' 缺少连接符&,而且直接拼接字符串会引发SQL注入风险,强烈使用参数化查询,示例如下:
Private Sub InsertRowToDB(petitionId As String, petitionerName As String, itemNo As Integer, description As String, fromVal As String, toVal As String) Dim connStr As String = "你的数据库连接字符串" Using conn As New SqlConnection(connStr) conn.Open() Dim sql As String = "INSERT INTO Petition_tbl(p_id,p_name_of_petitioner,p_item_no,p_description,p_from,p_to) VALUES(@PetitionId, @PetitionerName, @ItemNo, @Description, @FromVal, @ToVal)" Using cmd As New SqlCommand(sql, conn) cmd.Parameters.AddWithValue("@PetitionId", petitionId) cmd.Parameters.AddWithValue("@PetitionerName", petitionerName) cmd.Parameters.AddWithValue("@ItemNo", itemNo) cmd.Parameters.AddWithValue("@Description", description) cmd.Parameters.AddWithValue("@FromVal", fromVal) cmd.Parameters.AddWithValue("@ToVal", toVal) cmd.ExecuteNonQuery() End Using End Using End Sub
额外注意事项
- 检查
DataGridView2的AllowUserToAddRows属性,若为True,最后一行是空行,必须用IsNewRow判断跳过,避免插入空数据。 - 确保数据库连接字符串正确,操作数据库时有足够权限。
- 可以添加异常捕获,处理插入时可能出现的类型不匹配、连接失败等问题。
内容的提问来源于stack exchange,提问作者Shigeo
相关产品推荐
相关产品推荐

