如何为VB.Net项目中所有Crystal Reports设置全局连接字符串
复用全局连接字符串给Crystal Reports的实现方案
当然可以!你完全可以复用现有的全局连接字符串来配置Crystal Reports的数据源,不用单独设置DSN或者重复编写连接信息,这样单点维护的优势就能延续到报表模块里。下面给你两种实用的实现方法,都是在项目内部(比如模块中)完成的:
方法一:基于现有全局连接字符串封装通用报表连接方法
这种方法直接复用你已经在模块中维护的connString,通过一个通用方法给所有Crystal Reports动态赋值连接信息:
1. 模块中添加通用配置方法
在你的全局模块里新增一个专门用于设置报表连接的方法,解析现有连接字符串并应用到报表的所有表:
Module GlobalSettings ' 你的现有全局连接字符串 Public connString As String = "Data Source=192.168.1.11,1433;Network Library=DBMSSOCN;Initial Catalog=MY_DB;User Id=sa;Password=abc@1234.;" ' 通用方法:为Crystal Reports设置统一连接 Public Sub SetCrystalReportConnection(ByVal report As CrystalDecisions.CrystalReports.Engine.ReportDocument) Try ' 用SqlConnectionStringBuilder解析连接字符串参数,避免手动拆分 Dim connBuilder As New System.Data.SqlClient.SqlConnectionStringBuilder(connString) ' 遍历报表中的所有数据表,逐个设置登录信息 For Each table As CrystalDecisions.CrystalReports.Engine.Table In report.Database.Tables Dim tableLogOnInfo As CrystalDecisions.Shared.TableLogOnInfo = table.LogOnInfo Dim connectionInfo As CrystalDecisions.Shared.ConnectionInfo = tableLogOnInfo.ConnectionInfo ' 赋值连接参数 connectionInfo.ServerName = connBuilder.DataSource connectionInfo.DatabaseName = connBuilder.InitialCatalog connectionInfo.UserID = connBuilder.UserID connectionInfo.Password = connBuilder.Password connectionInfo.Type = CrystalDecisions.Shared.ConnectionInfoType.SQL ' 将配置应用到当前表 table.ApplyLogOnInfo(tableLogOnInfo) ' 修正表的归属(避免报表找不到表的情况) table.Location = $"{connBuilder.InitialCatalog}.{table.Location.Split(".").Last()}" Next ' 处理子报表(如果你的报表包含子报表,必须加上这段) For Each subReportObj As CrystalDecisions.CrystalReports.Engine.SubreportObject In report.ReportDefinition.ReportObjects.OfType(Of CrystalDecisions.CrystalReports.Engine.SubreportObject)() Dim subReportDoc As CrystalDecisions.CrystalReports.Engine.ReportDocument = subReportObj.OpenSubreport(subReportObj.SubreportName) ' 递归调用,给子报表也设置连接 SetCrystalReportConnection(subReportDoc) Next Catch ex As Exception MsgBox($"报表连接配置失败:{ex.Message}") End Try End Sub End Module
2. 在窗体中调用方法显示报表
在需要展示报表的窗体里,实例化报表后调用这个通用方法即可:
Private Sub btnShowReport_Click(sender As Object, e As EventArgs) Handles btnShowReport.Click ' 实例化你的Crystal报表类(替换成你实际的报表类名) Dim salesReport As New SalesSummaryReport() ' 调用模块中的方法设置连接 GlobalSettings.SetCrystalReportConnection(salesReport) ' (可选)如果报表需要参数,在这里赋值 ' salesReport.SetParameterValue("StartDate", dtpStart.Value) ' salesReport.SetParameterValue("EndDate", dtpEnd.Value) ' 将报表绑定到查看器 CrystalReportViewer1.ReportSource = salesReport End Sub
方法二:将连接字符串存入配置文件,模块中统一读取
如果想让连接字符串的修改更灵活(不用重新编译项目),可以把连接字符串移到app.config配置文件中,模块里统一读取,同时供业务代码和报表使用:
1. 在app.config中添加连接字符串
打开项目的app.config文件,添加如下配置:
<configuration> <connectionStrings> <add name="MyDBConnection" connectionString="Data Source=192.168.1.11,1433;Network Library=DBMSSOCN;Initial Catalog=MY_DB;User Id=sa;Password=abc@1234.;" providerName="System.Data.SqlClient"/> </connectionStrings> </configuration>
2. 模块中读取配置并复用方法
修改你的全局模块,从配置文件读取连接字符串,通用报表配置方法和方法一完全一致:
Module GlobalSettings ' 从配置文件读取全局连接字符串(只读,确保不会被意外修改) Public ReadOnly Property connString As String Get Return System.Configuration.ConfigurationManager.ConnectionStrings("MyDBConnection").ConnectionString End Get End Property ' 通用报表连接配置方法(和方法一完全相同,直接复用) Public Sub SetCrystalReportConnection(ByVal report As CrystalDecisions.CrystalReports.Engine.ReportDocument) ' 代码同方法一,这里省略 End Sub End Module
注意事项
- 确保你的项目已经引用了以下程序集:
CrystalDecisions.CrystalReports.EngineCrystalDecisions.SharedSystem.Configuration(使用方法二时需要)
- 如果报表包含子报表,一定要处理子报表的连接配置,否则子报表会无法加载数据
- 连接字符串中的密码如果有特殊字符,确保已经正确转义(比如你的密码中的
@不需要转义,SqlConnectionStringBuilder会自动处理)
内容的提问来源于stack exchange,提问作者lakshitha dilhan
相关产品推荐
相关产品推荐

