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

时间:2015-12-12 18:41:58

标签: c# sql-server sqlcommand

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

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

尝试我可能无法找到一种方法来查看输出的原始XML,然后将其传递给从中创建新XPathDocument的方法。我对XmlReader对象所做的任何事情(例如尝试记录其内部内容)都会导致读者无法使用任何其他代码。

我正在寻找一些方法能够简单地记录来自命令的所有原始XML,以便在发生错误时我可以看到导致错误的确切XML,帮助我缩小搜索范围。< / p>

我已尝试克隆XmlReader,但SQL的结果包含多个结果集(它是一个带有多个return语句的存储过程)。使用stringbuilder将结果转换为字符串,然后尝试将该字符串转换回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);

1 个答案:

答案 0 :(得分:2)

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

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

因此,您需要从ADO.NET获取TextReader并从中创建XmlReader。我会使用SqlDataReader.GetTextReader