【问题标题】:Most efficient way to read XML in ADO.net from XML type column in SQL server?从 SQL Server 中的 XML 类型列读取 ADO.net 中的 XML 的最有效方法?
【发布时间】: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


【解决方案1】:

无论您做出何种选择,都应使用 XmlReader。不要强制 SQL Server 将 XML 序列化为文本形式。


更新:

SQL Server 以高效的二进制格式存储 XML。 SqlXml.CreateReader 从该二进制格式创建 XmlNode 对象。否则,必须将高效的 XML 序列化为字符串,然后再对其进行解析。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-01
    • 1970-01-01
    • 2011-04-10
    相关资源
    最近更新 更多