Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Ao recuperar dados analíticos, o CellSet objeto oferece a maior interatividade e flexibilidade. O CellSet objeto é uma cache em memória de dados hierárquicos e metadados que mantém a dimensionalidade original dos dados. O CellSet objeto também pode ser percorrido em estado conectado ou desconectado. Devido a esta capacidade de desconexão, o CellSet objeto pode ser usado para visualizar dados e metadados em qualquer ordem e fornece o modelo de objeto mais abrangente para recuperação de dados. Esta capacidade desconectada também faz com que o CellSet objeto tenha maior sobrecarga e seja o modelo de objeto de recuperação de dados ADOMD.NET mais lento a preencher.
Recuperação de Dados num Estado Ligado
Para usar o CellSet objeto para recuperar dados, segue estes passos:
Crie uma nova instância do objeto.
Para criar uma nova instância do objeto CellSet, chama-se o método Execute ou ExecuteCellSet do objeto AdomdCommand.
Identificar metadados.
Além de recuperar dados, ADOMD.NET também recupera metadados do conjunto de células. Assim que o comando executar a consulta e devolver um CellSet, pode recuperar os metadados através de vários objetos. Estes metadados são necessários para que as aplicações dos clientes exibam e interajam com os dados do conjunto de células. Por exemplo, muitas aplicações cliente fornecem funcionalidade de exploração detalhada ou exibição hierárquica das posições filhas de uma posição específica num conjunto de células.
Em ADOMD.NET, as Axes e FilterAxis propriedades do CellSet objeto representam os metadados dos eixos da consulta e do slicer, respetivamente, no conjunto de células devolvidas. Ambas as propriedades retornam referências a Axis objetos, que por sua vez contêm as posições representadas em cada eixo.
Cada Axis objeto contém uma coleção de Position objetos que representam o conjunto de tuplas disponíveis para esse eixo. Cada Position objeto representa uma única tupla que contém um ou mais membros, representada por uma coleção de Member objetos.
Recuperar dados da coleção de cellset.
Além de recuperar metadados, ADOMD.NET também recupera dados para o conjunto de células. Assim que o comando executar a consulta e devolver um CellSet, poderá recuperar os dados usando a coleção Cells do CellSet. Esta coleção contém os valores que são calculados para a interseção de todos os eixos na consulta. Por isso, existem vários indexadores para aceder a cada interseção ou célula. Para uma lista de indexadores, veja Item[].
Exemplo de recuperação de dados num estado conectado
O exemplo seguinte cria uma ligação ao servidor local e depois executa um comando nessa ligação. O exemplo analisa os resultados usando o modelo de objetos CellSet : as legendas (metadados) das colunas são recuperadas do primeiro eixo, e as legendas (metadados) de cada linha são recuperadas do segundo eixo, e os dados que se cruzam são recuperados usando a Cells coleção.
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
}
Recuperação de Dados num Estado Desconectado
Ao carregar XML devolvido de uma consulta anterior, pode usar o CellSet objeto para fornecer um método abrangente de navegação em dados analíticos sem necessidade de uma ligação ativa.
Observação
Nem todas as propriedades dos objetos disponíveis a partir do CellSet objeto estão disponíveis enquanto estão num estado desconectado. Para obter mais informações, consulte LoadXml.
Exemplo de recuperação de dados num estado desconectado
O exemplo seguinte é semelhante ao exemplo de metadados e dados mostrado anteriormente neste tópico. No entanto, o comando no exemplo seguinte executa-se com uma chamada para ExecuteXmlReader, e o resultado é devolvido como um System.Xml.XmlReader. O exemplo preenche então o CellSet objeto usando este System.Xml.XmlReader com o LoadXml método. Embora este exemplo carregue imediatamente o System.Xml.XmlReader , pode armazenar em cache o XML contido pelo leitor para um disco rígido ou transportar esses dados para outra aplicação por qualquer meio antes de carregar os dados num conjunto de células.
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
}