2015-12-12 15 views
1

我正在維護一個遺留應用程序,該應用程序會在第一次執行一系列查詢時在某些情況下顯示暫時錯誤。是否有方法記錄從SqlCommand.ExecuteXmlReader返回的原始XML?

該應用程序使用SqlCommand.ExecuteXmlReader,它返回一個XmlReader對象。當錯誤發生時,這包含無效的XML,並且應用程序引發異常。

試試我可能無法找到一種方法來查看輸出的原始XML,然後將其傳遞給從其創建新的XPathDocument的方法。我對XmlReader對象所做的任何事情(例如嘗試記錄其內容)都會導致讀者無法使用任何其他代碼。

我正在尋找一些方法能夠簡單地記錄來自命令的所有原始XML,以便在發生錯誤時我可以看到導致錯誤的確切XML,幫助我縮小搜索範圍。

我試過克隆XmlReader,但是來自SQL的結果包含多個結果集(這是一個存儲過程與多個返回語句)。使用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

發佈例外。另外,我認爲你只是在字符串/ xml轉換中存在一個錯誤。也許你將多個結果集附加到同一個字符串? – usr

+0

例外是十六進制字符x無效。但角色可以在錯誤之間改變。他們經常表現爲中文字。回到我的開發電腦時,可以發佈特定的異常。 –

回答

2

你的XML無效字符。由於某些原因,XML被定義爲不允許某些字符,即使是編碼形式。這對我來說沒有意義。

解決方案似乎是您需要自己創建XmlReader,並將CheckCharacters選項設置爲false

因此,您需要從ADO.NET獲取TextReader,並從中創建一個XmlReader。我會使用SqlDataReader.GetTextReader

+0

感謝@usr - 這絕對是指向正確的方向。我結束了調用'sqlCommand.ExecuteReader()'然後遍歷結果(存儲過程返回多個記錄集)並將結果附加到一個字符串構建器。然後,我們創建了一個新的'XmlReader',正如你所建議的'CheckCharacters'設置爲'false','ConformanceLevel'設置爲'ConformanceLevel.Fragment'。從那以後沒有看到過這個問題。 –

相關問題