Поделиться через


Получение данных с помощью объекта CellSet

Объект CellSet является наиболее интерактивным и гибким для целей извлечения аналитических данных. Объект CellSet является расположенным в памяти кэшем иерархических данных и метаданных, сохраняющим исходную размерность данных. Объект CellSet также можно просматривать в состоянии с установленным или отключенным соединением. Благодаря возможности работать в состоянии с отключенным соединением объект CellSet можно использовать для просмотра данных и метаданных в любом порядке, кроме того, он предоставляет наиболее полную модель объекта для получения данных. Из-за возможности работать в состоянии с отключенным соединением использование объекта CellSet ведет к наибольшим издержкам, он является наиболее медленной моделью объекта для получения данных в ADOMD.NET.

Извлечение данных в состоянии с установленным соединением

Чтобы получить данные с помощью объекта CellSet, выполните следующие действия.

  1. Создайте новый экземпляр объекта.

    Чтобы вызвать новый экземпляр объекта CellSet, необходимо вызвать метод Execute или ExecuteCellSet объекта AdomdCommand.

  2. Идентифицируйте метаданные.

    Помимо извлечения данных компонент ADOMD.NET также извлекает метаданные для набора ячеек. После выполнения командой запроса и возвращения объекта CellSet метаданные можно извлечь при помощи различных объектов. Клиентскому приложению эти метаданные необходимы для отображения и взаимодействия с данными набора ячеек. Например, многие клиентские приложения имеют функции для детализации или иерархического отображения дочерних позиций указанной позиции в наборе ячеек.

    В компоненте ADOMD.NET свойства Axes и FilterAxis объекта CellSet в возвращенном наборе ячеек представляют метаданные осей запроса и среза соответственно. Оба свойства возвращают ссылки на объекты Axis, которые, в свою очередь, содержат положения, представленные на каждой оси.

    Каждый объект Axis содержит коллекцию объектов Position, представляющую набор кортежей, доступных для этой оси. Каждый объект Position представляет один кортеж, который содержит один или несколько элементов, представленных коллекцией объектов Member.

  3. Извлечение данных из коллекции наборов строк.

    Помимо извлечения метаданных компонент ADOMD.NET также извлекает данные для набора ячеек. После выполнения командой запроса и возвращения объекта CellSet данные можно извлечь при помощи коллекции Cells объекта CellSet. Эта коллекция содержит значения, которые вычисляются для пересечения всех осей в запросе. Поэтому существует несколько индексаторов для доступа к каждому пересечению, или ячейке. Список индексаторов см. в разделе Item.

Пример извлечения данных в состоянии с установленным соединением

В следующем примере устанавливается соединение с локальными сервером, а затем выполняется команда для коллекции. Синтаксический анализ результатов в примере выполняется при помощи модели объектов CellSet: заголовки (метаданные) для столбцов извлекаются из первой оси, заголовки (метаданные) для каждой строки извлекаются из второй строки, а пересекающиеся данных извлекаются при помощи коллекции Cells.

string ReturnCommandUsingCellSet()
{
    //Create a new string builder to store the results
    System.Text.StringBuilder result = new System.Text.StringBuilder();

    //Connect to the local server
    using (AdomdConnection conn = new AdomdConnection("Data Source=localhost;"))
    {
        conn.Open();

        //Create a command, using this connection
        AdomdCommand cmd = conn.CreateCommand();
        cmd.CommandText = @"
                      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]";

        //Execute the query, returning a cellset
        CellSet cs = cmd.ExecuteCellSet();

        //Output the column captions from the first axis
        //Note that this procedure assumes a single member exists per column.
        result.Append("\t");
        TupleCollection tuplesOnColumns = cs.Axes[0].Set.Tuples;
        foreach (Tuple column in tuplesOnColumns)
        {
            result.Append(column.Members[0].Caption + "\t");
        }
        result.AppendLine();

        //Output the row captions from the second axis and cell data
        //Note that this procedure assumes a two-dimensional cellset
        TupleCollection tuplesOnRows = cs.Axes[1].Set.Tuples;
        for (int row = 0; row < tuplesOnRows.Count; row++)
        {
            result.Append(tuplesOnRows[row].Members[0].Caption + "\t");
            for (int col = 0; col < tuplesOnColumns.Count; col++)
            {
                result.Append(cs.Cells[col, row].FormattedValue + "\t");
            }
            result.AppendLine();
        }
        conn.Close();

        return result.ToString();
    } // using connection
}

Извлечение данных в состоянии с отключенным соединением

Объект CellSet можно использовать для предоставления полного метода обзора аналитических данных, не требующего наличия активного соединения, путем загрузки XML, возвращенного от предыдущего запроса.

ПримечаниеПримечание

При отключенном состоянии можно использовать не все свойства объектов, доступных из объекта CellSet. Дополнительные сведения см. в разделе LoadXml.

Пример извлечения данных в состоянии с отключенным соединением

Следующий пример похож на примеры с метаданными и данными, приведенные ранее в этом разделе. Однако в следующем примере команда выполняется с вызовом метода ExecuteXmlReader, а результат возвращается в виде System.Xml.XmlReader. Затем в примере объект CellSet заполняется при помощи этого System.Xml.XmlReader с использованием метода LoadXml. Несмотря на то, что в этом примере System.Xml.XmlReader загружается мгновенно, XML, содержащийся в модуле чтения, можно кэшировать на жесткий диск или переместить эти данные в другое приложение с использованием любых средств перед загрузкой данных в набор строк.

string DemonstrateDisconnectedCellset()
{
    //Create a new string builder to store the results
    System.Text.StringBuilder result = new System.Text.StringBuilder();

    //Connect to the local server
    using (AdomdConnection conn = new AdomdConnection("Data Source=localhost;"))
    {
        conn.Open();

        //Create a command, using this connection
        AdomdCommand cmd = conn.CreateCommand();
        cmd.CommandText = @"
                      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]";


        //Execute the query, returning an XmlReader
        System.Xml.XmlReader x = cmd.ExecuteXmlReader();

        //At this point, the XmlReader could be stored on disk,
        //transmitted, modified, cached, or otherwise manipulated

        //Load the CellSet with the specified XML
        CellSet cs = CellSet.LoadXml(x);

        //Now that the XmlReader has finished being read
        //we can close it and the connection, while the
        //CellSet can continue being used.
        x.Close();
        conn.Close();

        //Output the column captions from the first axis
        //Note that this procedure assumes a single member exists per column.
        result.Append("\t");
        TupleCollection tuplesOnColumns = cs.Axes[0].Set.Tuples;
        foreach (Tuple column in tuplesOnColumns)
        {
            result.Append(column.Members[0].Caption + "\t");
        }
        result.AppendLine();

        //Output the row captions from the second axis and cell data
        //Note that this procedure assumes a two-dimensional cellset
        TupleCollection tuplesOnRows = cs.Axes[1].Set.Tuples;
        for (int row = 0; row < tuplesOnRows.Count; row++)
        {
            result.Append(tuplesOnRows[row].Members[0].Caption + "\t");
            for (int col = 0; col < tuplesOnColumns.Count; col++)
            {
                result.Append(cs.Cells[col, row].FormattedValue + "\t");
            }
            result.AppendLine();
        }

        return result.ToString();
    } // using connection
}