使用SQL Server中的XML类型列,在ADO.Net中将其读回XmlDocument
的最有效方法是什么?
对于此特定用途,随机访问加载的文档需要XmlDocument
。使用.Net 4.0(C#)和SQL Server 2008 R2。
最初,我们有一个返回结果集的存储过程。在调用SqlDataAdapter.Fill(DataTable)
以获取结果时,XML仅作为string
返回。
SqlDbType.Xml
的输出参数。执行后,结果输出参数同时具有.DbType
和.SqlDbType
DbType.Xml
- 但调用.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”上只有3个其他结果,而How to get XML data from a column in an SQL table?似乎它是最相关的结果,它希望解决另一个问题。)
这反过来相当简单:创建XmlDocument
,添加类型为SqlDbType.Xml
的输入参数,将XmlDocument
实例作为值传递 - 并完成。
我意识到我可以自己描述这些方法之间的差异 - 并且计划在时间可用时这样做。只是寻找可能已经有答案的人,或者可以提供一些我尚未考虑或我不熟悉的替代方案。
答案 0 :(得分:4)
无论你做出什么选择都应该使用XmlReader。不要强制SQL Server将XML序列化为文本格式。
更新
SQL Server以高效的二进制格式存储XML。 SqlXml.CreateReader从该二进制格式创建XmlNode对象。否则,必须将高效的XML序列化为字符串,并且必须再次对其进行解析。