asp.net

位置:IT落伍者 >> asp.net >> 浏览文章

Asp.Net中使用水晶报表


发布日期:2020年11月14日
 
Asp.Net中使用水晶报表

以下内容为程序代码:

在我们对VSNet中的水晶报表(Crystal Reports)进行研究之前我和我朋友对如何将这个复杂的东东加入我们的Web应用有着非常的好奇心一周以后在阅读了大量的HOWTO文档之后我们成功地将一些简单的报告加入到了我们的程序中并得到了一些小决窍

这篇文章教你如何在Net Web应用中使用水晶报表也可以让你在学习过程中少走一些弯路为了得到最好的效果读者最好需要有一些基础的AspNet访问数据库的知识以及使用VSNet的开发经验

简介

水晶报表可以由很多的方法得到其中一个就是使用VSNet来创建它提供了非常丰富模型以使我们能够在运行时操作属性和方法如果你正在使用VSNet开发Net程序那么你就不需要再安装其它软件了因为他已经内嵌在VSNet中了

优点:

VSNet水晶报表有下面一些主要的优点

快速的报表开发

能够导出成为复杂的交互性图表

可以与其它控件一起在WebForm中使用

能够动态地将报表导出成为pdfdocxlshtmlrtf等多种格式

结构

一些组件组成了水晶报表的二层结构需要的Web应用有

客户端 :

客户端仅需要一个可以访问嵌入aspx页面报表的游览器就可以了

服务器 :

水晶报表引擎(Crystal Report Engine (CREnginedll))

通过它可以完成一些任务如在报告文件中合并数据转换报告为其它格式等也正是因为报告引擎的作用才可以将AspNet中的水晶报表转换成为普通HTML格式

水晶报表设计器(Crystal Report Designer (CRDesignerdll))

水晶报表就是在设计器中创建的在设计器中你可以设计标题插入数据公式图表子报表等

rpt报表文件

执行报表中的第一步就是在水晶报表设计器接口创建此报表在默认安装中微软已经提供了一些现成的rpt例子

Data Source

rpt文件取得数据库的方法取决于你方法的选择你能选择让水晶报表自己选择数据而不使用任何代码或者也可以选择手动的组装DataSet然后再将其传送到报表文件

水晶报表查看控件(Crystal Report Viewer web form Control (CRWebFormViewerdll))

水晶报表查看控件是一个WebForm控件可以将它看成是一个在aspx页面中存放报表的容器 注意在一些复杂的操作中报表服务器与Web服务器可能不在同一物理主机上Web服务器将HTTP请求传送到报表服务器上去水晶报表也可以当做WebService来执行

执行模式

水晶报表取数据可以使用下面的方法实现

Pull 模式:

被请求时水晶报表直接根据指定的驱动连接数据库然后组装这些数据

Push 模式 :

此时开发表不得不自己编写代码连接数据并组装DataSet同时将它传送至报表在些这种情况下通过使用连接共享以及限制记录集合的大小可以使用报表性能最大化

报表类型

水晶报表设计器能够直接包含报表至工程也能够使用独立的报表对象

Stronglytyped 报表 :

当你将报表文件加入到项目中去时它就变成了一个了 stronglytyped报表在这些情况下你将拥有直接创建报表的对象的权力这将减少一些代码并且能够提供一些性能

UnTyped 报表 :

这里的报表并不直接包含在项目中因此称为untyped 报表在这种情况下你不得不使用水晶报表的ReportDocuemt对象建立一个实例并且手动地凋用报表

其它注意事项

尽管水晶报表查看器拥有一些很酷的功能如缩放页面导航等但是他不提供打印功能你不得不调用游览器的打印功能

VSNet中的水晶报表如果没有注册那么它只能使用次后保存功能就不能再使用了为了避免这个你不是不在 这里注册此产品 (好像不是这样子的不注册也好像能用很长的时间只是不能提供支持)

默认安装的水晶报表只能支持个用户为了支持更多的用户你不得不在 中购买许可证

让我们感受一下----在中使用一个现成的水晶报表文件

) 从WebForm工具栏中拖动水晶报表查看器控件(Crystal Report Viewer)至aspx页面中  

) 调出水晶报表查看器控件的属性窗口  

) 点击[]按钮查看Data Binding属性并弹出了DataBinding窗口

) 从左边的Bindable属性区中选择Report Source

) 选中自定义绑定表达式单选按钮在右边的底部的窗口中指定rpt文件的文件名和路径例如C:\\Program Files\\Microsoft Visual StudioNET\\Crystal Reports\\Samples\\Reports\\General Business\\World Sales Reportrpt然后确定

注意文件World Sales Reportrpt文件是在VSNet安装时创建的如果你在安装过程中指定了其它目录此时你最好确认一下路径的正确性

上面的步骤中实际上是插入了下面这些代码至AspNet文件中

以及

id=CrystalReportViewer

runat=server Width=px Height=px

ReportSource=>

注意在飞刀我的VSNet正式版中自动生成的代码中ReportSource产生的样式不是这样子的它是

ReportSource=

这样是错误的会出现错误信息有两处错误

必须按照使用本文介绍的格式来手动修改这也算是VSNet的一个Bug吧

) 在Page_Load方法中调用DataBind方法(代码为VBNet)

Private Sub Page_Load(ByVal sender As SystemObject ByVal e As SystemEventArgs)

DataBind()

End Sub

)保存并编译你的页面 现在你就有一个内嵌水晶报表的WebForm页面了

注意实际开发中一开始会出现无法访问inetsrv目录的错误解决的办法是改变其目录的安全属性使User用户有可写的权限飞刀我发现Net系统自已给出的解决方法是没有用的也可能是我使用的是WindowsNet操作系统的原因

以下内容为程序代码:

使用Pull模式

我们将通过下面的这些步骤来通过Pull模式来执行水晶报表

首先创建rpt文件并使用水晶报表设计接口设置一些必须的数据连接

拖放一个 CrystalReportViewer控件至aspx页面设置它的属性指定我们上一步创建的rpt文件

在代码中调用DataBind方法

创建 rpt 文件:

) 在右击解决方案游览器在弹出的菜单中选择添加--添加新项-->Crystal Report  

) 在Crystal Report 库中选择作为空白报表单选按钮最后单击确定  

)这里将弹出水晶报表设计器  

) 右击报表中的详细资料区选择数据库->添加/删除数据库

) 在弹出的数据库专家扩展OLE DB(ADO)选项此时会弹出另外一个OLE DB(ADO)窗口

) 在 OLE DB (ADO) 弹出窗口中选择 Microsoft OLE DB Provider for SQL Server 然后 Next

) 指定连接的信息

服务器 : ASPCN (您的机器是什么名字就写什么)

用户 ID: sa

密码:

数据库 : Pubs

) 单击Next最后单击Finish按钮

) 这时你就能在数据库专家窗口中看到我们选择的数据库

) 扩展Pubs数据库扩展选择Stores表并将其加到选定的表区中单击OK按钮

) 现在在字段资源浏览器中就会在左边数据库字段区中显示你选择的表以及表中的字段

) 拖放需要的字段进入报表的详细资料字段名将会自动出现在页眉如果你想修改头部文字则可以右击页眉区中的文字选择编辑文本对象选项并进行编辑

) 保存这样我们就有了一个水晶报表文件

创建 CrystalReportViewer 控件

) 回到前面的WebForm中拖放一个Crystal Report Viewer控件到页面中去

) 调出Crystal Report Viewer控件的属性窗口选择DataBindings区点击[

) Crystal Report Viewer 数据绑定窗口在右边的可绑定属性中选择ReportSource并选择右下角的自定义绑定表达式中指定rpt文件路径  

) 此时你能够从Crystal Report Viewer 控件中看到使用一些虚拟数据组成的报表文件的预览

注意在上面的例子中CrystalReportViewer可以在设计时直接调用真实的数据因为此时数据已经保存在这种情况下设计时当没有保存数据时他是不能显示数据的取而代这的是显示一些虚拟的数据只有在执行时才会选取真实的数据

Code Behind 程序设计

) 在Page_Load方法中调用DataBind方法

执行你的程序

) 创建并运行你的程序!  

您现在就可以直接在Web页面中使用水晶报表内置的一些功能如页面导航缩放等

[HTML]我们采用下面的几步使用Push模式执行水晶报表

设计一个DataSet

创建一个rpt文件同时将其指定给上一步建立的DataSet

在aspx页面中拖放一个CrystalReportViewer控件同时将其与前面的rpt文件建立联系

在代码中访问数据库并把数据存入DataSet

调用DataBind方法

设计一个DataSet

) 右击解决方案浏览器选择添加添加新项>数据集

) 从服务器资源管理器中的SQL Server中拖放Stores表(位于PUBS数据库中)

) 此时在数据集中就会有一个Stores表的结构图

xsd文件中仅仅包含一个结构图但是不会有任何数据在里面

创建 rpt 文件 :

) 使用上面的介绍过的方法创建此文件唯一的不同就是使用数据集来代替前面的直接连接数据

)建立rpt文件之后右击详细资料>添加/删除数据库

) 在数据库专家窗口中展开项目数据(代替以前的OleDb)展开ADONet数据集DataSet选择Stores

) 将Stores表添加到选定的表点击OK

) 使用PULL模式下的方法建立一个WebForm

建立一个Crystal Report Viewer 控件

) 建立一个Crystal Report Viewer 控件并设定其属性此处与PULL模式下是一致的

Code Behind 代码:

) 在Page_Load方法中使用下面的子函数

VBNet代码

Sub BindReport()

Dim myConnection As New SqlClientSqlConnection()

myConnectionConnectionString= server= (local)\NetSDK;database=pubs;Trusted_Connection=yes

Dim MyCommand As New SqlClientSqlCommand()

MyCommandConnection = myConnection

MyCommandCommandText = Select * from Stores

MyCommandCommandType = CommandTypeText

Dim MyDA As New SqlClientSqlDataAdapter()

MyDASelectCommand = MyCommand

Dim myDS As New Dataset()

这就是我们在设计模式上使用的DataSet

MyDAFill(myDS Stores)

你不得不使用与你前面DataSet相同名字

Dim oRpt As New CrystalReport()

水晶报表绑定

oRptSetDataSource(myDS)

设定水晶报表的ReportSource

CrystalReportViewerReportSource = oRpt

End Sub

C#代码

private void BindReport()

{

string strProvider = Server=(local);DataBase=pubs;UID=sa;PWD=;

CrystalReport oCR = new CrystalReport();

Dataset ds = new Dataset();

SqlConnection MyConn = new SqlConnection(strProvider);

MyConnOpen();

string strSel = Select * from Stores;

SqlDataAdapter MyAdapter = new SqlDataAdapter(strSelMyConn);

MyAdapterFill(dsstores);

oCRSetDataSource(ds);

thisCrystalReportViewerReportSource = oCR;

}

注意在上面的代码中你得注意一下oRpt是Strongly Typed的报表文件如果你需要使用UnTyped报表你得使用ReportDocument对象然后再调用报表文件

运行你的程序

) 运行你的程序

将报表文件导出成为其它格式

你能够将报表文件导出成为下列格式

PDF (Portable Document Format)

DOC (MS Word Document)

XLS (MS Excel Spreadsheet)

HTML (Hyper Text Markup Language – or compliant)

RTF (Rich Text Format)

使用Pull模式导出报表

当导出使用Pull模式创建的文件时水晶报表准确地打开所需要的数据下面是执行导出功能的代码

C#代码:

VBNet代码:

Private Sub Button_Click(ByVal sender As SystemObject ByVal e As SystemEventArgs) Handles ButtonClick

Dim myReport As CrystalReport = New CrystalReport()

注意这里我们建立一个strongtyped的水晶报表实例

Dim DiskOpts As CrystalDecisionsSharedDiskFileDestinationOptions = New CrystalDecisionsSharedDiskFileDestinationOptions()

myReportExportOptionsExportDestinationType = CrystalDecisions[Shared]ExportDestinationTypeDiskFile

导出成为其它文件时也需要这个选项

如Microsoft Exchange MAPI等

myReportExportOptionsExportFormatType = CrystalDecisions [Shared]ExportFormatTypePortableDocFormat

这里我们导出成为pdf格式文件你也能选择上面的其它类型文件

DiskOptsDiskFileName = c:\Outputpdf

如果你不指定确切的目录那么文件就会保存到[Windows]\System目录中去了

myReportExportOptionsDestinationOptions = DiskOpts

水晶报表文件不包含直接的FileName属性因此你不能直接指定保存的文件名

所以你不得不使用DiskFileDestinationOptions对象设置它的DiskFileName属性

为你想要的路径最后将水晶报表的DestinationsOptions属性指定为上面的DiskFileDestinationOption

myReportExport()

上面的代码将完成导出工作

End Sub

使用PUSH模式导出水晶报表

当导出的报表是由PUSH模式建立的时第一步就是通过编程建立连接并组装DataSet设置报表的的SetDataSource属性再下面的步骤就有Pull模式一样的了

[/HTML]

NET环境下水晶报表使用总结

水晶报表是一个优秀的报表开发工具本人在开发通用管理系统的时候所有报表都使用水晶报表其简单易用和强大的功能令笔者倍加喜爱现将水晶报表使用手记呈现给大家

在使用自带的水晶报表时请注册否则只能使用

水晶报表注册码

注册号:

密码:AAPGKSGDEDS

使用CrystalReportViewer进行预览

CrystalReportViewer控件允许在应用程序中查看 Crystal ReportReportSource 属性用于设置要查看哪个报表该属性设置之后报表显示在查看器中报表源可以是ReportDocument报表文件的路径也可以是强类型报表

打开工具箱并将一个 CrystalReportViewer 拖到窗体上我们命名为rptVew

通过拖放操作将 Windows 窗体查看器调整到希望的大小并将其移动到所需位置

当运行应用程序时报表将显示在查看器中

创建新报表

指向添加单击添加新项

添加新项对话框中模板区域选择 Crystal Report将报表命名为rptClient单击打开

在 Crystal Report 库中选择下列选项之一

· 使用报表专家 — 指导您完成报表的创建过程并将您的选择添加到 Crystal Report Designer

· 作为空白报表 — 打开 Crystal Report Designer

· 来自于现有的报表 — 创建新报表它与指定的另一报表设计相同

注意 Crystal Report 库包含许多专家可以指导您完成数个特定类型报表的创建工作您可能希望使用专家来创建最初的报表以确定哪种报表构造方法适合您的需要

单击确定按钮

如果选择使用报表专家便会出现报表专家对话框并带有数据资源管理器为每个文件夹选择所需数据完成报表专家选项卡界面上的操作然后单击完成来访问 Crystal Report Designer 和您的报表

是否需要动态设置数据源?

Crystal Reports 通过数据库驱动程序与数据库连接每个驱动程序都被编写为可处理特定数据库类型或数据库访问技术

拉和推模型

为了向开发人员提供最灵活的数据访问方法Crystal Reports 数据库驱动程序被设计为可同时提供数据访问的拉模型和推模型

拉模型

在拉模型中驱动程序将连接到数据库并根据需要将数据进来使用这种模型时与数据库的连接和为了获取数据而执行的 SQL 命令都同时由 Crystal Reports 本身处理不需要开发人员编写代码如果在运行时无须编写任何特殊代码则使用拉模型

推模型

相反推模型需要开发人员编写代码以连接到数据库执行 SQL 命令以创建与报表中的字段匹配的记录集或数据集并且将该对象传递给报表该方法使您可以将连接共享置入应用程序中并在 Crystal Reports 收到数据之前先将数据筛选出来

从 ADONET 数据集制作报表

从数据库创建数据集对象

在项目中新建一个架构文件

a 在解决方案资源管理器中右击项目名指向添加然后单击添加新项

b添加新项对话框的类别区域展开文件夹然后选择数据

c模板区域选择数据集

d 接受默认名称 Datasetxsd

这就创建了一个新的架构文件 (Datasetxsd)以后将用它来生成强类型数据集该架构文件将显示在 ADONET 数据集设计器中

指定数据库位置

a 在服务器资源管理器中右击数据连接并选择添加连接

b数据链接属性对话框中单击提供程序选项卡然后选择一个提供程序(例如 Microsoft OLE DB Provider for SQL Server)

c 单击连接选项卡然后指定您的数据库所在位置在所需位置输入服务器和登录信息

d 单击确定按钮

此时您的数据库及其表和字段就出现在服务器资源管理器的数据连接节点下面

在解决方案资源管理器中双击 Datasetxsd (如果它尚不是活动视图)

Datasetxsd 现在应显示在数据集选项卡中

若要为数据集建立架构请将需要的表从服务器资源管理器中拖动到 Datasetxsd 的数据集选项卡上

单击保存 Datasetxsd来保存Datasetxsd文件

生成菜单上单击生成为项目生成数据集对象

ADONET 数据集对象提供数据的描述从它可以向 Crystal report 添加表使用 Crystal Report Designer 中的数据库专家从 ADONET 数据集对象添加表

请在使用报表专家创建新报表时调用数据库专家或者要从一个已经使用 ADONET 建立好的报表中访问数据库专家请在 Report Designer 中右击指向数据库然后单击添加/删除数据库

将报表连接到 ADONET 数据集对象

数据库专家展开项目数据文件夹

展开ADONET 数据集文件夹

选择所需数据集对象

例如如果当时使用的是从项目WindowsApplication的架构文件Datasetxsd中生成的数据集对象则应该选择WindowsApplicationDataset

选择要向报表中添加的表和使用其他数据源一样

动态改变数据源的代码

Dim dsdataSet As New DataSet()

Dim oRpt As New rptClient() 已建立的报表rptClient

请读者自行填充数据集dsdataSet

使用报表引擎对象模型将填充的数据集传递给报表

oRptSetDataSource(dsdataSetTables())

将带有数据的报表对象绑定到 Windows 窗体查看器rptVew(CrystalReportViewer控件)

rptVewReportSource = oRpt

注意 FillDataSet 方法可连接到指定的数据库提取数据然后断开数据库连接如果您希望将数据库中的多个表添加到报表中请使用 SQL JOIN 语句将这些表联接在一起然后在 FillDataSet 方法中指定一个结果表

创建主从报表

在报表中有许多报表是主从表结构比如订单与订单商品明细订单是一个表中的一条记录而分录是另一个表中的多条记录两个表通过一个字段关联起来这种报表可利用其分组功能实现

新建一个工程

往FORM中添加一个CrystalReportViewer控件

在服务噐资源管理器中连接到SQL SERVER 上的Northwind数据库

添加一个数据集Dataset将服务器资源管理器中的Orders和 Order Details加入到数据集中

添加一个水晶报表使用报表专家在项目数据中选择ADONET数据集插入表Orders和 Order Details链接中是关联字段的链接字段中选择要显示的主表和明细表的字段组中选择分组依据为Orders表OrdersID字段总计图表选择(可进行筛选)样式(可设置报表标题)可自行设置设置完后点击完成

在报表设计器中调整需要显示的字段的位置宽度等

在窗口中添加代码

Private Sub Form_Load(ByVal sender As SystemObject ByVal e As SystemEventArgs) Handles MyBaseLoad

Dim oRpt As New CrystalReport()

Dim dsdataSet As New Dataset()

Dim CN As New DataSqlClientSqlConnection(data source=PMSERVER;initial catalog=Northwind;user id=sa;password=sa)

CNOpen()

Dim daOrders As New DataSqlClientSqlDataAdapter(select * from orders CN)

daOrdersFill(dsdataSet orders)

Dim daDetails As New DataSqlClientSqlDataAdapter(select * from [Order Details] CN)

daDetailsFill(dsdataSet Order Details)

使用报表引擎对象模型将填充的数据集传递给报表

oRptSetDataSource(dsdataSet)

CrystalReportViewerReportSource = oRpt

End Sub

运行程序

用程序改变报表中text的文本

代码如下

Dim GetTextObject As TextObject

按名称获取 ReportObject将其转换为 TextObject并返回此对象

GetTextObject = orptReportDefinitionReportObjectsItem(text)

GetTextObjectText = XXXX系统

总结水晶报表具有非常强大的功能还可进行导出WORDEXCELRTF等文件还可生成复杂漂亮图表是进行WEB和WINDOWS报表开发的利器

(此文部分资料来自MSDN)

Author:李洪根

EMAIL:

本人有如下设想

通过连接查询获得SQL数据库相关数据

置放在DataSet里

调用水晶报表(线形或柱形模板)生成报表

输出生成EXCEL文档

请教各位大侠如何实现以上思路?(如有范例就更好了)

非常感谢!

在你的工程中添加新项目DataSet连结数据库将需要的数据表或预存程序

拖入此DataSet中编译DataSet

使用自带的Crystal Report以DataSet为数据源建立报表

在程序中将数据推入此报表中

Crystal Report 有输出为Excel的选项通过程序也可以实现

Dim conn As SqlConnection

Dim da As SqlDataAdapter

Dim strSQL As String

conn = New SqlConnection()

connConnectionString = User ID=sa; PWD=;Data Source=xxxx; Initial Catalog =xxxxx

connOpen()

strSQL = Select * from TableName

da = New SqlDataAdapter(strSQL conn)

Dim ds As New DataSet()

daFill(ds TableName)

Dim RptDoc As New ReportName()

RptDocSetDataSource(ds)

给RptDoc 指定数据

CrystalViewReportSource = RptDoc 给CrystalView指定数据

CrystalViewDataBind()

connClose()

如果需要显示的为多表关联的字段最好以存储过程建立DataSet

请参考如下代码:

string strconn=连接串;

SqlConnection myconn=new SqlConnection(strconn);

string strcmd=@select语句;

SqlCommand mycmd=new SqlCommand(strcmdmyconn);

SqlDataAdapter myda=new SqlDataAdapter(strcmdmyconn);

DataSet myds=new DataSet();

myconnOpen();

mydaFill(myds报表名);

报表名 myrpt =new 报表名();

myrptSetDataSource(myds);

thisCrystalReportViewerReportSource=myrpt;

导出到EXCEL:

myrptExportOptionsExportDestinationType=CrystalDecisionsSharedExportDestinationTypeDiskFile;

myrptExportOptionsExportFormatType=CrystalDecisionsSharedExportFormatTypeExcel;

CrystalDecisionsSharedDiskFileDestinationOptions opt=new CrystalDecisionsSharedDiskFileDestinationOptions();

optDiskFileName=@文件名;

myrptExportOptionsDestinationOptions =opt;

myrptExport();

水晶报表的中文帮助 下载

x

Crystal Reports for Visual Studio NET

PictureObject 成员请参见

PictureObject 类 ¦ CrystalDecisionsCrystalReportsEngine 命名空间

公共实例属性

Border(从 ReportObject 中继承而来) Border获取 Border 对象

Height(从 ReportObject 中继承而来) Int获取或设置以缇为单位的对象高度

Kind(从 ReportObject 中继承而来) ReportObjectKind获取报表对象的类型

Left(从 ReportObject 中继承而来) Int获取或设置以缇为单位的对象左上角位置

Name(从 ReportObject 中继承而来) 字符串获取对象名

ObjectFormat(从 ReportObject 中继承而来) ObjectFormat获取 ObjectFormat 对象

Top(从 ReportObject 中继承而来) Int获取或设置以缇为单位的对象顶部位置

Width(从 ReportObject 中继承而来) Int获取或设置以缇为单位的对象宽度

请参见

PictureObject 类

Imports CrystalDecisionsCrystalReportsEngine

Dim picObject As PictureObject

picObject = oRptReportDefinitionReportObjectsItem(picture)

来自

大家在基于webform中使用水晶报表时如果简单的按照网上阿刀的做法肯定会提示你登陆失败

对于这个问题斑竹我花了整整一天的时间研究水晶报表的帮助文件终于得到解决方案

我不是一个保守的人我相信有很多的网友正和我一样在花费精力在研究这个问题我不愿意大家再和我一样白白的花费精力

下面是我实现该方案的几个步骤大家不要着急慢慢的看下去会对你有很大的帮助

步骤一看示例文件

水晶报表自带一个示例文件数据库是access(不带密码的)我首先运行示例文件(基于webform和winform)结果显示了正确的报表正如飞刀的示例

于是我自己建立了一个报表文件和aspx文件结果显示登陆失败!可是我把报表文件换成示例的报表文件不再出错

问题出在什么地方?难道是报表格式文件有关于登陆权限的设置?通过跟蹤调试我对比分析我的报表文件和示例报表文件没有发现任何的不同看来问题不在报表文件

是数据库的问题?我建立一个access结果还是登陆失败!

不是数据库的问题(我自己的数据库是未带密码的access帮助中的数据库也是如此)?也不是报表格式文件的问题(我仔细分析了两者的原代码是相同的)?

那么问题出现在什么地方?我白思不得其解!

步骤二找帮助文件

于是我再次求助于帮助我翻遍了水晶报表的帮助终于找到 访问安全数据库 [C#]字样发现这里有下面的一段话

通过 Crystal Reports for Visual Studio NET 访问安全数据库的过程在 Web 窗体和 Windows 窗体之间有所不同在 Windows 窗体中对话框自动提示用户输入用户名和密码(测试很容易成功)而在 Web 窗体中您需要设计一个表单以从用户获取该信息对于这两种情况均可使用代码来指定用户名和密码从而为应用程序的所有用户提供相同的安全等级

于是我对同样的数据库(先是用帮助示例中的access数据库后来用自己建立的access数据库)发现对于同一个报表文件对于winform能显示成功而对于webform则仍然显示登陆失败!于是我有点明白上面的意思!

看来问题是出在权限的设置上

步骤三研究帮助终于成功!

在帮助里我找到设置数据库登录参数字样里面提供了一些后来发现是非常有用的信息

下列示例说明如何将登录参数传递到报表的表中该示例使用到某个安全的 SQL Server 数据库的连接

启动一个新项目

向窗体添加一个按钮和四个文本框控件

文本框控件分别命名为serverNameTxtdbNameTxtuserNameTxt 和 passwordTxt

双击按钮控件以指定 Click 事件的代码根据所用语言插入适当的代码

[C#]

// 声明所需变量

TableLogOnInfo logOnInfo = new TableLogOnInfo ();

int i = ;

// 对报表中的每个表依次循环

for (i=;i == ReportDatabaseTablesCount ;i++)

{

// 设置当前表的连接信息

logOnInfoConnectionInfoServerName = serverNameTxtText;

logOnInfoConnectionInfoDatabaseName = dbNameTxtText;

logOnInfoConnectionInfoUserID = userNameTxtText;

logOnInfoConnectionInfoPassword = passwordTxtText;

ReportDatabaseTables [i]ApplyLogOnInfo (logOnInfo);

}

注意 受密码保护的 Microsoft Access 和 Paradox 等 PC 数据库也使用该方法但 LogOnInfoServerName 和 LogOnInfoDatabaseName 要保留为空

于是我仿照这个样子尝试了一下出错提示没有发现TableLogOnInfo 和Report

后来我发现TableLogOnInfo 是属于CrystalDecisionsShared 命名空间的成员于是我添加引用

using CrystalDecisionsShared ;

这次问题出现在Report

Report?这是个什么东西我查遍了所有的帮助并没有这个函数或类!

[说真的!这个问题难到了我很长的时间!一直在查找Report到底是个什么东西!水景报表公司也真是的帮助也不写得详细一点!该打!!!]

最终我终于发现Report只是一个用户定义的对象不是系统本身的对象

在我困惑的时候突然我想为什么不看看Report后面的DataBase这是个什么东西终于问题解决了在帮助里找到如下信息

ReportDocument oRpt = new ReportDocument()

Report属于DocumentCrystalDecisionsCrystalReports Engine 类的成员

修改代码并添加引用

using CrystalDecisionsShared ;//负责解释TableLogOnInfo类

using CrystalDecisionsCrystalReports Engine ;//负责解释ReportDocument类private void Page_Load(object sender SystemEventArgs e)

{

TableLogOnInfo logOnInfo = new TableLogOnInfo ();

//这里必须事先申明一个ReportDocument对象 Report同时加载数据报表

ReportDocument oRpt = new ReportDocument();

oRptLoad(c:\\inetpub\\wwwroot\\exer\\pagelet\\crystal\\crrpt);//修改为你自//己的正确位置

//建立安全信息

//受密码保护的 Microsoft Access 和 Paradox 等 PC 数据库也使用该方法但 LogOnInfoServerName //和 LogOnInfoDatabaseName 要保留为空

logOnInfoConnectionInfoServerName = www;

logOnInfoConnectionInfoDatabaseName = archives;

logOnInfoConnectionInfoUserID = sa;

logOnInfoConnectionInfoPassword = ;

oRptDatabase Tables []ApplyLogOnInfo (logOnInfo);

//建立rpt文件与CryStalReportviewer文件之间的连接

CrystalReportViewerReportSource = oRpt;

}

报表文件终于出现!

我好高兴禁不住站起来伸了个懒腰!

步骤四最终的完整版的代码

上面的代码不具有系统可扩充和灵活性缺点有二

()数据报表格式文件是采用绝对路径

()数据库访问权限的设置一旦设定在最终发布是无法修改的特别是客户的SQL SERVER服务器不可能和你调试的程序环境是一样的

基于这个考虑引进两个比较好的东西

()ServerMappath函数

()读取nfig(本示例同时告诉你如何操作nfig配置文件)

最终修改如下(完整代码)数据库为sql server

using CrystalDecisionsShared ;//负责解释TableLogOnInfo类

using CrystalDecisionsCrystalReports Engine ;//负责解释ReportDocument类

private void Page_Load(object sender SystemEventArgs e)

{

TableLogOnInfo logOnInfo = new TableLogOnInfo ();

//这里必须事先申明一个ReportDocument对象 Report同时加载数据报表

ReportDocument oRpt = new ReportDocument();

//获取rpt文件真实路径

string pathpath;

path=ServerMapPath (\\exer\\pagelet);

path=path+\\crystal\\crrpt;

//oRptLoad(c:\\inetpub\\wwwroot\\exer\\pagelet\\crystal\\crrpt);

oRptLoad (path);

//从nfig中获取logOnInfo参数信息

string abcd;

//获取ServerName

a=SystemConfiguration ConfigurationSettings AppSettings [servername];

//获取DatabaseName

b=SystemConfiguration ConfigurationSettings AppSettings [database];

//获取UserId

c=SystemConfiguration ConfigurationSettings AppSettings [userid];

//获取password

d=SystemConfiguration ConfigurationSettings AppSettings [pass];

//设置logOnInfo参数

logOnInfoConnectionInfoServerName = a;

logOnInfoConnectionInfoDatabaseName = b;

logOnInfoConnectionInfoUserID = c;

logOnInfoConnectionInfoPassword = d;

oRptDatabase Tables []ApplyLogOnInfo (logOnInfo);

//建立rpt文件与CryStalReportviewer文件之间的连接

CrystalReportViewerReportSource = oRpt;

}

整个演示的操作过程说明

在解决方案资源管理器里你需要存放报表文件处添加新项CrystalReport报表起名为crrpt

在随后出现的报表专家中选择数据源时请务必选择OLE DB然后根据你的数据库的要求选择响应的驱动引擎

SQL SERVERMicrosoft OLE DB Provider for SQL server

AccessMicrosoft Jet

输入正确的数据库连接这一步大家一般的情况下不会出错!

建立数据报表并保存crrpt文件

打开webformaspx添加crystalreportviewer控件名称为CrystalReportViewer

在webformaspxcs中的page_load事件中添加上面的代码

(注意引用千万不要忘了!)

*****************************************************

下面是nfig中与本内容有关的细节

<appSettings>

<add key=servername value=www/>

<add key=database value=archives/>

<add key=userid value=admin/>

<add key=pass value=/>

</appSettings>

***注意这里的<add key=pass value=/>是pass所以他必须与

//获取password

d=SystemConfiguration ConfigurationSettings AppSettings [pass];这里

的AppSettings[pass] 中的pass保持一致 当然名字是可以随便起但必须一致

               

上一篇:ASP.NET的GET和POST的区别

下一篇:ASP.NET MVC Razor视图引擎攻略