从SQL Server中的XML类型列读取ADO.net中的XML的最有效方法?

时间:2012-01-19 21:44:06

标签: sql-server xml c#-4.0 ado.net

使用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.SqlDbType DbType.Xml - 但调用.Value会返回System.String类型。

可以对此调用.SqlValue,返回SqlTypes.SqlXml类型。在这里,我可以调用.Value - 只返回stringCreateReader - 返回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实例作为值传递 - 并完成。

我意识到我可以自己描述这些方法之间的差异 - 并且计划在时间可用时这样做。只是寻找可能已经有答案的人,或者可以提供一些我尚未考虑或我不熟悉的替代方案。

1 个答案:

答案 0 :(得分:4)

无论你做出什么选择都应该使用XmlReader。不要强制SQL Server将XML序列化为文本格式。


更新

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