是否有记录从SqlCommand.ExecuteXmlReader返回的原始XML的方法

本文关键字:原始 XML 方法 返回 ExecuteXmlReader 记录 SqlCommand 是否 | 更新日期: 2023-09-27 18:26:30

我正在维护一个遗留应用程序,该应用程序在首次执行一系列查询时,在某些情况下会显示暂时错误。

应用程序使用SqlCommand.ExecuteXmlReader,后者返回XmlReader对象。当错误发生时,它包含无效的XML,并且应用程序抛出异常。

尽管我可能会尝试,但在将输出传递给从中创建新XPathDocument的方法之前,我找不到查看输出的原始XML的方法。我对XmlReader对象所做的任何操作(例如尝试记录其内部内容)都会导致任何进一步的代码都无法使用读取器。

我正在寻找一种方法,可以简单地记录来自命令的所有原始XML,这样当错误发生时,我可以看到导致错误的确切XML,帮助我缩小搜索范围。

我尝试过克隆XmlReader,但SQL的结果包含多个结果集(它是一个包含多个返回语句的存储过程)。使用字符串生成器将结果转换为字符串,然后尝试将该字符串转换回XmlReader会导致异常,因为存在多个根节点。

有什么简单的解决方案吗?

//execute the command
var xmlReader = sqlCommand.ExecuteXmlReader();
var xpathDoc = new XPathDocument(xmlReader); //<--exception thrown here

我真正想做的是:

var xmlReader = sqlCommand.ExecuteXmlReader();
LogXmlResults(xmlReader);
var xpathDoc = new XPathDocument(xmlReader);

是否有记录从SqlCommand.ExecuteXmlReader返回的原始XML的方法

您的XML包含无效字符。由于某种原因,XML被定义为即使在编码形式中也不允许某些字符。这对我来说从来没有意义。

解决方案似乎是您需要自己创建XmlReader,并将CheckCharacters选项设置为false

所以你需要从ADO.NET中获得一个TextReader,并从中创建一个XmlReader。我会使用SqlDataReader.GetTextReader