上一篇介绍如何在SSRS中以共享目录的方式来订阅报表。由于SSRS对于邮件的方式订阅报表有些特殊,所以此篇将介绍如何以变通的方式实现报表邮件订阅。
实现邮件的方式订阅报表,我们将其拆分成三个部分。
我们利用SQL Server Agent生成job来以固定周期触发一个流程。然后在这个流程中,首先实现一个app将报表生成到一个指定目录下,然后再调用另外一个程序,根据配置文件,把报表发送给指定邮件组的用户。
首先,创建生成报表pdf的应用程序。
生成pdf的主要思路是用一个winform应用程序添加一个reportviewer控件,然后直接将报表生成pdf格式。
打开Visual Studio 2012,创建一个winform应用程序。
在窗体上添加ReportViewer控件。
然后,在数据库中建立加几张表,用来保存报表控件的配置信息,以及邮件发送的配置信息。这三张表的结构可以根据实际情况定义,在本片中,ReportBase主要保存ReportServer和ReportPath两条信息,用来定位一张服务器端报表。EmailBase主要用来记录发送邮件所有的用户名和密码以及smtp服务器所在地址。ReportTo用来记录邮件发送给谁。
创建好基础表之后,回到项目,添加一个LINQ to SQL Classes(当然你可以选择Entity Data Model)。
连接到刚才建立的数据库。
将记录有报表定义的表拖拽到LINQ TO SQL设计界面中,在这里系统将根据数据表的结构生成对应的类。
回到数据表里,为保存报表配置信息的表中添加一行数据。ReportServer和ReportPath的配置跟前面介绍的ReportViewer控件的属性一致。这里我们连接前几篇中创建的报表。当然这里也可以选择一个你已经部署的另外一张报表。
回到项目,为项目添加如下代码。
代码首先将表中的配置数据读取出来,然后赋给ReportViewer控件的相关属性(LINQ真的很好用)。
为报表设置好属性后,调用Export里面的方法让ReportViewer控件直接把报表的内容生成为PDF文件。
到这里,报表生成PDF开发完毕,接下来创建邮件发送程序。
邮件发送程序基本不需要UI,所以直接创建一个Console Application控制台应用程序。
同样为项目添加LINQ TO SQL文件,将邮件配置表和发送配置表拖拽到LINQ TO SQL界面中。
将如下代码加入到Main方法中。
这段代码将配置信息读取出来之后,使用SMTP相关类,将邮件发送出去。
相关的应用程序建立完毕,接下来创建相应的作业来将这两个程序"串"起来。
打开SSMS,连接到数据引擎服务,展开SQL Server Agent,在Job目录下右键单击,选择New Job…创建一个新的作业。
在General界面中为Job取个名称。
在Steps界面下点击New,依次新建两个步骤。
将前面的两个程序放置在指定的目录中,然后配置job的steps。
作业的第一步为生成pdf,运行本章建立的第一个程序。
作业的第二步是根据配置发送邮件。
两步配置好之后的结果大致应该如下图所示。
接下来点击Schedules,为作业创建运行周期,点击New。
在New Job Schedule中可以看到可以生成任意周期的Schedule。
作业创建完毕后,可以手动触发测试一下运行效果。右键刚才建立的作业名称,然后点击Start Job at Step…。
弹出界面指定从哪一步开始运行,直接默认第一步点击Start。
运行完毕后,登陆邮箱,可以看到发送过来的邮件。
邮件的具体内容,以及包含的报表附件。
以上,邮件订阅报表的方式介绍完毕。根据实际情况,在实际项目中也可以添加更多的配置信息。在接收人列表的配置中,通常来说一个用户一个用户的方式添加会很麻烦而且也很繁琐,所以建议以邮件组的方式来维护。
如果报表中有参数,可以选择两种方法,一个是为参数都设置默认值,这是最简单的方法,让报表默认生成的就是最新的数据。也可以通过编码的方式把参数添加进ReportViewer控件,具体方法可以参考前两篇的介绍。
另外在邮件发送部分,也可以不通过自动以程序,而是通过SQL Server Database Mail,比如:
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'Default',
@recipients = '[email protected]',
@subject = 'Daily Report',
@file_attachments='d:\report.pdf'
附 :
演示代码及数据库文件下载: