我正在维护一个遗留应用程序,它会在第一次执行一系列查询时在某些情况下显示暂时性错误。
应用程序使用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);
答案 0 :(得分:2)
您的XML包含无效字符。由于某种原因,XML被定义为即使在编码形式中也不允许某些字符。这从来没有对我有意义。
解决方案似乎是您需要自己创建XmlReader
并将CheckCharacters
选项设置为false
。
因此,您需要从ADO.NET获取TextReader
并从中创建XmlReader
。我会使用SqlDataReader.GetTextReader
。