【问题标题】:Best way to pass a huge xml parameter to stored procedure将巨大的 xml 参数传递给存储过程的最佳方法
【发布时间】:2015-04-08 13:34:41
【问题描述】:

实际上,我试图将一个巨大的Xml 传递给我的存储过程,但我总是得到一个输出of memory exception,因为我试图传递一个限制大小为2G 的string。那么有没有办法做到这样的事情。

【问题讨论】:

  • 您是否尝试过在您的 SP 参数中使用 XML 数据类型?
  • 我们讨论的规模有多大?
  • @AlexK。好吧,我的文件是为了 116 Mb,但是,在我使用 XmlDocument 加载它并尝试获取它的字符串以将其作为参数传递后,我得到了内存不足的异常
  • @KrishnrajRana 我尝试使用 SqlXml 类型
  • 能否将 xml 加载到临时表中,然后引用临时表 ID 作为 SP 的参数?

标签: c# sql-server xml stored-procedures


【解决方案1】:

不要使用XmlDocument - 将 DOM 完全加载到内存中需要大约 10 倍于源文档的内存量。

如果您需要在将文档传递给 SQL 之前对其进行操作,请使用 XmlReaderXmlWriterXDocument。这些将起作用,因为它们将进行流处理(特别是 XmlReader/XmlWriter,它们针对 XML 数据的只进读取进行了高度优化),而不是尝试一次加载整个文档及其 DOM(如 XmlDocument)。

从文件中加载格式良好的 XML:

command.Parameters.Add(new SqlParameter("@xmlParameterName", SqlDbType.Xml)
{
    Value = new SqlXml(XmlReader.Create("C:\\path\\to\\file.xml"));
});

从流中的 XML 数据加载

Stream s;
// XML is in this stream
command.Parameters.Add(new SqlParameter("@xmlParameterName", SqlDbType.Xml)
{
    Value = new SqlXml(XmlReader.Create(s));
});

从 XDocument 加载:

XDocument xd = XDocument.Load/.Parse/etc....
command.Parameters.Add(new SqlParameter("@xmlParameterName", SqlDbType.Xml)
{
    Value = new SqlXml(xd.Root.CreateReader());
});

【讨论】:

  • 不,我不需要对文档做任何修改,我唯一的要求是如何将此文档的内容传递给我的存储过程,请告诉我如何使用 xmlreader 来实现我需要
  • 已更新以添加一些示例。
  • 我尝试了您提供的所有示例,但总是遇到相同的错误,请看一下这张图片s2.postimg.org/75oink4i1/Capture.png
  • 在将其加载到 xmlReader 之后如何将其发送到我的存储过程
  • 我相信值得添加一个示例,说明如何在存储过程端使用传递的 xml。我想不通。我正在尝试使用xml SQL 数据类型,但它似乎总是为空。
【解决方案2】:

您是否尝试过使用 StringBuilder reference

【讨论】:

  • 好吧,即使您使用字符串生成器,也需要将其转换为字符串,然后您将面临同样的异常
  • 这是在正确的轨道上,但需要更多。 @MoezRebai,会有所不同,因为 XmlDocument 创建了一个内存 DOM 结构来描述文档。
猜你喜欢
  • 2010-10-19
  • 1970-01-01
  • 2016-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多