Usar un conjunto de datos externo con Reporting Services
El objeto DataSet es esencial para admitir escenarios de datos desconectados y distribuidos con ADO.NET. El objeto DataSet es una representación residente en memoria de los datos que proporciona un modelo de programación relacional coherente independiente del origen de datos. Se puede utilizar con varios orígenes de datos diferentes, con datos XML, o para administrar los datos local de la aplicación. El objeto DataSet representa un conjunto completo de datos, incluidas las tablas relacionadas, las restricciones y las relaciones entre las tablas. Debido a la versatilidad del objeto DataSet para almacenar y exponer los datos, estos se pueden procesar y transformar a menudo en un objeto DataSet antes de que se produzca cualquier notificación en ellos.
Con las extensiones de procesamiento de datos de Reporting Services, puede integrar cualquier objeto DataSet personalizado que creen las aplicaciones externas. Para lograr esto, se crea una extensión de procesamiento de datos personalizada en Reporting Services que actúa como puente entre el objeto DataSet y el servidor de informes. La mayor parte del código para procesar este objeto DataSet está contenido en la clase DataReader que crea.
El primer paso para exponer el objeto DataSet en el servidor de informes es implementar un método específico del proveedor en la clase DataReader que pueda rellenar un objeto DataSet. En el ejemplo siguiente se muestra cómo cargar los datos estáticos en un objeto DataSet utilizando un método específico del proveedor en su clase DataReader.
'Private members of the DataReader class
Private m_dataSet As System.Data.DataSet
Private m_currentRow As Integer
'Method to create a dataset
Friend Sub CreateDataSet()
' Create a dataset.
Dim ds As New System.Data.DataSet("myDataSet")
' Create a data table.
Dim dt As New System.Data.DataTable("myTable")
' Create a data column and set various properties.
Dim dc As New System.Data.DataColumn()
dc.DataType = System.Type.GetType("System.Decimal")
dc.AllowDBNull = False
dc.Caption = "Number"
dc.ColumnName = "Number"
dc.DefaultValue = 25
' Add the column to the table.
dt.Columns.Add(dc)
' Add 10 rows and set values.
Dim dr As System.Data.DataRow
Dim i As Integer
For i = 0 To 9
dr = dt.NewRow()
dr("Number") = i + 1
' Be sure to add the new row to the DataRowCollection.
dt.Rows.Add(dr)
Next i
' Fill the dataset.
ds.Tables.Add(dt)
' Use a private variable to store the dataset in your
' DataReader.
m_dataSet = ds
' Set the current row to -1.
m_currentRow = - 1
End Sub 'CreateDataSet
// Private members of the DataReader class
private System.Data.DataSet m_dataSet;
private int m_currentRow;
// Method to create a dataset
internal void CreateDataSet()
{
// Create a dataset.
System.Data.DataSet ds = new System.Data.DataSet("myDataSet");
// Create a data table.
System.Data.DataTable dt = new System.Data.DataTable("myTable");
// Create a data column and set various properties.
System.Data.DataColumn dc = new System.Data.DataColumn();
dc.DataType = System.Type.GetType("System.Decimal");
dc.AllowDBNull = false;
dc.Caption = "Number";
dc.ColumnName = "Number";
dc.DefaultValue = 25;
// Add the column to the table.
dt.Columns.Add(dc);
// Add 10 rows and set values.
System.Data.DataRow dr;
for(int i = 0; i < 10; i++)
{
dr = dt.NewRow();
dr["Number"] = i + 1;
// Be sure to add the new row to the DataRowCollection.
dt.Rows.Add(dr);
}
// Fill the dataset.
ds.Tables.Add(dt);
// Use a private variable to store the dataset in your
// DataReader.
m_dataSet = ds;
// Set the current row to -1.
m_currentRow = -1;
}
public bool Read()
{
m_currentRow++;
if (m_currentRow >= m_dataSet.Tables[0].Rows.Count)
{
return (false);
}
else
{
return (true);
}
}
public int FieldCount
{
// Return the count of the number of columns, which in
// this case is the size of the column metadata
// array.
get { return m_dataSet.Tables[0].Columns.Count; }
}
public string GetName(int i)
{
return m_dataSet.Tables[0].Columns[i].ColumnName;
}
public Type GetFieldType(int i)
{
// Return the actual Type class for the data type.
return m_dataSet.Tables[0].Columns[i].DataType;
}
public Object GetValue(int i)
{
return m_dataSet.Tables[0].Rows[m_currentRow][i];
}
public int GetOrdinal(string name)
{
// Look for the ordinal of the column with the same name and return it.
// Returns -1 if not found.
return m_dataSet.Tables[0].Columns[name].Ordinal;
}
Al crear o recuperar el conjunto de datos, puede utilizar el objeto DataSet en las implementaciones de los miembros Read, GetValue, GetName, GetOrdinal, GetFieldType y FieldCount de la clase DataReader.
Vea también