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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 08:45:33