最近在做SSRS项目时,遇到这么一个情形:该项目有多个数据库,每个数据库都在不同的服务器,但每个数据库所拥有的数据库对象(table/view/SPs/functions)都是一模一样的,后来结合网络上众多的资源找到了解决方案,即Data Processing Extensio(DPE)。所谓DPE,直白地说就是开发自己的DLL去扩展SSRS的数据源,具体的操作如下所示:

1. 新建类库项目,并引入以下两个DLL:

C:\Program Files\Microsoft SQL Server\MSSQLSERVER\Reporting Services\ReportServer\bin\Microsoft.ReportingServices.Interfaces.dll

  C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\v3.5\System.Data.DataSetExtensions.dll

2. 根据参数获取Connection String:新建DBConnection类文件,实现接口IDbConnectionExtension并且重写其中的方法:

  A. SetConfiguration():主要是实现读取数据库连接的配置文件:

public void SetConfiguration(string configuration)
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(configuration);
string ConfigFilePath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase + xmlDoc.ChildNodes[].Attributes["configSource"].InnerText;
ExeConfigurationFileMap file = new ExeConfigurationFileMap();
file.ExeConfigFilename = ConfigFilePath;
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(file, ConfigurationUserLevel.None);
foreach (ConnectionStringSettings cf in config.ConnectionStrings.ConnectionStrings)
{
connectionStrings.Add(cf.Name, cf.ToString());
}
}

  B. GetConnectionByParameter():主要根据User的选择来返回相应的Database connection;

public SqlConnection GetConnectionByParameter(IDataParameterCollection parameters)
{
var connString = connectionStrings["CentralDBConnString"]; foreach (DBParameter param in parameters)
{
if (param.ParameterName.Equals("ClinicCode"))
{
//Using the first value if the ClinicCode were selected for more than 1 option.
if (param.Values != null && param.Values.Length > 1)
{
param.Value = param.Values[0];
}
connString = GetConnectionStringsConfig(param.Value.ToString());
}
} return new SqlConnection(connString);
}

3. 执行SQL命令:新建DBCommand类文件,实现接口IDbCommand并且重写其中的方法:

  A. ExecuteReader(): 执行SQL Command;

public IDataReader ExecuteReader(CommandBehavior behavior)
{
Debug.WriteLine("IDBCommand.ExecuteReader with CommandBehavior." + behavior); // get connection based on parameters
using (SqlConnection conn = m_connection.GetConnectionByParameter(this.Parameters))
{
conn.Open(); SqlCommand cmd = new SqlCommand(CommandText, conn);
cmd.CommandType = (System.Data.CommandType)this.CommandType;
foreach (DBParameter param in this.Parameters)
{
if (param.Value != null)
cmd.Parameters.Add(new SqlParameter(param.ParameterName, param.Value));
else
cmd.Parameters.Add(new SqlParameter(param.ParameterName, DBNull.Value));
} SqlDataAdapter sqlDA = new SqlDataAdapter(cmd);
System.Data.DataSet dsResult = new System.Data.DataSet();
sqlDA.Fill(dsResult);
m_dataTable = dsResult.Tables[]; conn.Close();
return new DBDataReader(this);
}
}

4. 小结:最后还需要实现的几个接口包括:IDataReader,IDataParameter, IDataMultiValueParameter,IDataParameterCollection,并要实现其中的某些方法。完成以上步骤后基本所有的工作已经完成,接下来就是部署DLL了。

5. 部署:部署有两个选择,一种是供SSRS在设计模式使用DPE,另一种是供SSRS在发布后在Reporting Server上使用DPE。两种方法的发布路径及配置文件均不同,但过程都极为相似。以下是两种方式的区别:

1. Open the project "ProjectName" and rebuild it ;
2. Copy the file "ProjectName.dll" and "ProjectName.pdb" inside folder "ProjectName\ProjectName\bin\Debug" to path "C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\PrivateAssemblies\";
3. Copy file "ProjectName.config" inside project root directory to path "C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\PrivateAssemblies\";
4. Open the file "RSReportDesigner.config" inside folder "C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\PrivateAssemblies\"(The exactly path base on the Visio Studio version you installed in your local);
4.1. Find the node <Data> inside node <Extensions>, add node "<Extension Name="XXXX DataSource Extension" Type="ProjectName.DBConnection, ProjectName" />" inside node <Data>;
4.2 Find the node <Desinger> inside node <Extensions>, add node "<Extension Name="XXXX DataSource Extension" Type="Microsoft.ReportingServices.QueryDesigners.GenericQueryDesigner,Microsoft.ReportingServices.QueryDesigners"/>" inside node <Desinger>; 5. Open the file "RSPreviewPolicy.config" inside folder "C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\PrivateAssemblies\"(The exactly path base on the Visio Studio version you installed in your local);
5.1 Find the node <Data> inside node <Extensions>, add node below content inside node <CodeGroup>;
<CodeGroup
class="UnionCodeGroup"
version="1"
PermissionSetName="FullTrust"
Name="XXXX DataSource Extension"
Description="Code group for my Custom DataSource for data processing extension">
<IMembershipCondition
class="UrlMembershipCondition"
version="1"
Url="C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\PrivateAssemblies\ProjectName.dll"
/>
</CodeGroup> 6. Open your DataSource of SSRS report ,select the Embedded connections and choice the DPE named "XXXX DataSource Extension" from the dropdownlist of Type;
7. Click OK button to use the DPE. PS.
1. Please close and open your Visio Studio again, if you can not find the DPE named "XXXX DataSource Extension" after you finished above steps; Using the DEP in Report Server(After deploy to Reporting Server):
***********************************************************************************************************
1. Open the project "ProjectName" and rebuild it ;
2. Copy the file "ProjectName.dll" and "ProjectName.pdb" inside folder "ProjectName\ProjectName\bin\Debug" to path "C:\Program Files\Microsoft SQL Server\MSRS12.MSSQLSERVER\Reporting Services\ReportServer\bin\";
3. Copy file "ProjectName.config" inside project root directory to path "C:\Program Files\Microsoft SQL Server\MSRS12.MSSQLSERVER\Reporting Services\ReportServer\bin\";
4. Open the file "rsreportserver.config" inside folder "C:\Program Files\Microsoft SQL Server\MSRS12.MSSQLSERVER\Reporting Services\ReportServer\"(The exactly path base on the Visio Studio version you installed in your local);
4.1. Find the node <Data> inside node <Extensions>, add below content inside node <Data>;
<Extension Name="DPEName" Type="ProjectName.DBConnection,ProjectName">
<Configuration>
<connectionStrings configSource="\bin\ProjectName.config" />
</Configuration>
</Extension>
4.2 Find the node <Desinger> inside node <Extensions>, add below inside node <Desinger>; 5. Open your DataSource of SSRS report in Reporting Server,then open the report through right click it and select "Manage";
6. Click "Data Source" from the menu located left side of the new page;
7. Select "A Custom Data Source" in the right side of the page,followed by selecting DPE named "XXXX DataSource Extension" as the Data source type;
8. Click Apply button to use the DPE. PS.
1. Please restart the Reporting Services if you still can not find the DataSource manage page after you finished above steps;

6. 总结:经过这次对DPE的使用,总体来说没有什么难度,但在使用的过程中最好能下载一个例子,然后在其基础上进行修改,这样会节约很多时间。此外还要注意的是使用的.Net Framework的版本,刚开始由于版本不正确,导致一直找不到自定义的DPE,最后经过自己重复测试才找到原因!以下是Google是找到的几个链接,在我使用的过程中帮了我很大的忙:

SQL Server Reporting Services 自定义数据处理扩展DPE(Data Processing Extension)的更多相关文章

  1. SQL Server Reporting Service(SSRS) 第五篇 自定义数据处理扩展DPE(Data Processing Extension)

    最近在做SSRS项目时,遇到这么一个情形:该项目有多个数据库,每个数据库都在不同的服务器,但每个数据库所拥有的数据库对象(table/view/SPs/functions)都是一模一样的,后来结合网络 ...

  2. 充分利用 SQL Server Reporting Services 图表

    最近在查SSRS的一些文章,看到MSDN在有一篇不错的文章,许多图表设置都有说明,共享给大家.. 其中有说明在SSRS中如果去写条件表达写和报表属性中的“自定义代码”,文章相对比较长,需要大家耐心的查 ...

  3. SQL Server Reporting Services本机模式下的权限管理

    SQL Server Reporting Services在安装配置后,缺省只给BUILTIN\Administrators用户组(实际上只有本机的Administrator用户)提供管理权限.所以所 ...

  4. SrsDataConnector The SQL Server Reporting Services account is a local user and is not supported.

    这次使用OS+SQL的镜像还原系统后安装了CRM 2015,主要流程是 安装IIS/AD,SSRS ,CRM2015.自带的SQL中SSRS没有安装完全,需配置一下. 这一切都满顺利的,最后在安装 S ...

  5. SQL Server Reporting Services – Insufficient Rights Error

    http://www.sql-server-performance.com/2011/security-ssrs-reporting-error/ SQL Server Reporting Servi ...

  6. Incorporating ASP.NET MVC and SQL Server Reporting Services, Part 1

    Your ASP.NET MVC application needs reports. What do you do? In this article, I will demonstrate how ...

  7. SQL Server Reporting Services (SQLEXPRESS) 服务占用80端口

    win7, 好多时候,看到system进程占用了80端口,这个是系统进程,不能直接结束.我们不知道这个进程的哪个服务占用了80端口,这里记录其中一个服务"SQL Server Reporti ...

  8. [转]SQL Server Reporting Services - Timeout Settings

    本文转自:https://social.technet.microsoft.com/wiki/contents/articles/23508.sql-server-reporting-services ...

  9. Microsoft Dynamics CRM 2013 安装 报表服务出现“ SQL Server Reporting Services 帐户是本地用户且不受支持 ”错误的解决方法

    安装好CRM 2013 之后,还需要安装报表服务,发现出现:SQL Server Reporting Services 帐户是本地用户且不受支持,具体如下图: 经过分析原来发现是需要用域用户,打开对应 ...

随机推荐

  1. yii 使用renderPartial调用另外一个控制器的视图

    以下由我们在信易网络公司开发项目的时候终结出的一些经验 我们可以使用renderPartial访问存储在不同控制器的视图文件夹中的部分视图文件. 在Yii1.1.3中,我们使用双斜线“//”,程序就会 ...

  2. css3 标题超过长度自动省略号

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  3. php tpl 模板页面如和给js文件传参数

    有一个参数,服务器传给了php 模板页面,但模板包含的js需要得到这个参数值.如何处理: 一,在引入页面前加一句代码 <script type="text/javascript&quo ...

  4. after I see Little Dorrit

    也许是我太追名逐利,所以我不肯承认自己花费了大把的时间看电影,通过写博客好像自己从中感悟到了什么,好像看电影也是一种学习的方式. 也许是我平静自内心的方式,我太忙于玩或者学习,甚至没有机会非常沉静 一 ...

  5. POJ 2886 Who Gets the Most Candies? 线段树

    题目: http://poj.org/problem?id=2886 左右转的果断晕,题目不难,关键是准确的转啊转.因为题目要求输出约数个数最多的数,所以预处理[1,500000]的约数的个数就行了. ...

  6. 【web安全】第四弹:防火墙技术笔记

    参考资料: <黑客攻防演习>第二版   Ed SKoudis  Tom Liston著 <防火墙.入侵检测与VPN> 马春光 郭方方著 OSI在理论上将网络分为七层,物理层.数 ...

  7. C# 两个获得程序运行路径的函数

    EXE文件的存储路径,不太受调用时环境变量的影响: Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Lo ...

  8. Bootstrap 轮播(Carousel)插件

    Bootstrap 轮播(Carousel)插件是一种灵活的响应式的向站点添加滑块的方式.除此之外,内容也是足够灵活的,可以是图像.内嵌框架.视频或者其他您想要放置的任何类型的内容. 如果您想要单独引 ...

  9. Android之单复选框及Spinner实现二级联动

    一.基础学习 1.图形学真的很神奇啊....查了些资料做出了3D云标签,哈哈...其实直接拿来用的,我们要效仿鲁迅先生的拿来主义,嘿嘿~~3D标签云就是做一个球面,然后再球面上取均匀分布的点,把点坐标 ...

  10. 【网络流24题】No. 17 运输问题 (费用流)

    [题意] W 公司有 m 个仓库和 n 个零售商店.第 i 个仓库有ai 个单位的货物:第 j 个零售商店需要b j 个单位的货物. 货物供需平衡,即SIGMA(A)=SIGMA(B). 从第 i 个 ...