可直接调用DataTable.GetChanges()获取变更行并用WriteXml()保存为XML;需确保已执行增删改操作且HasChanges()为true,Deleted行在XML中保留rowstate标记,null值默认输出。

可以直接调用 DataTable.GetChanges() 获取有变更的行,再用 WriteXml() 保存为 XML 文件或字符串。关键是要先确保 DataTable 启用了变更跟踪(默认开启),且数据确实发生了 Added、Modified 或 Deleted 操作。
确认 DataTable 有变更数据
DataTable 必须处于可跟踪状态,且已执行过增删改操作(如 Rows.Add()、Rows[i]["Col"] = xxx、Rows[i].Delete())。调用 GetChanges() 前建议检查:
-
if (dataTable.HasChanges())—— 避免对空变更集调用导致返回 null -
var changes = dataTable.GetChanges();—— 返回新 DataTable,只含变更行,原表不变 - 若只需特定类型变更,可传入
DataRowState枚举,例如GetChanges(DataRowState.Modified)
将变更数据写入 XML 文件
对 GetChanges() 返回的 DataTable 调用 WriteXml() 即可:
-
changes.WriteXml("changes.xml");—— 直接保存为文件(含 Schema) -
changes.WriteXml("changes.xml", XmlWriteMode.IgnoreSchema);—— 不写 Schema,仅数据 - 若需包含原始值(如 Modified 行的旧值),需手动设置
DataRowVersion.Original并配合自定义序列化,标准 WriteXml 默认只写当前值
获取变更 XML 字符串(内存中)
适合网络传输或日志记录:
- 用
StringWriter+XmlTextWriter(.NET Framework)或StringWriter+XmlWriter(.NET Core/5+) - 示例(.NET 6+):
var sw = new StringWriter();
changes.WriteXml(XmlWriter.Create(sw));
string xml = sw.ToString(); - 注意:
WriteXml()默认写入 Schema 和数据;如只要纯数据,加XmlWriteMode.WriteSchema参数控制
注意事项与常见问题
实际使用中容易忽略的点:
- Deleted 行在
GetChanges()结果中仍存在,但RowState == Deleted;WriteXml 会保留该状态标记(<row rowstate="Deleted">) - 如果 DataTable 没有主键,
WriteXml仍能输出,但某些工具解析变更时可能无法准确定位被删/改的行 - 修改后未调用
AcceptChanges(),下次GetChanges()仍会包含这些行;调用后变更历史清空 - XML 中的 null 值默认输出为
,需确保目标环境支持 XSI 命名空间










