C#如何将DataTable的变更(Changes)保存为XML

发布时间 - 2026-01-28 00:00:00    点击率:
可直接调用DataTable.GetChanges()获取变更行并用WriteXml()保存为XML;需确保已执行增删改操作且HasChanges()为true,Deleted行在XML中保留rowstate标记,null值默认输出。

可以直接调用 DataTable.GetChanges() 获取有变更的行,再用 WriteXml() 保存为 XML 文件或字符串。关键是要先确保 DataTable 启用了变更跟踪(默认开启),且数据确实发生了 AddedModifiedDeleted 操作。

确认 DataTable 有变更数据

DataTable 必须处于可跟踪状态,且已执行过增删改操作(如 Rows.Add()Rows[i]["Col"] = xxxRows[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 会保留该状态标记(
  • 如果 DataTable 没有主键,WriteXml 仍能输出,但某些工具解析变更时可能无法准确定位被删/改的行
  • 修改后未调用 AcceptChanges(),下次 GetChanges() 仍会包含这些行;调用后变更历史清空
  • XML 中的 null 值默认输出为 ,需确保目标环境支持 XSI 命名空间


# 工具  # 常见问题  # c#  # .net  # String  # NULL  # if  # xml  # 字符串  # var  # delete  # 保存为  # 只需  # 自定义  # 要先  # 再用  # 可直接  # 仍能  # 清空  # 不写  # 仍会 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】  如何快速生成专业多端适配建站电话?  如何快速搭建二级域名独立网站?  WordPress 子目录安装中正确处理脚本路径的完整指南  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  Laravel怎么在Controller之外的地方验证数据  JavaScript如何实现倒计时_时间函数如何精确控制  公司网站制作需要多少钱,找人做公司网站需要多少钱?  如何构建满足综合性能需求的优质建站方案?  JS中对数组元素进行增删改移的方法总结  如何在服务器上三步完成建站并提升流量?  网站制作价目表怎么做,珍爱网婚介费用多少?  浅谈redis在项目中的应用  Python函数文档自动校验_规范解析【教程】  linux写shell需要注意的问题(必看)  Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】  Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权  html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】  jquery插件bootstrapValidator表单验证详解  黑客如何利用漏洞与弱口令入侵网站服务器?  详解Android——蓝牙技术 带你实现终端间数据传输  在centOS 7安装mysql 5.7的详细教程  Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言  Linux系统运维自动化项目教程_Ansible批量管理实战  Laravel用户密码怎么加密_Laravel Hash门面使用教程  php做exe能调用系统命令吗_执行cmd指令实现方式【详解】  黑客入侵网站服务器的常见手法有哪些?  Linux系统命令中tree命令详解  网站制作免费,什么网站能看正片电影?  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  如何快速打造个性化非模板自助建站?  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】  Laravel如何实现用户注册和登录?(Auth脚手架指南)  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  Android 常见的图片加载框架详细介绍  制作旅游网站html,怎样注册旅游网站?  Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】  Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  如何快速登录WAP自助建站平台?  HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】  为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】  Laravel如何处理CORS跨域请求?(配置示例)  Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤  Laravel怎么解决跨域问题_Laravel配置CORS跨域访问  三星网站视频制作教程下载,三星w23网页如何全屏?  如何在 React 中条件性地遍历数组并渲染元素  Laravel怎么自定义错误页面_Laravel修改404和500页面模板  微信小程序 配置文件详细介绍