65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.70/5 (7投票s)

2009 年 9 月 22 日

CPOL

3分钟阅读

viewsIcon

52307

downloadIcon

419

通过单个 SSRS 报告访问多个数据库。

引言

通常,我们使用单个数据库服务器作为报表的数据源。但是,考虑这样一种情况:相同的数据源需要用于生产、开发和测试。 如果出于安全原因,用户将被授予访问同一报表但来自不同数据库服务器的权限,该怎么办? 本文将重点介绍实现此目的的一种方法。

背景

如前所述,有很多方法可以实现这一目标。 Bilal Khawaja 提出了一个实现目标的好方法。 我提出了一个不同的概念,我想分享一下。

软件规格

Visual C# .NET 2008,SQL Server 2008。

概念

1.jpg

如上图所示,将有一个中心数据库,其中包含一个表和一个存储过程。

目标

创建单个报表,并根据人名从不同的数据库访问记录。 例如,所有以 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:单击 添加->新项->数据集。

2.jpg

步骤 7

3.jpg

步骤 8:单击 服务器资源管理器。

4.jpg

步骤 9:数据连接 [右键单击]->添加连接。

5.jpg

步骤 10:选择 SQL Server 连接,数据库名称,然后按“测试连接”按钮。 成功后,单击“确定”按钮。

6.jpg

步骤 11:现在,展开“存储过程”选项卡,然后选择存储过程。

7.jpg

步骤 12:将存储过程(例如,usp_GetResult)拖放到“数据集”中。

8.jpg

步骤 13:添加新项->报表。

9.jpg

步骤 14:从“报表项工具箱”中拖放一个 TABLE 项,并将其放置在报表窗体上[例如,DisplayRecords.rdlc]。 存储过程中的字段名称应放置在要显示的字段中。

步骤 15:现在,创建一个 Form,例如 Form2.cs。 从工具箱中,转到“报表”选项卡,然后选择“MicrosoftReportViewer”。 将其拖放到窗体上。

11.jpg

步骤 16:单击 ReportViewer 右上角的 |> 符号,然后选择报表文件(.rdlc)。

步骤 17:如果一切正常,我们将获得以下屏幕

13.jpg

步骤 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,其设计视图将类似于

14.jpg

步骤 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,否则将执行默认数据库。

我们可以在哪里实施这个

在许多情况下,可以直接或通过稍微调整来应用此概念。 其中一些列在此处

  1. 如果我们想根据某些类别向用户显示记录。
  2. 在测试、开发和生产环境中。
  3. 出于安全原因,如果我们希望将数据拆分到各个表中。
  4. 等等。

结论

这是一种通过单个报表服务访问多个数据库服务器的简便方法。 欢迎提出进一步的建议和反馈,以改进本文。

© . All rights reserved.