.NET中DataGridView数据插入数据库仅成功第一行的问题求助
问题排查:DataGridView仅插入第一行到数据库
你的代码只插入第一行的原因有几个关键问题,修复方案如下:
问题点分析
- 参数重复累积:每次循环都调用
AddWithValue添加参数,但没有清空之前的参数集合。第二次循环时,参数列表里会存在重复的@Name、@IMEI、@Hersteller,导致SQL命令执行失败,后续行无法插入。 - 多余的执行语句:循环结束后额外调用了一次
sqlCommand.ExecuteNonQuery(),这不仅毫无意义,还可能引发错误。 - 未跳过DataGridView的空新行:默认情况下DataGridView会在最后一行添加一个空的新行(用于用户输入),如果直接遍历所有行,会尝试插入空数据,可能导致异常。
修复后的代码
// 先定义一次SQL语句,不用在循环里重复赋值 var strQuery = "INSERT INTO Mobile (Name, IMEI, Hersteller) VALUES (@Name, @IMEI, @Hersteller)"; sqlCommand.CommandText = strQuery; // 提前添加参数,后续循环只更新值 sqlCommand.Parameters.Add("@Name", SqlDbType.VarChar); // 根据实际字段类型调整 sqlCommand.Parameters.Add("@IMEI", SqlDbType.VarChar); sqlCommand.Parameters.Add("@Hersteller", SqlDbType.VarChar); for(int i = 0; i < dgvCSV_Datei.Rows.Count; i++) { // 跳过空的新行 if(dgvCSV_Datei.Rows[i].IsNewRow) continue; // 更新参数值,而不是重复添加,处理空值避免报错 sqlCommand.Parameters["@Name"].Value = dgvCSV_Datei.Rows[i].Cells[0].Value ?? DBNull.Value; sqlCommand.Parameters["@IMEI"].Value = dgvCSV_Datei.Rows[i].Cells[1].Value ?? DBNull.Value; sqlCommand.Parameters["@Hersteller"].Value = dgvCSV_Datei.Rows[i].Cells[2].Value ?? DBNull.Value; sqlCommand.ExecuteNonQuery(); } sqlConnection.Close();
额外建议
- 建议使用
using语句自动管理数据库连接和命令的释放,避免资源泄漏:
using (SqlConnection sqlConnection = new SqlConnection("你的连接字符串")) { sqlConnection.Open(); using (SqlCommand sqlCommand = new SqlCommand()) { sqlCommand.Connection = sqlConnection; // 上面的修复代码放在这里 } }
- 尽量避免使用
AddWithValue,因为它可能导致类型推断错误,推荐明确指定参数类型(如示例中的SqlDbType.VarChar)。
内容的提问来源于stack exchange,提问作者Alexander Sutjagin
相关产品推荐
相关产品推荐

