Использование внешнего набора данных со службами 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.
См. также