我们在开发平台上建立的水晶报表,在部署到客户机时,会面临这样的问题:客户机的数据库名称或数据库用户帐户和开发平台上的不同,导致报表无法打开。虽然我们可以提前将水晶报表的数据源改为与客户端环境一致,但这样太过麻烦。如果有上百张报表的话,就算仅有10个客户,也会浪费大量的时间。其实,我们在设计和部署时可以不必关注水晶报表的数据源,而是在程序运行时通过代码来动态设置其数据源,以简化水晶报表的部署过程。
首先我们需要建立一个窗体,用于加载报表。在窗体上添加crystalReportViewer控件,用于承载报表,在此例中将其命名为crvReporter。
然后在需要加载报表的代码段写入如下代码(此例中写在了Form_Load事件中,也就是窗体一打开就开始加载报表): 这样一段代码就实现了将应用程序文件夹中的Reports子文件夹中的报表ReportA加载并显示于Form窗体中的功能。在这里,我们并不关心ReprotA的数据源如何设定,而是通过CrystalDecisions.Shared.TableLogOnInfo对象新建了一个数据源信息,并用其更新了ReportA的数据源。这样即使ReportA设定的数据源与客户端环境不同,也不会有影响了。
![ContractedBlock.gif](/Images/OutliningIndicators/ContractedBlock.gif)
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
//新建数据库登陆信息对象
CrystalDecisions.Shared.TableLogOnInfo logOnInfo = new CrystalDecisions.Shared.TableLogOnInfo();
//设置连接参数
logOnInfo.ConnectionInfo.ServerName = "(local)";
logOnInfo.ConnectionInfo.DatabaseName = "Bookshop";
logOnInfo.ConnectionInfo.IntegratedSecurity = true;
//新建报表对象
CrystalDecisions.CrystalReports.Engine.ReportDocument reporter = new CrystalDecisions.CrystalReports.Engine.ReportDocument();
//定义报表加载路径和名称
string path = Application.StartupPath + "\\Reports\\" + ReportA + ".rpt";
reporter.Load(path);
//定义报表的数据库登陆信息
reporter.Database.Tables[0].ApplyLogOnInfo(logOnInfo);
//将报表绑定到CrystalReportViewer控件上
crvReporter.ReportSource = reporter;
在信息连接参数处,我们用了如下代码,分别指定了服务器名称和数据库名称: 在实际环境中,我们应该将服务器名称和数据库名称存入配置文件中,然后在运行时读取并赋值给连接参数。这样在变更客户端环境时,我们仅需要更改配置文件,就可以保证水晶报表能够得到正确的数据源而不用重新进行编译。
![ContractedBlock.gif](/Images/OutliningIndicators/ContractedBlock.gif)
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
logOnInfo.ConnectionInfo.ServerName = "(local)";
logOnInfo.ConnectionInfo.DatabaseName = "Bookshop";
在登陆方式中,我们使用了集成身份验证,代码如下:当数据库已经为我们的当前登陆账号赋予了访问权限时,我们就可以使用此种方式通过数据库验证。这样的好处是避免了在配置文件中存储用户密码导致的安全性问题。
![ContractedBlock.gif](/Images/OutliningIndicators/ContractedBlock.gif)
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
logOnInfo.ConnectionInfo.IntegratedSecurity = true;
如果不想使用集成身份验证而要使用数据库用户帐号登陆,那么可以使用如下代码: UserId指定了数据库用户名称,Password指定了用户密码。在实际环境中,也应该存储在配置文件里。
![ContractedBlock.gif](/Images/OutliningIndicators/ContractedBlock.gif)
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
//将集成身份验证模式设置为false,此行可以省略
logOnInfo.ConnectionInfo.IntegratedSecurity = false;
logOnInfo.ConnectionInfo.UserID = "username";
logOnInfo.ConnectionInfo.Password = "password";
至此我们就实现了水晶报表在不同客户端的简单加载。