使用 XmlReader 擷取資料

XmlReader 類別是 .NET Framework 類別函式庫 System.Xml 命名空間的一部分,與該AdomdDataReader類別相似。 這兩種類別都提供快速、未快取且僅向前的資料存取。 如果你不需要透過物件 CellSet 取得記憶體內的分析視圖, XmlReader 物件非常適合用來擷取 XML 資料,尤其是大量資料。 由於 XmlReader 會以串流方式處理資料,因此不必先擷取並快取所有資料,再將資料提供給呼叫端。 相較之下,若使用 CellSet 物件將 XML for Analysis 回應轉換為分析物件模型表示,則必須等待所有資料快取完成。

XmlReader 類別提供直接存取 ADOMD.NET 在呼叫ExecuteXmlReader物件的AdomdCommand方法時收到的 XML for Analysis 回應。 由於擷取的資料是原始 XML,你必須手動解析資料和元資料。 資料一取得, XmlReader 物件應立即關閉。

資料與元資料擷取

要透過類別 XmlReader 取得資料,請依照以下步驟操作:

  1. 建立一個新的物件實例。

    在 ExecuteXmlReader 物件上呼叫 Execute 或 AdomdCommand 方法,以建立 XmlReader 執行個體。

  2. 取回資料。

    指令執行查詢並回傳 XmlReader 後,解析資料與元資料。 XML 資料與元資料皆採用 XML for Analysis 提供者所使用的原生格式。 對大多數分析提供者的 XML 來說,原生格式為 MDDataSet 格式。 MDDataSet 格式以良好的結構格式提供細胞集的資料與元資料。 欲了解更多關於 MDDataSet 格式的資訊,請參閱 XML for Analysis 規範。

  3. 關閉閱讀器。

    當你用完 XmlReader 物件後,再呼叫這個Close方法。 當 XmlReader 開啟時,它獨佔執行該指令的 AdomdConnection 物件。 在您關閉原始的 XmlReader 之前,無法使用該 <`xref:Microsoft.AnalysisServices.AdomdClient.AdomdConnection>` 執行任何命令,包括建立另一個 XmlReader 或 AdomdDataReader。

從 XmlReader 擷取資料

以下範例執行指令,以 XmlReader 格式擷取資料,並將內容寫入主控台。

        void OutputDataWithXML()
        {
            //Open a connection to the local server.
            AdomdConnection conn = new AdomdConnection("Data Source=localhost");
            conn.Open();

            //Create a command to retrieve the data.
            AdomdCommand cmd = new AdomdCommand(@"WITH MEMBER [Measures].[FreightCostPerOrder] AS 
[Measures].[Reseller Freight Cost]/[Measures].[Reseller Order Quantity],  
FORMAT_STRING = 'Currency'

SELECT [Geography].[Geography].[Country].&[United States].Children ON ROWS, 
[Date].[Calendar].[Calendar Year] ON COLUMNS
FROM [Adventure Works]
WHERE [Measures].[FreightCostPerOrder]", conn);

            //Execute the command, retrieving an XmlReader.
            System.Xml.XmlReader reader = cmd.ExecuteXmlReader();

            //Do something with the reader: Parse data, Parse metadata,
            //                              Save for later loading into CellSet, etc.
            Console.WriteLine(reader.ReadOuterXml());

            //Close the reader, then the connection
            reader.Close();
            conn.Close();

            //Await user input.
            Console.ReadLine();
        }