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

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

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

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

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

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

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

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

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

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

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

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

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

В следующем примере устанавливается соединение с локальными сервером, а затем выполняется команда для коллекции. В примере выполняется анализ результатов с помощью объектной модели набора ячеек : заголовки (метаданные) для столбцов извлекаются из первой оси, а заголовки (метаданные) для каждой строки извлекаются из второй оси, а пересечение данных извлекается с помощью 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
}

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

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

Примечание

Не все свойства объектов, доступных из 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
}