使用 XmlReader 检索数据

XmlReader 类是 Microsoft .NET Framework 类库的 System.Xml 命名空间的一部分。由于 XmlReader 类也提供对数据的快速、非缓存、只进访问,因而与 AdomdDataReader 类相似。如果不需要使用 CellSet 对象获取数据的内存中分析视图,则 XmlReader 对象将是检索 XML 数据工具(尤其是大量数据)的最佳选择。由于 XmlReader 用于传入数据,所以 XmlReader 在向调用方公开数据之前无需检索并缓存所有数据,如果使用 CellSet 对象将 XML for Analysis 响应转换为分析对象模型表示形式,则需要检索并缓存数据。

调用 AdomdCommand 对象的 ExecuteXmlReader 方法时,XmlReader 类提供对 ADOMD.NET 接收的 XML for Analysis 响应的直接访问。由于接收到的数据为原始 XML 数据,所以必须手动分析这些数据和元数据。检索数据结束后,应关闭 XmlReader 对象。

检索数据和元数据

若要使用 XmlReader 类检索数据,请按下列步骤操作:

  1. 创建对象的新实例。

    若要创建 XmlReader 类的新实例,请调用 AdomdCommand 对象的 ExecuteExecuteXmlReader 方法。

  2. 检索数据。

    在命令运行查询并返回 XmlReader 后,必须分析数据和元数据。XML 数据和元数据由 XML for Analysis 访问接口所使用的本机格式表示。对于大多数 XML for Analysis 访问接口,本机格式为 MDDataSet 格式。MDDataSet 格式以正确的格式提供单元集的数据和元数据。有关 MDDataSet 格式的详细信息,请参阅 XML for Analysis 规范。

  3. 关闭读取器。

    使用完 XmlReader 对象后,应始终调用 Close 方法。打开 XmlReader 后,XmlReader 将独占使用用于运行命令的 AdomdConnection 对象。您将无法使用该 AdomdConnection 运行任何命令,包括创建另一个 XmlReader 或 AdomdDataReader,直到您关闭原始的 XmlReader 为止。

从 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();
        }