如何仅保存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
相关产品推荐
相关产品推荐

