使用 ReportDocument.FileName 属性绑定到托管 RAS 服务器

Note注意

本页描述了在 Crystal Reports for Visual Studio 中未提供但在升级版本中提供的功能。若需更多有关 Crystal Reports for Visual Studio 的信息,请参见“什么是 Crystal Reports for Visual Studio?”有关升级版本的更多信息,请参见“升级选项”

对象模型

此报表绑定方案使用 ReportClientDocument(请参见“通过 ReportClientDocument 对象模型进行报表绑定(RAS)”)。

报表的位置

此方案属于报表可被复制并存在于两个位置的少数几种方案之一,其报表位于以下两个位置:Visual Studio 项目中的嵌入式报表和 Crystal Reports Server 或 BusinessObjects Enterprise(BOE)中的报表应用程序服务器(RAS)提供的 Crystal Reports Server 或 BusinessObjects Enterprise 资源库。

Note注意

因为报表最终从远程服务器显示,所以此报表绑定方案也可以成功用于非嵌入式报表(实现方式见“绑定到已加载到 ReportDocument 类中的非嵌入式报表”)。

说明

原来在 Crystal Reports for Visual Studio 中使用嵌入式报表和 ReportDocument 对象模型创建的 NET 项目现在可以轻松地移植到托管 RAS 服务器。

在此方案中,使用发布向导在 Crystal Reports Server 或 BusinessObjects Enterprise 中放置一个报表副本,从而在运行时将嵌入式报表绑定到 Crystal Reports Server 或 BusinessObjects Enterprise 中的托管 RAS 服务器。嵌入式报表的现有代码将继续工作,但可通过执行以下操作,将该报表的源重定向到托管 RAS 服务器:

  • 为项目添加 Crystal Reports Server 或 BusinessObjects Enterprise 登录功能并获得 EnterpriseSession 实例。
  • 从 Crystal Reports Server 或 BusinessObjects Enterprise 中获取报表副本的 CUID 属性。
  • 将 ReportDocument 的 EnterpriseSession 属性设置为 EnterpriseSession 实例。
  • 将 ReportDocument 的 FileName 属性设置为嵌入式报表的 CUID 字符串。

有关代码示例,请参见下面的“实现”一节。

此方案演示了在 Crystal Reports 开发人员版中,可以将使用 ReportDocument 对象模型的嵌入式或非嵌入式报表直接绑定到使用该 ReportClientDocument 对象模型的 RAS 服务器。这是如何实现的呢?在 Crystal Reports 10 中,ReportDocument 对象模型已被重写为可访问 ReportClientDocument 对象模型的代理层。有关更多信息,请参见“结构”中的 “ReportClientDocument 对象模型(RAS)”

Note注意

FileName 属性引用托管 RAS 服务器中的报表。总是显示托管 RAS 服务器中的报表,即使该报表与嵌入式报表不同版本或不同名。

可以直接通过 ReportDocument.ReportClientDocument 属性访问基础 ReportClientDocument 对象模型,从而允许在运行时修改使用 ReportClientDocument 对象模型的报表。

优点

  • 方便的可移植性:维护与使用 ReportDocument 对象模型的报表进行交互的所有原始代码,同时仍可以通过 ReportDocument.ReportClientDocument 属性完全访问基础 ReportClientDocument 对象模型。
    Note注意

    ReportClientDocument 对象模型允许以编程的方式创建、修改报表定义文件并保存对报表定义文件的更改。有关更多信息,请参见“结构”中的 “ReportClientDocument 对象模型(RAS)”

  • 优化的性能:由于报表应用程序服务器(RAS)中报表引擎的优异性能使性能显著提高。请参见“比较所有 Business Objects 报表解决方案的结构”

缺点

  • 少量额外编码工作:项目必须登录并获取 EnterpriseSession 对象,然后将其存储在 ASP.NET Session 中。每次将报表绑定到使用 ReportDocument 的 CrystalReportViewer 控件时,都必须获取 CUID 并在 ReportDocument 的 FileName 属性中设置它。
  • 增加了维护要求:在 Crystal Reports Server 或 BusinessObjects Enterprise 中创建嵌入式报表的副本使得维护要求增加。如果需要更改或删除报表,必须将这些更改传播到 Visual Studio 项目中的嵌入式报表中和 Crystal Reports Server 或 BusinessObjects Enterprise 中的报表副本中。

使用报表的 CUID 和 ReportDocument 的 FileName 属性显示在 Crystal Reports Server 或 BusinessObjects Enterprise 中存储的嵌入式报表的副本

  • 已安装 Crystal Reports Server 或 BusinessObjects Enterprise,并且经验证可以正常工作。
  • 已安装 Crystal Reports Server 或 BusinessObjects Enterprise SDK(包括 .NET 程序集),并且经验证可以正常工作。
    Note注意

    若已在开发计算机上安装 Crystal Reports Server 或 BusinessObjects Enterprise,则在此安装中已包含 SDK。

此过程仅适用于已通过“项目设置”创建的项目。“项目设置”包含此过程需要的特定命名空间引用和代码配置。如果没有该配置,将无法完成此过程。因此,在开始此过程之前,必须首先执行“项目设置”中的步骤。

  1. 找到并记录 Crystal Reports Server 或 BusinessObjects Enterprise 服务器的名称。对于此示例,服务器名称为“BOE01”。
1.  若要查找服务器名称,请右击“我的电脑”图标,然后选择“属性”。
2.  在“系统属性”对话框上,单击“网络标识”选项卡。
3.  计算机名称就在“完整的计算机名称”字段中。
  1. 使用发布向导将 Hierarchical Grouping.rpt 发布到 Crystal Reports Server 或 BusinessObjects Enterprise 服务器。
<table>
<colgroup>
<col style="width: 100%" />
</colgroup>
<thead>
<tr class="header">
<th><img src="images/8yfdxzdx.alert_note(zh-cn,VS.90).gif" alt="Note" class="note" />注意</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><p>若需了解如何使用发布向导,请参见 Crystal Reports Server 或 BusinessObjects Enterprise 用户文档。</p></td>
</tr>
</tbody>
</table>

有关示例报表的信息,请参见[“示例报表目录”](ms225622\(v=vs.90\).md)。
  1. 在 ConfigureCrystalReports() 方法(在“项目设置”中创建)中,有以下报表绑定代码。
``` vb
Dim hierarchicalGroupingReport As Hierarchical_Grouping = New
Hierarchical_Grouping()
myCrystalReportViewer.ReportSource = hierarchicalGroupingReport
```

``` csharp
Hierarchical_Grouping hierarchicalGroupingReport = new
Hierarchical_Grouping();
crystalReportViewer.ReportSource = hierarchicalGroupingReport;
```

在这两行代码之间,必须添加几行新代码(请参见步骤 3 到步骤 14),这几行新代码在报表绑定到 CrystalReportViewer 控件之前执行以下操作:

  - 登录到网络上的某个 Crystal Reports Server 或 BusinessObjects Enterprise 服务器。
  - 获取标识 Crystal Reports Server 或 BusinessObjects Enterprise 中存储的报表的 CUID。
  - 通过其 CUID 调用该报表。
  1. 将以下程序集引用添加到项目中:
1.   CrystalDecisions.Enterprise.Framework
2.   CrystalDecisions.Enterprise.InfoStore
  1. 在代码隐藏页的顶部,为 CrystalDecisions.Enterprise 命名空间添加 "Imports" [Visual Basic] 或 "using" [C#] 语句。
``` vb
Imports CrystalDecisions.Enterprise
```

``` csharp
using CrystalDecisions.Enterprise;
```

现在已准备就绪,可以添加将嵌入式报表重定向到 Crystal Reports Server 或 BusinessObjects Enterprise 的代码。
  1. 在实例化 hierarchicalGroupingReport 的那行代码之后,声明 serverName 字符串并将其设置为 Crystal Reports Server 或 BusinessObjects Enterprise 服务器的名称。
``` vb
Dim serverName As String = "BOE01"
```

``` csharp
string serverName = "BOE01";
```
  1. 声明并实例化 SessionMgr 类。
``` vb
Dim mySessionMgr As SessionMgr = New SessionMgr()
```

``` csharp
SessionMgr sessionMgr = new SessionMgr();
```
  1. 将用户名(Administrator)、密码(空白)、serverName 变量和登录类型(secEnterprise)传递给该 SessionMgr 实例的 Logon 方法,从而获得 EnterpriseSession 的实例。
``` vb
Dim myEnterpriseSession As EnterpriseSession = mySessionMgr.Logon(
_
"Administrator", "", serverName, "secEnterprise")
```

``` csharp
EnterpriseSession enterpriseSession = sessionMgr.Logon(
"Administrator", "", serverName, "secEnterprise");
```
  1. 从 EnterpriseSession 的 GetService 方法中获取 InfoStore 服务(作为 EnterpriseService)。
``` vb
Dim myEnterpriseService As EnterpriseService = _
myEnterpriseSession.GetService("InfoStore")
```

``` csharp
EnterpriseService enterpriseService =
enterpriseSession.GetService("InfoStore");
```
  1. 用获得的 InfoStore 服务声明并实例化 InfoStore。
``` vb
Dim myInfoStore As InfoStore = New InfoStore(myEnterpriseService)
```

``` csharp
InfoStore infoStore = new InfoStore(enterpriseService);
```

现在已准备就绪,可以从 Crystal Reports Server 或 BusinessObjects Enterprise 获取 Hierarchical Grouping 报表的 CUID。
  1. 输入下列查询字符串以向 Crystal Reports Server 或 BusinessObjects Enterprise 查询该报表的 CUID。
``` vb
Dim queryString As String = "Select SI_CUID From CI_INFOOBJECTS " _
& "Where SI_PROGID='CrystalEnterprise.Report' " _
& "And SI_NAME Like 'Hierarchical Grouping'"
```

``` csharp
string queryString = "Select SI_CUID From CI_INFOOBJECTS "
+ "Where SI_PROGID='CrystalEnterprise.Report' "
+ "And SI_NAME Like 'Hierarchical Grouping'";
```
  1. 通过将查询字符串传递到 InfoStore 的 Query 方法获取包含查询结果的 InfoObjects 索引类。
``` vb
Dim myInfoObjects As InfoObjects = myInfoStore.Query(queryString)
```

``` csharp
InfoObjects infoObjects = infoStore.Query(queryString);
```
  1. 从该 InfoObjects 索引类的第一列中获取 InfoObject。
<table>
<colgroup>
<col style="width: 100%" />
</colgroup>
<thead>
<tr class="header">
<th><img src="images/8yfdxzdx.alert_note(zh-cn,VS.90).gif" alt="Note" class="note" />注意</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><p>InfoObjects 索引类的索引从 1 开始,而不是从 0 开始。</p></td>
</tr>
</tbody>
</table>

``` vb
Dim myInfoObject As InfoObject = myInfoObjects(1)
```

``` csharp
InfoObject infoObject = infoObjects[1];
```

现在已准备就绪,可以从 Crystal Reports Server 或 BusinessObjects Enterprise 加载嵌入式报表的副本。
  1. 从 InfoObject 的 SI_CUID 属性获取报表的 CUID 字符串,并传递到 reportCUID 字符串变量中。
``` vb
Dim reportCUID As String = myInfoObject.CUID
```

``` csharp
string reportCUID = infoObject.CUID;
```
  1. 将嵌入式报表的 EnterpriseSession 属性设置为 EnterpriseSession 实例。
``` vb
hierarchicalGroupingReport.EnterpriseSession = myEnterpriseSession
```

``` csharp
hierarchicalGroupingReport.EnterpriseSession = enterpriseSession;
```
  1. 将嵌入式报表的 FileName 属性设置为 reportCUID 变量,以 cecuid:/// 协议为前缀。
<table>
<colgroup>
<col style="width: 100%" />
</colgroup>
<thead>
<tr class="header">
<th><img src="images/8yfdxzdx.alert_note(zh-cn,VS.90).gif" alt="Note" class="note" />提示</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><p>使用三斜杠,而不是双斜杠。这表示主机名为空。</p></td>
</tr>
</tbody>
</table>

``` vb
hierarchicalGroupingReport.FileName = "cecuid:///" & reportCUID
```

``` csharp
hierarchicalGroupingReport.FileName = "cecuid:///" + reportCUID;
```
  1. 若要查看该报表,请生成并运行您的项目。
现在,将从 Crystal Reports Server 或 BusinessObjects Enterprise 加载报表,并通过托管 RAS 服务器提供报表。

要从 ReportDocument 对象模型中访问 ReportClientDocument 对象模型,请参见“使用 ReportDocument.Load() 方法绑定到非托管 RAS”中的“实现”一节。

请参见