C#按筛选条件修改数据集行后无法保存,求助技术解决方案
解决DataRow修改后无法保存的问题
看起来你遇到的问题是修改DataSet中的行数据后,这些更改没能同步到数据库里对吧?我来帮你拆解下问题所在,以及怎么修复:
问题根源分析
你写的两种写法都存在一个关键问题:过早调用了AcceptChanges()。这个方法会把DataRow的状态从Modified改成Unchanged,相当于告诉DataSet“这些修改已经确认完成”,但实际上你还没把这些更改同步到数据库。后续当你想用DataAdapter更新数据库时,它会因为找不到状态为Modified的行,直接跳过更新操作。
另外,第二种写法里的Select语句如果nsuc或bod是字符串类型的话,还会触发语法错误(没给字符串值加单引号),不过看你之前的代码里是转成int处理,应该是数值类型,这个暂时没问题,但还是要记下来避免踩坑。
修复步骤
1. 移除AcceptChanges()的提前调用
先把代码里的dr.AcceptChanges()和rowp.AcceptChanges()都删掉,让DataRow保持Modified状态,这样DataAdapter才能识别出哪些行需要更新。
2. 用DataAdapter同步更改到数据库
修改完所有符合条件的行之后,必须调用你用来填充DataSet的DataAdapter的Update()方法,把DataSet里的变化提交到数据库。
修正后的代码示例
第一种遍历写法的修正:
foreach(DataRow dr in datosingDataSet.Tables["inve"].Rows) // 遍历整张表 { cc = Convert.ToInt32(dr["nsuc"].ToString()); ff = Convert.ToInt32(dr["bod"].ToString()); if (cc == csuc && ff == bod) // 筛选条件匹配 { MessageBox.Show("** SI SE HACE LA CONSULTA**", "ERROR"); dr["estado"] = "AP"; // 修改字段值 // 不要在这里调用AcceptChanges() // break; 是否终止遍历按需选择 } } // 遍历完成后,用DataAdapter将更改同步到数据库 // 假设你的DataAdapter实例名为inveDataAdapter inveDataAdapter.Update(datosingDataSet, "inve"); // 最后可以调用AcceptChanges确认所有更改(可选,根据业务需求决定) datosingDataSet.Tables["inve"].AcceptChanges();
第二种Select写法的修正:
foreach(DataRow rowp in datosingDataSet.inve.Select("nsuc = " + csuc + " and bod = " + bod)) { rowp["estado"] = "AP"; // 不要在这里调用AcceptChanges() } // 同步更改到数据库 inveDataAdapter.Update(datosingDataSet, "inve"); datosingDataSet.Tables["inve"].AcceptChanges();
额外注意事项
- 确保你的DataAdapter已经正确配置了
UpdateCommand,这样它才能生成正确的SQL更新语句。如果是手动配置的,要保证UpdateCommand包含正确的WHERE条件和要更新的字段。 - 如果
nsuc或bod是字符串类型,Select语句里要给值加单引号,比如:"nsuc = '" + csuc + "' and bod = '" + bod + "'",不过更推荐用Linq查询来避免SQL注入风险,示例如下:
var targetRows = from DataRow r in datosingDataSet.inve.Rows where r.Field<string>("nsuc") == csuc && r.Field<string>("bod") == bod select r; foreach (var row in targetRows) { row["estado"] = "AP"; }
内容的提问来源于stack exchange,提问作者Cesar Ivan Ardila Vega
相关产品推荐
相关产品推荐

