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

如何将DataGridView所有数据插入MySQL?当前仅插入一行数据

嘿,我之前也踩过这个坑!你现在只插入一行数据,大概率是没正确遍历DataGridView的所有行,或者循环里的SQL命令/参数处理有问题。咱们一步步来解决:

问题根源

通常只插入一行的原因不外乎这几个:

  • 代码只处理了DataGridView的第一行,没写循环遍历所有行
  • 循环里没有重置SQL命令的参数,导致后续行用了第一行的参数
  • 不小心把ExecuteNonQuery()放在了循环外面,只执行了一次
解决方案

下面给你两种常用的实现方式,根据你的数据量选就行:

方式1:逐行插入(适合少量数据)

这种方式逻辑简单,容易调试,适合数据行数不多的场景:

private void btnInsertToMySQL_Click(object sender, EventArgs e)
{
    // 替换成你的MySQL连接字符串
    string connString = "server=localhost;database=your_db_name;user=root;password=your_password;";
    
    // 使用using语句自动管理连接,避免资源泄漏
    using (MySqlConnection conn = new MySqlConnection(connString))
    {
        conn.Open();
        
        // 参数化SQL语句(一定要用参数化,防止SQL注入+避免格式错误)
        // 注意:把pig_records换成你的实际表名,字段名也要和数据库对应
        string insertSql = @"INSERT INTO pig_records 
                             (pig_id, weight, price, flavor, f_fee, internal_col) 
                             VALUES (@PigID, @Weight, @Price, @Flavor, @FFee, @Internal)";
        
        // 遍历DataGridView的每一行
        foreach (DataGridViewRow row in dataGridView2.Rows)
        {
            // 跳过DataGridView自带的空新行(如果开启了允许添加新行的话)
            if (row.IsNewRow) continue;
            
            // 每次循环创建新的Command,避免参数累积
            using (MySqlCommand cmd = new MySqlCommand(insertSql, conn))
            {
                // 给参数赋值,注意根据数据库字段类型做类型转换
                // 可以加空值判断,避免空值报错,比如:row.Cells["Pig ID"].Value ?? ""
                cmd.Parameters.AddWithValue("@PigID", row.Cells["Pig ID"].Value?.ToString() ?? "");
                cmd.Parameters.AddWithValue("@Weight", Convert.ToDecimal(row.Cells["Weight"].Value ?? 0));
                cmd.Parameters.AddWithValue("@Price", Convert.ToDecimal(row.Cells["Price"].Value ?? 0));
                cmd.Parameters.AddWithValue("@Flavor", row.Cells["Flavor"].Value?.ToString() ?? "");
                cmd.Parameters.AddWithValue("@FFee", Convert.ToDecimal(row.Cells["F-Fee"].Value ?? 0));
                cmd.Parameters.AddWithValue("@Internal", row.Cells["Internal"].Value?.ToString() ?? "");
                
                // 执行当前行的插入
                cmd.ExecuteNonQuery();
            }
        }
        
        MessageBox.Show("所有数据插入成功!");
    }
}

方式2:批量插入(适合大量数据)

如果DataGridView里有几百上千行数据,逐行插入效率太低,用MySqlBulkCopy批量插入会快很多:

private void btnBulkInsert_Click(object sender, EventArgs e)
{
    string connString = "server=localhost;database=your_db_name;user=root;password=your_password;";
    
    // 先把DataGridView的数据转成DataTable
    DataTable dataTable = new DataTable();
    foreach (DataGridViewColumn col in dataGridView2.Columns)
    {
        dataTable.Columns.Add(col.Name);
    }
    
    foreach (DataGridViewRow row in dataGridView2.Rows)
    {
        if (row.IsNewRow) continue;
        DataRow dtRow = dataTable.NewRow();
        foreach (DataGridViewCell cell in row.Cells)
        {
            // 处理空值,避免DBNull报错
            dtRow[cell.ColumnIndex] = cell.Value ?? DBNull.Value;
        }
        dataTable.Rows.Add(dtRow);
    }
    
    using (MySqlConnection conn = new MySqlConnection(connString))
    {
        conn.Open();
        using (MySqlBulkCopy bulkCopy = new MySqlBulkCopy(conn))
        {
            // 目标数据库表名
            bulkCopy.DestinationTableName = "pig_records";
            
            // 如果DataGridView列名和数据库列名不一致,需要手动映射
            // 格式:DataGridView列名 -> 数据库列名
            bulkCopy.ColumnMappings.Add("Pig ID", "pig_id");
            bulkCopy.ColumnMappings.Add("Weight", "weight");
            bulkCopy.ColumnMappings.Add("Price", "price");
            bulkCopy.ColumnMappings.Add("Flavor", "flavor");
            bulkCopy.ColumnMappings.Add("F-Fee", "f_fee");
            bulkCopy.ColumnMappings.Add("Internal", "internal_col");
            
            // 执行批量插入
            bulkCopy.WriteToServer(dataTable);
        }
        MessageBox.Show("批量插入成功!");
    }
}
常见避坑点
  • 一定要跳过空新行:DataGridView默认会在最后一行显示空行(允许用户添加新数据),这行不需要插入,判断row.IsNewRow即可跳过。
  • 用参数化查询:不要直接拼接字符串,否则容易出现SQL注入,还会因为特殊字符、数字格式导致插入失败。
  • 处理空值:如果单元格可能为空,一定要加空值判断(比如??运算符),避免转换类型时抛出异常。
  • 不要重复使用同一个Command的参数:如果把Command放在循环外面,每次循环要清空cmd.Parameters.Clear()再添加新参数,否则参数会累积导致错误。

内容的提问来源于stack exchange,提问作者Lee Jun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:31:25