Recuperar datos mediante el objeto CellSet
Al recuperar datos analíticos, el objeto CellSet proporciona la máxima interactividad y flexibilidad. El objeto CellSet es una caché de datos y metadatos jerárquicos en memoria que conserva las dimensiones originales de los datos. El objeto CellSet también se puede recorrer en estado conectado o desconectado. Debido a la posibilidad de utilizarlo sin conexión, el objeto CellSet se puede usar para ver datos y metadatos en un orden cualquiera y proporciona el modelo de objetos más completo para la recuperación de datos. Dicha capacidad de uso sin conexión también hace que el objeto CellSet tenga la máxima sobrecarga y sea el modelo de objetos de recuperación de datos de ADOMD.NET más lento de rellenar.
Recuperar datos en estado conectado
Si desea utilizar el objeto CellSet para recuperar datos, siga estos pasos:
Crear una nueva instancia del objeto.
Para crear una nueva instancia del objeto CellSet, llame al método Execute o ExecuteCellSet del objeto AdomdCommand.
Identificar los metadatos.
Además de recuperar datos, ADOMD.NET también recupera metadatos para el objeto CellSet. Tan pronto como el comando haya ejecutado la consulta y devuelto un objeto CellSet, puede recuperar los metadatos a través de varios objetos. Estos metadatos son necesarios para que las aplicaciones cliente puedan interactuar con los datos del objeto CellSet y mostrarlos. Por ejemplo, muchas aplicaciones cliente proporcionan funcionalidad para explorar en profundidad una posición especificada en un objeto CellSet o mostrar de forma jerárquica sus posiciones secundarias.
En ADOMD.NET, las propiedades Axes y FilterAxis del objeto CellSet representan los metadatos de los ejes de consulta y segmentador, respectivamente, en el objeto CellSet devuelto. Ambas propiedades devuelven referencias a los objetos Axis que, a su vez, contienen las posiciones representadas en cada eje.
Cada objeto Axis contiene una colección de objetos Position que representan el conjunto de tuplas disponible para ese eje. Cada objeto Position representa una sola tupla que contiene uno o más miembros, representados por una colección de objetos Member.
Recuperar los datos desde la colección de objetos CellSet.
Además de recuperar metadatos, ADOMD.NET también recupera datos para el objeto CellSet. Tan pronto como el comando haya ejecutado la consulta y devuelto un objeto CellSet, puede recuperar los datos mediante la colección Cells de CellSet. Esta colección contiene los valores que se calculan para la intersección de todos los ejes de la consulta. Por lo tanto, hay varios indizadores para obtener acceso a cada intersección o celda. Para obtener una lista de indizadores, vea Item.
Ejemplo de recuperación de datos en estado conectado
En el ejemplo siguiente se realiza una conexión con el servidor local y, a continuación, se ejecuta un comando en la conexión. En el ejemplo se analizan los resultados con el modelo de objetos CellSet: los títulos (metadatos) de las columnas se recuperan del primer eje y los títulos (metadatos) de cada fila se recuperan del segundo eje; los datos en intersección se recuperan mediante la colección 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
}
Recuperar datos en estado desconectado
Al cargar XML devuelto por una consulta anterior, puede utilizar el objeto CellSet para proporcionar un completo método de exploración de datos analíticos sin necesidad de utilizar una conexión activa.
[!NOTA]
En estado desconectado, no están disponibles todas las propiedades de los objetos disponibles en el objeto CellSet. Para obtener más información, vea LoadXml.
Ejemplo de recuperación de datos en estado desconectado
El ejemplo siguiente es similar al ejemplo de metadatos y datos que se muestra anteriormente en este tema. Sin embargo, el comando del ejemplo siguiente se ejecuta con una llamada a ExecuteXmlReader y el resultado se devuelve como System.Xml.XmlReader. A continuación, el ejemplo rellena el objeto CellSet utilizando System.Xml.XmlReader con el método LoadXml. Aunque este ejemplo carga System.Xml.XmlReader de forma inmediata, puede almacenar en caché el XML que contiene el lector en un disco duro o transportar dichos datos a otra aplicación a través de cualquier medio antes de cargar los datos en un objeto CellSet.
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
}