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

如何仅保存DataGridView中的新增行与修改行?

只保存DataGridView中的新增/修改行到SQL数据库

你可以通过DataTable的GetChanges方法同时筛选出新增和修改的行,结合你的存储过程逻辑(自动判断插入/更新),就能实现只处理变更数据的需求,避免全量更新的性能问题。

优化后的完整保存代码

// 保存新增/修改行的方法
public void SaveChangedRows()
{
    // 同时获取新增和修改状态的行
    DataTable changeTable = dataTable.GetChanges(DataRowState.Added | DataRowState.Modified);
    
    // 无变更则直接返回,避免无效操作
    if (changeTable == null || changeTable.Rows.Count == 0)
        return;

    try
    {
        // 仅打开一次数据库连接,避免循环内重复创建连接
        DBConn.DBConnect();
        using (SqlCommand comm = new SqlCommand("SPName", DBConnection.conn))
        {
            comm.CommandType = CommandType.StoredProcedure;
            
            // 提前定义参数,循环内复用,减少对象创建开销
            comm.Parameters.Add("@ID", SqlDbType.VarChar); // 根据你的ID实际数据类型调整

            foreach (DataRow row in changeTable.Rows)
            {
                // 正确处理空值:用DBNull.Value适配SQL的空值规范
                comm.Parameters["@ID"].Value = row["ID"] == DBNull.Value ? DBNull.Value : row["ID"];
                
                comm.ExecuteNonQuery();
            }
        }

        // 提交变更到原始DataTable,标记行状态为已处理,避免下次重复提交
        dataTable.Merge(changeTable);
        dataTable.AcceptChanges();
    }
    catch (Exception ex)
    {
        // 这里添加异常处理逻辑,比如日志记录、用户提示等
        throw ex;
    }
    finally
    {
        // 确保数据库连接关闭(根据你的DBConn实现调整)
        if (DBConnection.conn != null && DBConnection.conn.State == ConnectionState.Open)
            DBConnection.conn.Close();
    }
}

关键说明

  • 精准筛选变更行:DataRowState.Added | DataRowState.Modified是核心,一次性拿到所有需要同步的行,无需遍历整个DataGridView。
  • 连接性能优化:把数据库连接的打开/关闭放在循环外,避免频繁创建销毁连接,大幅提升大数据量下的性能。
  • 参数复用:循环外定义参数,循环内仅更新值,减少不必要的对象实例化。
  • 空值规范处理:用DBNull.Value替代空字符串,匹配SQL的空值逻辑,确保存储过程的IF NOT EXISTS判断准确。
  • 避免重复提交:执行完成后调用AcceptChanges(),将DataTable中行的状态标记为Unchanged,防止下次重复处理同一批数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 02:30:50