【发布时间】:2012-02-14 13:36:29
【问题描述】:
对于 SQL Server 中的 XML 类型列,在 ADO.Net 中将其读回 XmlDocument 的最有效方法是什么?
对于这种特殊用途,需要一个XmlDocument 来随机访问加载的文档。使用 .Net 4.0 (C#) 和 SQL Server 2008 R2。
最初,我们有一个返回结果集的存储过程。调用SqlDataAdapter.Fill(DataTable) 获取结果时,XML 仅作为string 返回。
然后我将其更改为让 T-SQL 返回“XML”类型的输出参数,并在 .Net 中将其注册为SqlDbType.Xml 类型的输出参数。执行后,生成的输出参数同时具有DbType.Xml 的.DbType 和.SqlDbType - 但调用.Value 返回的类型为System.String。
我可以对此调用.SqlValue,它返回SqlTypes.SqlXml的类型。从这里,我可以调用它的.Value——它只返回一个string,或者CreateReader——它返回一个XmlReader。所以我可以使用它来填充XmlDocument 使用XmlDocument.Load(XmlReader)。
主要问题是 - 这样做有什么好处,还是我应该返回检索字符串 - 然后将其传递给 new XmlDocument().LoadXml(string)?使用SqlXml 方法是否允许XML 在SQL 和.Net 层之间更有效地传递——或者XML 是否只是作为字符串透明地“在线”传输?即使是后者,我猜SqlXml.CreateReader 方法可能更有效,因为包含整个 XML 结构的字符串永远不需要一次在内存中创建 - 并且现在计划使用它.
(或者,我正在研究使用SqlDataReader 及其GetSqlXml 方法。有趣的是,目前在“GetSqlXml”的 SO 上只有 3 个其他结果,而 How to get XML data from a column in an SQL table? 似乎是最相关的结果,它正在寻求解决不同的问题。)
反之亦然:创建XmlDocument,添加SqlDbType.Xml 类型的输入参数,传入XmlDocument 实例作为值 - 然后完成。
我意识到我可以自己分析这些方法之间的差异 - 并计划在有时间时这样做。只是寻找可能已经有答案的人,或者可以提供一些我尚未考虑或不熟悉的替代方案。
【问题讨论】:
-
无论您做出何种选择,都应使用
XmlReader。不要强制 SQL Server 将 XML 序列化为文本形式。 -
@JohnSaunders - 这是我的问题,你刚刚帮助澄清。使用
XmlReader是否会阻止 SQL 服务器必须序列化 XML(和 .Net 必须反序列化它)?或者这些 API 只是公开了不同的功能,而在 API 后面的工作方式相同? -
是的,确实如此。 SQL Server 以高效的二进制格式存储 XML。
SqlXml.CreateReader从该二进制格式创建 XmlNode 对象。否则,必须将高效的 XML 序列化为字符串,并在此之上再次解析。 -
@JohnSaunders - 请将您的 cmets 转换为我可以接受的答案。您可以包含的任何来源也将非常感谢您将来参考。谢谢!
标签: sql-server xml c#-4.0 ado.net