Crystal Report用模型创建还是直连SQL Server更优?部署如何配服务器名
Crystal Report 实现方案选型及部署配置指南
两种实现方式的优劣势对比
- 直连SQL Server(拉模式):报表在运行时自动驱动数据库连接拉取所需数据,开发阶段调试成本低,不会出现空值报错、数据库登录弹窗类问题,适合快速开发数据源固定、逻辑简单的报表。缺点是报表文件本身耦合了数据库连接配置,多环境部署时如果逐个修改配置效率极低,且不方便在业务层做行级数据权限过滤、多数据源拼接等自定义逻辑。
- 模型传值(推模式):由MVC的业务层完成数据查询、计算、权限过滤后,将结构化数据集传给报表渲染,和底层数据库完全解耦,是分层架构下更规范的实现方式。碰到的两类报错都属于配置疏漏,不是模式本身的问题:
- 「不允许空值」报错:通常是传入报表的数据集字段和报表设计时绑定的架构字段不匹配,比如字段名不一致、标记为非空的字段传入了null值、数据集表名和报表定义的表名不对应。
- 数据库登录异常:是代码中没有完全覆盖报表自带的默认连接配置,哪怕已经传入了自定义数据集,只要没清空报表内置的连接信息,运行时就会尝试用设计时保存的数据库凭据发起连接,触发登录弹窗。
大量直连报表的服务器名统一修改方案
如果选择直连模式,完全不需要逐个打开报表文件修改服务器配置,推荐用运行时动态覆写连接的方案,一次配置适配所有环境:
在项目里封装一个全局的报表连接初始化公共方法,所有报表加载完成、渲染前都调用这个方法注入当前环境的数据库连接信息,部署时只需要修改配置文件中的数据库参数即可,不需要改动任何报表文件或业务代码,核心实现参考:
private void ApplyDbConnection(ReportDocument reportDoc) { // 从配置文件读取当前环境的数据库参数,不同部署环境只需要改配置文件 string dbServer = ConfigurationManager.AppSettings["CrystalReportDbServer"]; string dbName = ConfigurationManager.AppSettings["CrystalReportDbName"]; string dbUser = ConfigurationManager.AppSettings["CrystalReportDbUser"]; string dbPwd = ConfigurationManager.AppSettings["CrystalReportDbPassword"]; // 处理主报表的表连接 foreach (Table table in reportDoc.Database.Tables) { TableLogOnInfo logInfo = table.LogOnInfo; logInfo.ConnectionInfo.ServerName = dbServer; logInfo.ConnectionInfo.DatabaseName = dbName; logInfo.ConnectionInfo.UserID = dbUser; logInfo.ConnectionInfo.Password = dbPwd; table.ApplyLogOnInfo(logInfo); } // 处理所有子报表的连接 foreach (ReportObject reportObj in reportDoc.ReportDefinition.ReportObjects) { if (reportObj is SubreportObject subreportObj) { ReportDocument subreport = reportDoc.OpenSubreport(subreportObj.SubreportName); foreach (Table table in subreport.Database.Tables) { TableLogOnInfo logInfo = table.LogOnInfo; logInfo.ConnectionInfo.ServerName = dbServer; logInfo.ConnectionInfo.DatabaseName = dbName; logInfo.ConnectionInfo.UserID = dbUser; logInfo.ConnectionInfo.Password = dbPwd; table.ApplyLogOnInfo(logInfo); } } } }
如果需要批量修改报表文件本身存储的默认连接信息,可以写一个轻量控制台程序遍历所有.rpt文件,替换文件内存储的旧服务器名字符串即可,操作前注意备份原报表文件。
内容的提问来源于stack exchange,提问作者Ahmad Alian Ashour
相关产品推荐
相关产品推荐

