DataSet 对象是支持使用 ADO.NET 断开连接的分布式数据方案的核心。 DataSet 对象是数据的内存驻留表示形式,它提供一致的关系编程模型,而不考虑数据源。 它可与多个不同的数据源、XML 数据一起使用,或用于管理应用程序本地数据。 DataSet 对象表示一组完整的数据,包括表之间的相关表、约束和关系。 由于 DataSet 对象在存储和公开数据方面具有多功能性,因此在报告该数据之前,数据通常可能会被处理并转换为 DataSet 对象。
使用 Reporting Services 数据处理扩展插件,可以集成外部应用程序创建的任何自定义 数据集 对象。 为此,请在 Reporting Services 中创建一个自定义数据处理扩展插件,该扩展插件类似于 DataSet 对象和报表服务器之间的桥。 处理此 DataSet 对象的大多数代码都包含在所创建的 DataReader 类中。
向报表服务器公开 DataSet 对象的第一步是在 DataReader 类中实现可填充 DataSet 对象的提供程序特定方法。 以下示例演示如何在 DataReader 类中使用特定于提供程序的方法将静态数据加载到 DataSet 对象中。
'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;
}
创建或检索数据集后,可以在 DataReader 类的 Read、GetValue、GetName、GetOrdinal、GetFieldType 和 FieldCount 成员的实现中使用 DataSet 对象。