在运行时设置 Reporting Services 的数据源






4.70/5 (7投票s)
通过单个 SSRS 报告访问多个数据库。
引言
通常,我们使用单个数据库服务器作为报表的数据源。但是,考虑这样一种情况:相同的数据源需要用于生产、开发和测试。 如果出于安全原因,用户将被授予访问同一报表但来自不同数据库服务器的权限,该怎么办? 本文将重点介绍实现此目的的一种方法。
背景
如前所述,有很多方法可以实现这一目标。 Bilal Khawaja 提出了一个实现目标的好方法。 我提出了一个不同的概念,我想分享一下。
软件规格
Visual C# .NET 2008,SQL Server 2008。
概念
如上图所示,将有一个中心数据库,其中包含一个表和一个存储过程。
目标
创建单个报表,并根据人名从不同的数据库访问记录。 例如,所有以 A 开头的名称将从 DB-A 中提取;对于 B,将从 DB-B 中提取,其余的从 DefaultDB 中提取。
实现
步骤 1:创建三个数据库,分别命名为 DefaultDB、DB-A、DB-B。
步骤 2:在每个数据库中创建一个表(例如 tblInformation),其中包含列 [Person Name]、[Age]、[Sex]、[Address]。
步骤 3:在所有四个表中插入一些值。
步骤 4:在 DefaultDB 中创建一个存储过程(例如 usp_GetResult
),如下所示
CREATE PROCEDURE usp_GetResult
-- Add the parameters for the stored procedure here
(
@FirstLetter varchar(50)
)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
DECLARE @MAINQRY AS VARCHAR(50)
SELECT @MAINQRY=
CASE @FirstLetter
WHEN 'A' THEN 'SELECT * FROM [DB-A].[dbo].[tblInformation]'
WHEN 'B' THEN 'SELECT * FROM [DB-B].[dbo].[tblInformation]'
ELSE 'SELECT * FROM [DefaultDB].[dbo].[tblInformation]'
END
EXEC(@MAINQRY)
END
步骤 5:打开 VS 2008。创建一个 Windows 应用程序。
步骤 6:单击 添加->新项->数据集。
步骤 7
步骤 8:单击 服务器资源管理器。
步骤 9:数据连接 [右键单击]->添加连接。
步骤 10:选择 SQL Server 连接,数据库名称,然后按“测试连接”按钮。 成功后,单击“确定”按钮。
步骤 11:现在,展开“存储过程”选项卡,然后选择存储过程。
步骤 12:将存储过程(例如,usp_GetResult
)拖放到“数据集”中。
步骤 13:添加新项->报表。
步骤 14:从“报表项工具箱”中拖放一个 TABLE 项,并将其放置在报表窗体上[例如,DisplayRecords.rdlc]。 存储过程中的字段名称应放置在要显示的字段中。
步骤 15:现在,创建一个 Form
,例如 Form2.cs。 从工具箱中,转到“报表”选项卡,然后选择“MicrosoftReportViewer”。 将其拖放到窗体上。
步骤 16:单击 ReportViewer 右上角的 |> 符号,然后选择报表文件(.rdlc)。
步骤 17:如果一切正常,我们将获得以下屏幕
步骤 18:在代码隐藏中,添加以下代码
public partial class Form2 : Form
{
string FirstChar = string.Empty;
public Form2()
{
InitializeComponent();
}
public Form2(string _FirstChar)
{
InitializeComponent();
FirstChar = _FirstChar;
}
private void Form2_Load(object sender, EventArgs e)
{
// TODO: This line of code loads data into
// the 'NameDS.usp_GetResult' table. You can move, or remove it, as needed.
this.usp_GetResultTableAdapter.Fill(this.NameDS.usp_GetResult, FirstChar);
this.reportViewer1.RefreshReport();
}
}
注意:由于存储过程 usp_GetResult
接受一个参数,因此已传递 FirstChar
变量。
步骤 19:创建另一个 Form
,例如 Form1
,其设计视图将类似于
步骤 20:在“报表”按钮的单击事件中,添加以下代码
private void btnReport_Click(object sender, EventArgs e)
{
Form2 objForm = new Form2(txtName.Text.Substring(0, 1));
objForm.ShowDialog();
}
步骤 21:运行应用程序。 在“名称”文本框中输入一些文本,然后单击“确定”。 如果名称以 A 开头,它将命中 DB-A;如果名称以 B 开头,则将调用 DB-B,否则将执行默认数据库。
我们可以在哪里实施这个
在许多情况下,可以直接或通过稍微调整来应用此概念。 其中一些列在此处
- 如果我们想根据某些类别向用户显示记录。
- 在测试、开发和生产环境中。
- 出于安全原因,如果我们希望将数据拆分到各个表中。
- 等等。
结论
这是一种通过单个报表服务访问多个数据库服务器的简便方法。 欢迎提出进一步的建议和反馈,以改进本文。