使用 ReportDocument.FileName 属性绑定到托管 RAS 服务器
![]() |
---|
本页描述了在 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 资源库。
![]() |
---|
因为报表最终从远程服务器显示,所以此报表绑定方案也可以成功用于非嵌入式报表(实现方式见“绑定到已加载到 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)”。
![]() |
---|
FileName 属性引用托管 RAS 服务器中的报表。总是显示托管 RAS 服务器中的报表,即使该报表与嵌入式报表不同版本或不同名。 |
可以直接通过 ReportDocument.ReportClientDocument 属性访问基础 ReportClientDocument 对象模型,从而允许在运行时修改使用 ReportClientDocument 对象模型的报表。
优点
- 方便的可移植性:维护与使用 ReportDocument 对象模型的报表进行交互的所有原始代码,同时仍可以通过 ReportDocument.ReportClientDocument 属性完全访问基础 ReportClientDocument 对象模型。
注意
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 程序集),并且经验证可以正常工作。
注意
若已在开发计算机上安装 Crystal Reports Server 或 BusinessObjects Enterprise,则在此安装中已包含 SDK。
此过程仅适用于已通过“项目设置”创建的项目。“项目设置”包含此过程需要的特定命名空间引用和代码配置。如果没有该配置,将无法完成此过程。因此,在开始此过程之前,必须首先执行“项目设置”中的步骤。
- 找到并记录 Crystal Reports Server 或 BusinessObjects Enterprise 服务器的名称。对于此示例,服务器名称为“BOE01”。
1. 若要查找服务器名称,请右击“我的电脑”图标,然后选择“属性”。
2. 在“系统属性”对话框上,单击“网络标识”选项卡。
3. 计算机名称就在“完整的计算机名称”字段中。
- 使用发布向导将 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)。
- 在 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. CrystalDecisions.Enterprise.Framework
2. CrystalDecisions.Enterprise.InfoStore
- 在代码隐藏页的顶部,为 CrystalDecisions.Enterprise 命名空间添加 "Imports" [Visual Basic] 或 "using" [C#] 语句。
``` vb
Imports CrystalDecisions.Enterprise
```
``` csharp
using CrystalDecisions.Enterprise;
```
现在已准备就绪,可以添加将嵌入式报表重定向到 Crystal Reports Server 或 BusinessObjects Enterprise 的代码。
- 在实例化 hierarchicalGroupingReport 的那行代码之后,声明 serverName 字符串并将其设置为 Crystal Reports Server 或 BusinessObjects Enterprise 服务器的名称。
``` vb
Dim serverName As String = "BOE01"
```
``` csharp
string serverName = "BOE01";
```
- 声明并实例化 SessionMgr 类。
``` vb
Dim mySessionMgr As SessionMgr = New SessionMgr()
```
``` csharp
SessionMgr sessionMgr = new SessionMgr();
```
- 将用户名(Administrator)、密码(空白)、serverName 变量和登录类型(secEnterprise)传递给该 SessionMgr 实例的 Logon 方法,从而获得 EnterpriseSession 的实例。
``` vb
Dim myEnterpriseSession As EnterpriseSession = mySessionMgr.Logon(
_
"Administrator", "", serverName, "secEnterprise")
```
``` csharp
EnterpriseSession enterpriseSession = sessionMgr.Logon(
"Administrator", "", serverName, "secEnterprise");
```
- 从 EnterpriseSession 的 GetService 方法中获取 InfoStore 服务(作为 EnterpriseService)。
``` vb
Dim myEnterpriseService As EnterpriseService = _
myEnterpriseSession.GetService("InfoStore")
```
``` csharp
EnterpriseService enterpriseService =
enterpriseSession.GetService("InfoStore");
```
- 用获得的 InfoStore 服务声明并实例化 InfoStore。
``` vb
Dim myInfoStore As InfoStore = New InfoStore(myEnterpriseService)
```
``` csharp
InfoStore infoStore = new InfoStore(enterpriseService);
```
现在已准备就绪,可以从 Crystal Reports Server 或 BusinessObjects Enterprise 获取 Hierarchical Grouping 报表的 CUID。
- 输入下列查询字符串以向 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'";
```
- 通过将查询字符串传递到 InfoStore 的 Query 方法获取包含查询结果的 InfoObjects 索引类。
``` vb
Dim myInfoObjects As InfoObjects = myInfoStore.Query(queryString)
```
``` csharp
InfoObjects infoObjects = infoStore.Query(queryString);
```
- 从该 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 加载嵌入式报表的副本。
- 从 InfoObject 的 SI_CUID 属性获取报表的 CUID 字符串,并传递到 reportCUID 字符串变量中。
``` vb
Dim reportCUID As String = myInfoObject.CUID
```
``` csharp
string reportCUID = infoObject.CUID;
```
- 将嵌入式报表的 EnterpriseSession 属性设置为 EnterpriseSession 实例。
``` vb
hierarchicalGroupingReport.EnterpriseSession = myEnterpriseSession
```
``` csharp
hierarchicalGroupingReport.EnterpriseSession = enterpriseSession;
```
- 将嵌入式报表的 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;
```
- 若要查看该报表,请生成并运行您的项目。
现在,将从 Crystal Reports Server 或 BusinessObjects Enterprise 加载报表,并通过托管 RAS 服务器提供报表。
要从 ReportDocument 对象模型中访问 ReportClientDocument 对象模型,请参见“使用 ReportDocument.Load() 方法绑定到非托管 RAS”中的“实现”一节。