开发机无法访问目标SQL Server,如何将跨环境存储过程返回的强类型DataSet转XmlDocument?
问题
我有一个工具方法,接收DataSet并返回XmlDocument实例:
public static XmlDocument Convert(DataSet ds) { XmlDocument xmlDocument = new XmlDocument(); xmlDocument.LoadXml(ds.GetXml()); return xmlDocument; }
需要在无法直接访问的目标SQL Server环境执行一个返回多表的复杂存储过程,得到带XSD schema定义的强类型DataSet后传入上述方法转换为XmlDocument用于分析。但开发机无法连接目标数据库,仅能在目标环境手动执行存储过程。请问该如何实现?
解决方案
步骤1:在目标环境导出含Schema的完整DataSet结果
强类型DataSet依赖结构匹配,必须同时导出数据和Schema信息,推荐两种方式:
方式A:临时控制台工具导出(更可靠)
在目标环境编写并运行极简控制台程序,执行存储过程后一次性导出带Schema的XML:
using System.Data; using System.Data.SqlClient; class Program { static void Main() { // 替换为目标环境的数据库连接字符串和存储过程名 string connString = "Server=目标服务器;Database=目标库;Integrated Security=True;"; string procName = "你的存储过程名"; using (SqlConnection conn = new SqlConnection(connString)) { SqlCommand cmd = new SqlCommand(procName, conn) { CommandType = CommandType.StoredProcedure }; // 若存储过程需要参数,添加参数: // cmd.Parameters.Add("@Param1", SqlDbType.VarChar).Value = "参数值"; SqlDataAdapter da = new SqlDataAdapter(cmd); // 使用强类型DataSet的名称初始化,确保结构匹配 DataSet ds = new DataSet("你的强类型DataSet名称"); da.Fill(ds); // 导出包含Schema的XML文件 ds.WriteXml(@"D:\StoredProc_Result_WithSchema.xml", XmlWriteMode.WriteSchema); } } }
运行后将生成的XML文件拷贝到开发机。
方式B:SSMS手动导出
- 执行存储过程后,右键结果表 → 将结果另存为,选择
XML(*.xml)格式保存数据 - 右键目标数据库 → 任务 → 生成脚本,选择存储过程返回的所有表生成Schema脚本;或直接从目标环境项目导出强类型DataSet对应的XSD文件到本地
步骤2:在开发机加载XML到强类型DataSet
确保项目中已包含强类型DataSet的XSD文件,然后加载XML:
// 实例化强类型DataSet var typedDataSet = new 你的强类型DataSet名称(); // 读取带Schema的XML,自动匹配结构 typedDataSet.ReadXml(@"C:\拷贝过来的结果文件.xml", XmlReadMode.ReadSchema);
若本地已有XSD文件,也可先加载Schema再读数据:
typedDataSet.ReadXmlSchema(@"你的强类型DataSet.xsd");再调用ReadXml()读取纯数据XML
步骤3:调用工具方法转换为XmlDocument
直接传入加载好的强类型DataSet即可:
XmlDocument xmlDoc = 你的工具类名.Convert(typedDataSet); // 后续对xmlDoc进行分析操作
注意事项
- 必须保证强类型DataSet的XSD结构与存储过程返回的表结构完全一致,否则会出现数据加载失败或类型不匹配
- 若存储过程有修改,需重新导出结果XML或更新本地XSD文件
- 导出XML时务必使用
XmlWriteMode.WriteSchema,否则无法还原DataSet的完整结构
内容的提问来源于stack exchange,提问作者FMFF
相关产品推荐
相关产品推荐

