VS2005+SQL2005 Reporting动态增加报表(*.rdlc)数据源

 

前言:

在阅读本篇文章前,我建议您先阅读我之前写的另一篇关于VS2005中如何将datast动态绑定到reportViewer的文章:VS2005+SQL2005 Reporting Service动态绑定报表(Web),因为该篇可以说是对上一篇的补充。

 

关于本例子的例程下载:http://files.cnblogs.com/carlwave/exdynamicreport.rar

 

目的:

通过代码生成ado.net DataSet,然后绑定到reportViewer,基本上实现完全代码化,动态化,使对报表操作更方便。

在上篇中我对如何使用ado.net DataSet动态绑定到reportViewer作了详细介绍,只是上篇中自己留下个疑问,就是对report这个xml文件本身的设计变得相当复杂,通过和网上朋友的交流以及查询资料,写了一个对报表xml文件操作的类,基本实现完全动态化报表操作。

 

对报表(*.rdlc)文件进行操作:

其实,要生成一个rdlc文件并绑定上数据是有很多方法的。

1、 静态:使用微软自带的向导生成dataset,绑定上报表。

2、 完全动态:由于rdlc文件原本就是一个XML文件,所以你可以完全自行在代码中生成一个xml文件,但是这个方案也不让人满意,原因是:所有的报表对象都得自己生成,没有可视化工具的设计既繁琐又复杂。特别是如果设计几个line,然后再来上几个分组的话,工作量巨大。

3、 部分动态:首先加载rdlc文件到一个XmlDocument对象;然后修改xml内容;把xml序列化成字节流,交给ReportViewer显示。该方案缺点在于每次运行都需要重新加载rdlc,修改,增加了代码复杂度和运算量。

4、 动态修改rdlc文件->静态调用:这个方案就是我这里要介绍的方案,该方案通过对已经生成的rdlc文件进行读写操作,动态加入了ado.net dataset生成的字段和数据源。
        优点在于只需要在第一次和dataset
数据源变化的时候对报表的数据源部分进行重新读写就可。

PS:关于完全动态和部分动态可以参考:http://www.weste.net/2006/5-29/15422156045.html

 

详细操作步骤:

1、 新建一个解决方案,增加一个Web项目。

2、 增加一个报表文件。(图)


3、 增加报表xml操作的RdlcDataSet类,这个类是我纯粹为了报表文件关于数据连接写的,由于使用性比较单一,实现了大部分功能,但是总的来说封装的不是最好,如果你要对报表文件有更多的需求,可以重新封装这个类,具体怎么调用看代码。

  1 None.gif ' ------------------------------------------------------------------------------
  2 None.gif' --ClassName: RdlcDataSet
  3 None.gif' --Description: for reset the report file(*.rdlc),add the DataSets files and datasources
  4 None.gif' --             If you want to use this class, you should do:
  5 None.gif' --             First:Use Vs2005 to creat a report file(*.rdlc)
  6 None.gif' --             Second:create a ado.net dataset and pass it to this class
  7 None.gif' --             Third:run in your codes EX:Dim objRdlcDataSet As New RdlcDataSet
  8 None.gif' --                          objRdlcDataSet.RdlcDataSetNew("Reports\temp.rdlc", "Northwind", "Northwind", dataset)
  9 None.gif' --                   Your just need to run it only once.
 10 None.gif' --Input:    ado.net dataset, DataSourceName,dataSetName   
 11 None.gif' --Output :     
 12 None.gif' --08/31/06 -   Created (Fei) 
 13 None.gif' --    just run once
 14 None.gif' -- ex:Dim objRdlcDataSet As New RdlcDataSet
 15 None.gif' -- objRdlcDataSet.RdlcDataSetNew("Reports\temp.rdlc", "Northwind", "Northwind", dataset)
 16 None.gif' --
 17 None.gif' -- if you just want to add a dataset in exist datasets
 18 None.gif' -- ex:Dim objRdlcDataSet As New RdlcDataSet
 19 None.gif' --    objRdlcDataSet.RdlcFileCheck("Reports\temp.rdlc")
 20 None.gif' --    objRdlcDataSet.AddDataSet(DataSetName, DataSourceName, DataSetAdd)
 21 None.gif
 22 None.gif Imports  System.Data
 23 None.gif Imports  System.Data.SqlClient
 24 None.gif Imports  System.Xml
 25 None.gif Imports  System.IO
 26 None.gif
 27 ExpandedBlockStart.gifContractedBlock.gif Public   Class RdlcDataSet Class RdlcDataSet
 28InBlock.gif    Inherits System.Web.UI.Page
 29InBlock.gif
 30InBlock.gif    Private mErrorMessage As String
 31InBlock.gif    Private mXmlReport As XmlDocument
 32InBlock.gif    Private mRdlcPath As String
 33InBlock.gif    Private mNodeReport As XmlNode
 34InBlock.gif
 35ExpandedSubBlockStart.gifContractedSubBlock.gif    Public Property ErrorMessage()Property ErrorMessage() As String
 36InBlock.gif        Get
 37InBlock.gif            Return mErrorMessage
 38InBlock.gif        End Get
 39InBlock.gif        Set(ByVal Value As String)
 40InBlock.gif            mErrorMessage = Value
 41InBlock.gif        End Set
 42ExpandedSubBlockEnd.gif    End Property

 43InBlock.gif
 44InBlock.gif    'the path of the *.rdlc
 45InBlock.gif    'ex:"Report\temp.rdlc"
 46ExpandedSubBlockStart.gifContractedSubBlock.gif    Public Property RdlcPath()Property RdlcPath() As String
 47InBlock.gif        Get
 48InBlock.gif            Return mRdlcPath
 49InBlock.gif        End Get
 50InBlock.gif        Set(ByVal Value As String)
 51InBlock.gif            mRdlcPath = Value
 52InBlock.gif        End Set
 53ExpandedSubBlockEnd.gif    End Property

 54InBlock.gif
 55ExpandedSubBlockStart.gifContractedSubBlock.gif    Public Property XmlReport()Property XmlReport() As XmlDocument
 56InBlock.gif        Get
 57InBlock.gif            Return mXmlReport
 58InBlock.gif        End Get
 59InBlock.gif        Set(ByVal Value As XmlDocument)
 60InBlock.gif            mXmlReport = Value
 61InBlock.gif        End Set
 62ExpandedSubBlockEnd.gif    End Property

 63InBlock.gif
 64ExpandedSubBlockStart.gifContractedSubBlock.gif    Public Property NodeReport()Property NodeReport() As XmlElement
 65InBlock.gif        Get
 66InBlock.gif            Return mNodeReport
 67InBlock.gif        End Get
 68InBlock.gif        Set(ByVal Value As XmlElement)
 69InBlock.gif            mNodeReport = Value
 70InBlock.gif        End Set
 71ExpandedSubBlockEnd.gif    End Property

 72InBlock.gif
 73InBlock.gif    'for reset the rdlc file and add datasources and datasets
 74InBlock.gif    'ex:objRdlcDataSet.RdlcDataSet("Reports\temp.rdlc", "Northwind", "Northwind", dataset)
 75ExpandedSubBlockStart.gifContractedSubBlock.gif    Public Function RdlcDataSetNew()Function RdlcDataSetNew(ByVal RdlcPath As StringByVal DataSourceName As StringByVal DataSetName As StringByVal DataSetAdd As DataSet) As Boolean
 76InBlock.gif        Dim blnResult As Boolean
 77InBlock.gif        blnResult = RdlcFileCheck(RdlcPath)
 78InBlock.gif        If blnResult = False Then
 79InBlock.gif            Return False
 80InBlock.gif            Exit Function
 81InBlock.gif        End If
 82InBlock.gif        Call RdlcDataSetInit()
 83InBlock.gif        Call AddDataSource(DataSourceName)
 84InBlock.gif        Call AddDataSet(DataSetName, DataSourceName, DataSetAdd)
 85ExpandedSubBlockEnd.gif    End Function

 86InBlock.gif
 87InBlock.gif    'for check the rdlc file
 88InBlock.gif    'in this class it can only for the *.rdlc which is grnerate by VS2005
 89ExpandedSubBlockStart.gifContractedSubBlock.gif    Public Function RdlcFileCheck()Function RdlcFileCheck(ByVal RdlcPath As StringAs Boolean
 90InBlock.gif        Dim strChkRdlc As String
 91InBlock.gif        strChkRdlc = RdlcPath.Substring(RdlcPath.Length - 44)
 92InBlock.gif        strChkRdlc = strChkRdlc.ToLower
 93InBlock.gif        'if not report file return false
 94InBlock.gif        If strChkRdlc.CompareTo("rdlc"<> 0 Then
 95InBlock.gif            Me.ErrorMessage = "File is not a report file.(With *.rdlc)"
 96InBlock.gif            Return False
 97InBlock.gif            Exit Function
 98InBlock.gif        End If
 99InBlock.gif        RdlcPath = Server.MapPath(RdlcPath)
100InBlock.gif        Dim xmlReport As New XmlDocument
101InBlock.gif        xmlReport.Load(RdlcPath)
102InBlock.gif        Dim nodeReport As XmlNode
103InBlock.gif        nodeReport = xmlReport.ChildNodes(1)
104InBlock.gif        If nodeReport.Name.CompareTo("Report"<> 0 Then
105InBlock.gif            Me.ErrorMessage = "File is not a report file grnerate by VS2005."
106InBlock.gif            Return False
107InBlock.gif            Exit Function
108InBlock.gif        End If
109InBlock.gif        Me.NodeReport = nodeReport
110InBlock.gif        Me.RdlcPath = RdlcPath
111InBlock.gif        Me.XmlReport = xmlReport
112InBlock.gif        Return True
113ExpandedSubBlockEnd.gif    End Function

114InBlock.gif
115InBlock.gif    'for Rdlc init
116InBlock.gif    'delete all datasets and datasources
117InBlock.gif    'and add new empty datasets and datasources
118ExpandedSubBlockStart.gifContractedSubBlock.gif    Public Sub RdlcDataSetInit()Sub RdlcDataSetInit()
119InBlock.gif        Call DelReportNodes("DataSources")
120InBlock.gif        Call DelReportNodes("DataSets")
121InBlock.gif        Call AddReportNodes("DataSources")
122InBlock.gif        Call AddReportNodes("DataSets")
123InBlock.gif        Me.XmlReport.Save(Me.RdlcPath)
124ExpandedSubBlockEnd.gif    End Sub

125InBlock.gif
126ExpandedSubBlockStart.gifContractedSubBlock.gif    Private Sub DelReportNodes()Sub DelReportNodes(ByVal strDelName As String)
127InBlock.gif        Dim nodelistDel As XmlNodeList
128InBlock.gif        nodelistDel = Me.NodeReport.ChildNodes
129InBlock.gif        Dim elmDel As XmlElement
130InBlock.gif        Dim i As Int32
131InBlock.gif        For i = 0 To nodelistDel.Count - 1
132InBlock.gif            elmDel = nodelistDel.Item(i)
133InBlock.gif            If elmDel.Name.CompareTo(strDelName) = 0 Then
134InBlock.gif                Me.NodeReport.RemoveChild(elmDel)
135InBlock.gif                i = i - 1
136InBlock.gif            End If
137InBlock.gif            If i = nodelistDel.Count - 1 Then
138InBlock.gif                Exit For
139InBlock.gif            End If
140InBlock.gif        Next
141ExpandedSubBlockEnd.gif    End Sub

142InBlock.gif
143ExpandedSubBlockStart.gifContractedSubBlock.gif    Private Sub AddReportNodes()Sub AddReportNodes(ByVal strAddName As String)
144InBlock.gif        Dim elmAdd As XmlElement
145InBlock.gif        elmAdd = Me.XmlReport.CreateElement("", strAddName, "")
146InBlock.gif        elmAdd.SetAttribute("xmlns"Me.NodeReport.NamespaceURI)
147InBlock.gif        Me.NodeReport.AppendChild(elmAdd)
148ExpandedSubBlockEnd.gif    End Sub

149InBlock.gif
150InBlock.gif    'add datasource
151InBlock.gif    'xml:<DataSources>
152InBlock.gif    '<DataSource Name="DataSourceName">
153InBlock.gif    '   <ConnectionProperties>
154InBlock.gif    '    <ConnectString />
155InBlock.gif    '    <DataProvider>SQL</DataProvider>
156InBlock.gif    '  </ConnectionProperties>
157InBlock.gif    '</DataSource>
158InBlock.gif    '</DataSources>
159ExpandedSubBlockStart.gifContractedSubBlock.gif    Public Sub AddDataSource()Sub AddDataSource(ByVal DataSourceName As String)
160InBlock.gif        Dim i As Int32
161InBlock.gif        Dim blnResult As Boolean = False
162InBlock.gif        Dim nodeDataSources As XmlNode = Me.NodeReport
163InBlock.gif        Dim nodelistAddDataSource As XmlNodeList
164InBlock.gif        nodelistAddDataSource = Me.NodeReport.ChildNodes
165InBlock.gif        Dim elmDataSources As XmlElement
166InBlock.gif        For i = 0 To nodelistAddDataSource.Count - 1
167InBlock.gif            elmDataSources = nodelistAddDataSource.Item(i)
168InBlock.gif            If elmDataSources.Name.CompareTo("DataSources"= 0 Then
169InBlock.gif                nodeDataSources = elmDataSources
170InBlock.gif                blnResult = True
171InBlock.gif                Exit For
172InBlock.gif            End If
173InBlock.gif        Next
174InBlock.gif        If blnResult = False Then
175InBlock.gif            Me.ErrorMessage = "node DataSources hasn't found"
176InBlock.gif            Exit Sub
177InBlock.gif        End If
178InBlock.gif        Dim elmDataSource As XmlElement
179InBlock.gif        elmDataSource = Me.XmlReport.CreateElement("DataSource")
180InBlock.gif        elmDataSource.SetAttribute("Name", DataSourceName)
181InBlock.gif        Dim elmConnectionProperties As XmlElement
182InBlock.gif        elmConnectionProperties = Me.XmlReport.CreateElement("ConnectionProperties")
183InBlock.gif        Dim elmConnectString As XmlElement
184InBlock.gif        elmConnectString = Me.XmlReport.CreateElement("ConnectString")
185InBlock.gif        Dim elmDataProvider As XmlElement
186InBlock.gif        elmDataProvider = Me.XmlReport.CreateElement("DataProvider")
187InBlock.gif        elmDataProvider.InnerText = "SQL"
188InBlock.gif        elmConnectionProperties.AppendChild(elmconnectstring)
189InBlock.gif        elmConnectionProperties.AppendChild(elmDataProvider)
190InBlock.gif        elmDataSource.AppendChild(elmConnectionProperties)
191InBlock.gif        nodeDataSources.AppendChild(elmDataSource)
192InBlock.gif        Me.XmlReport.Save(Me.RdlcPath)
193ExpandedSubBlockEnd.gif    End Sub

194InBlock.gif
195InBlock.gif    '--------------------------------------------------------------------------
196InBlock.gif    '--add datasets
197InBlock.gif    '--xml:
198InBlock.gif    '--<DataSets>
199InBlock.gif    '-- <DataSet Name="DataSetName">         
200InBlock.gif    '--     <Fields>                                                     
201InBlock.gif    '--      <Field Name="DataFieldName">
202InBlock.gif    '--         <DataField>DataFieldName</DataField>
203InBlock.gif    '--       </Field>
204InBlock.gif    '--     </Fields>
205InBlock.gif    '--     <Query>
206InBlock.gif    '--      <DataSourceName>DataSourceName</DataSourceName>
207InBlock.gif    '--      <CommandText>
208InBlock.gif    '--      </CommandText>
209InBlock.gif    '--      <Timeout>30</Timeout>
210InBlock.gif    '--     </Query>
211InBlock.gif    '--   </DataSet>
212InBlock.gif    '--</DataSets>
213InBlock.gif    '----------------------------------------------------------------------
214ExpandedSubBlockStart.gifContractedSubBlock.gif    Private Sub AddDataSet()Sub AddDataSet(ByVal DataSetName As StringByVal DataSourceName As StringByVal dsAdd As DataSet)
215InBlock.gif        Dim i As Int32
216InBlock.gif        Dim blnResult As Boolean = False
217InBlock.gif        Dim nodeDataSets As XmlNode = Me.NodeReport
218InBlock.gif        Dim nodelistAddDataSource As XmlNodeList
219InBlock.gif        nodelistAddDataSource = Me.NodeReport.ChildNodes
220InBlock.gif        Dim elmDataSources As XmlElement
221InBlock.gif        For i = 0 To nodelistAddDataSource.Count - 1
222InBlock.gif            elmDataSources = nodelistAddDataSource.Item(i)
223InBlock.gif            If elmDataSources.Name.CompareTo("DataSets"= 0 Then
224InBlock.gif                nodeDataSets = elmDataSources
225InBlock.gif                blnResult = True
226InBlock.gif                Exit For
227InBlock.gif            Else
228InBlock.gif
229InBlock.gif            End If
230InBlock.gif        Next
231InBlock.gif        If blnResult = False Then
232InBlock.gif            Me.ErrorMessage = "node DataSets hasn't found"
233InBlock.gif            Exit Sub
234InBlock.gif        End If
235InBlock.gif        Dim elmDataSet As XmlElement
236InBlock.gif        elmDataSet = Me.XmlReport.CreateElement("DataSet")
237InBlock.gif        elmDataSet.SetAttribute("Name", DataSetName)
238InBlock.gif        Dim elmFields As XmlElement
239InBlock.gif        elmFields = Me.XmlReport.CreateElement("Fields")
240InBlock.gif        Dim elmField As XmlElement
241InBlock.gif        For i = 0 To dsAdd.Tables(0).Columns.Count - 1
242InBlock.gif            elmField = Me.XmlReport.CreateElement("Field")
243InBlock.gif            elmField.SetAttribute("Name", dsAdd.Tables(0).Columns(i).ToString)
244InBlock.gif            Dim elmDataField As XmlElement
245InBlock.gif            elmDataField = Me.XmlReport.CreateElement("DataField")
246InBlock.gif            elmDataField.InnerText = dsAdd.Tables(0).Columns(i).ToString
247InBlock.gif            'Dim elmTypeName As XmlElement
248InBlock.gif            'elmTypeName = Me.XmlReport.CreateElement("rd:TypeName")
249InBlock.gif            'elmTypeName.InnerText = dsAdd.Tables(0).Columns(i).DataType.ToString
250InBlock.gif            elmField.AppendChild(elmDataField)
251InBlock.gif            'elmField.AppendChild(elmTypeName)
252InBlock.gif            elmFields.AppendChild(elmField)
253InBlock.gif        Next
254InBlock.gif        Dim elmQuery As XmlElement
255InBlock.gif        elmQuery = Me.XmlReport.CreateElement("Query")
256InBlock.gif        Dim elmDataSourceName As XmlElement
257InBlock.gif        elmDataSourceName = Me.XmlReport.CreateElement("DataSourceName")
258InBlock.gif        elmDataSourceName.InnerText = DataSourceName
259InBlock.gif        Dim elmCommandText As XmlElement
260InBlock.gif        elmCommandText = Me.XmlReport.CreateElement("CommandText")
261InBlock.gif        Dim elmTimeout As XmlElement
262InBlock.gif        elmTimeout = Me.XmlReport.CreateElement("Timeout")
263InBlock.gif        elmTimeout.InnerText = "30"
264InBlock.gif        elmQuery.AppendChild(elmDataSourceName)
265InBlock.gif        elmQuery.AppendChild(elmCommandText)
266InBlock.gif        elmQuery.AppendChild(elmTimeout)
267InBlock.gif        elmDataSet.AppendChild(elmFields)
268InBlock.gif        elmDataSet.AppendChild(elmQuery)
269InBlock.gif        nodeDataSets.AppendChild(elmDataSet)
270InBlock.gif
271InBlock.gif        Me.XmlReport.Save(RdlcPath)
272ExpandedSubBlockEnd.gif    End Sub

273InBlock.gif
274ExpandedBlockEnd.gifEnd Class


4、 在代码中生成ado.net dataset,动态调用报表,运行一次(运行一次即可,以后除非dataset的数据源变了,否则可以注释掉)

 1 ExpandedBlockStart.gif ContractedBlock.gif Partial  Class exLoadReport Class exLoadReport
 2InBlock.gif    Inherits System.Web.UI.Page
 3InBlock.gif
 4ExpandedSubBlockStart.gifContractedSubBlock.gif    Protected Sub Page_Load()Sub Page_Load(ByVal sender As ObjectByVal e As System.EventArgs) Handles Me.Load
 5InBlock.gif        If Not Page.IsPostBack Then
 6InBlock.gif            LoadCustomersReport("Reports\Customers.rdlc""Northwind""dsCustomers")
 7InBlock.gif        End If
 8ExpandedSubBlockEnd.gif    End Sub

 9InBlock.gif
10ExpandedSubBlockStart.gifContractedSubBlock.gif    Private Function GetCustomers()Function GetCustomers() As DataSet
11InBlock.gif        Dim dsGetCustomers As New DataSet
12InBlock.gif        Dim sqlGetCustomers As String = "SELECT * from Customers where city in (select city from Customers group by city having count(city)>=2)"
13InBlock.gif        Using connection As New SqlConnection("Data Source=(local);Initial Catalog=Northwind;User ID=sa;Password=;")
14InBlock.gif            Dim command As New SqlCommand(sqlGetCustomers, connection)
15InBlock.gif            Dim adpGetCustomers As New SqlDataAdapter(command)
16InBlock.gif            adpGetCustomers.Fill(dsGetCustomers, "dsGetCustomers")
17InBlock.gif        End Using
18InBlock.gif        Return dsGetCustomers
19ExpandedSubBlockEnd.gif    End Function

20InBlock.gif
21ExpandedSubBlockStart.gifContractedSubBlock.gif    Private Sub LoadCustomersReport()Sub LoadCustomersReport(ByVal RdlcPath As StringByVal DataSourceName As StringByVal DataSetName As String)
22InBlock.gif        'get the dataset
23InBlock.gif        Dim tmpDs As DataSet
24InBlock.gif        tmpDs = GetCustomers()
25InBlock.gif        '------------------------------------------------------------------
26InBlock.gif        'you must run these codes blew before the first time you load the report.
27InBlock.gif        'After that, if you haven't changer the ado.net dataset, you don't need 
28InBlock.gif        'to run it again.
29InBlock.gif        '------------------------------------------------------------------
30InBlock.gif        'reset the report file(*.rdlc) add 'DataSets' and 'DataSource'
31InBlock.gif
32InBlock.gif        'Dim objRdlcDataSet As New RdlcDataSet
33InBlock.gif        'objRdlcDataSet.RdlcDataSetNew(RdlcPath, DataSourceName, DataSetName, tmpDs)
34InBlock.gif        '------------------------------------------------------------------
35InBlock.gif
36InBlock.gif        'set the reportViewer
37InBlock.gif        rpvEx.ProcessingMode = ProcessingMode.Local
38InBlock.gif        Dim localReport As LocalReport
39InBlock.gif        localReport = rpvEx.LocalReport
40InBlock.gif        localReport.ReportPath = RdlcPath
41InBlock.gif        'Create a report data source for the sales order data
42InBlock.gif        Dim dsCustomers As New ReportDataSource()
43InBlock.gif        dsCustomers.Name = DataSetName
44InBlock.gif        dsCustomers.Value = tmpDs.Tables(0)
45InBlock.gif        localReport.DataSources.Add(dsCustomers)
46InBlock.gif        localReport.Refresh()
47ExpandedSubBlockEnd.gif    End Sub

48ExpandedBlockEnd.gifEnd Class

 

5、 设计报表,增加一个table,在table的属性中输入dataset的名字,注意:这个名字必须和你写报表文件所使用的dataset名字相同,否则会报错,找不到dataset。(图)
table.jpg

6、 再次运行即可。

PS:例程中的报表文件加入了一些分组以及函数的调用,关于报表的使用我就不描述了,这方面的资料还是比较多的。写的比较仓促,欢迎大家给出意见。

转载于:https://www.cnblogs.com/Carlwave/archive/2006/09/05/495174.html

参与评论 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值