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


Использование внешнего набора данных со службами Reporting Services

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

При использовании ( наличии?) модулей обработки данных служб Reporting Services можно провести интеграцию любых пользовательских объектов DataSet, созданных внешними приложениями. Этого можно достичь, создав в службах Reporting Services пользовательский модуль обработки данных, который будет служить мостиком между пользовательским объектом DataSet и сервером отчетов. Большая часть кода, используемого для обработки данного объекта DataSet, хранится в созданном пользователем классе DataReader.

Первым шагом в представлении пользовательского объекта DataSet на сервере отчетов является реализация характерного для поставщика метода в пользовательском классе DataReader, который может заполнить объект DataSet. В следующем примере демонстрируется, как можно загрузить статические данные в объект DataSet, с использованием в пользовательском классе DataReader метода, характерного для поставщика.

'Private members of the DataReader classPrivate m_dataSet As System.Data.DataSetPrivate m_currentRow As Integer'Method to create a datasetFriend 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 = - 1End Sub 'CreateDataSet
// Private members of the DataReader classprivate System.Data.DataSet m_dataSet;private int m_currentRow;// Method to create a datasetinternal 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;}

После того, как пользовательский объект DataSet ( возможно здесь будет правильнее использовать термин «набор данных») был создан или получен, объект DataSet будет возможно использовать в реализациях элементов Read, GetValue, GetName, GetOrdinal, GetFieldType и FieldCount класса DataReader.