VB.NET中Crystal Report含子报表时数据库登录弹窗问题求助
解决Crystal Reports子报表弹出数据库登录窗口的问题
问题场景
无子报表时,以下代码可正常运行:
Dim rpt As New CRaipPrepare rpt.DataSourceConnections.Clear() rpt.DataSourceConnections.Item(0).SetConnection(connection.server, db.aipDB, connection.user, connection.pass) rpt.DataSourceConnections.Item(0).IntegratedSecurity = False 'rpt.Subreports.Item("CRsignatory.rpt").SetDataSource(subrpt) rpt.SetParameterValue("@id", Dashboard.BurgerMenuItem.Tag) rpt.SetParameterValue("@sector", code) rpt.SetParameterValue("@year", Yeardate) rpt.SetParameterValue("@stats", IIf(Prepare.checkfinale(Dashboard.BurgerMenuItem.Tag) = 3, 2, Nothing)) CrystalReportViewer1.ReportSource = rpt CrystalReportViewer1.Refresh() CrystalReportViewer1.Zoom(zooming)
但添加子报表后,即使单独设置了子报表的IntegratedSecurity = False,运行时仍弹出数据库登录窗口,代码如下:
Dim rpt As New CRaipPrepare Dim subrpt As New CRsignatory subrpt.DataSourceConnections.Clear() subrpt.DataSourceConnections.Item(0).SetConnection(connection.server, db.aipDB, connection.user, connection.pass) subrpt.DataSourceConnections.Item(0).IntegratedSecurity = False subrpt.SetParameterValue("@idBrgy", Dashboard.BurgerMenuItem.Tag) subrpt.SetParameterValue("@dateYear", Yeardate) rpt.DataSourceConnections.Clear() rpt.DataSourceConnections.Item(0).SetConnection(connection.server, db.aipDB, connection.user, connection.pass) rpt.DataSourceConnections.Item(0).IntegratedSecurity = False 'rpt.Subreports.Item("CRsignatory.rpt").SetDataSource(subrpt) rpt.SetParameterValue("@id", Dashboard.BurgerMenuItem.Tag) rpt.SetParameterValue("@sector", code) rpt.SetParameterValue("@year", Yeardate) rpt.SetParameterValue("@stats", IIf(Prepare.checkfinale(Dashboard.BurgerMenuItem.Tag) = 3, 2, Nothing)) CrystalReportViewer1.ReportSource = rpt CrystalReportViewer1.Refresh() CrystalReportViewer1.Zoom(zooming)
解决方案
问题核心是你单独实例化了子报表对象,但该对象和主报表中嵌入的子报表并非同一个实例,导致连接配置没有生效。正确做法是直接操作主报表内的子报表对象:
- 移除单独实例化
subrpt的代码,通过主报表的Subreports集合获取嵌入的子报表对象 - 遍历子报表的所有数据源连接,确保全部配置数据库参数
- 直接在该子报表对象上设置参数
修改后的代码如下:
Dim rpt As New CRaipPrepare ' 配置主报表数据库连接 rpt.DataSourceConnections.Clear() rpt.DataSourceConnections.Item(0).SetConnection(connection.server, db.aipDB, connection.user, connection.pass) rpt.DataSourceConnections.Item(0).IntegratedSecurity = False ' 获取主报表中嵌入的子报表对象 Dim subrpt As CrystalDecisions.CrystalReports.Engine.ReportDocument = rpt.Subreports.Item("CRsignatory.rpt") ' 遍历子报表所有连接,统一配置数据库参数 For Each conn As CrystalDecisions.Shared.IConnectionInfo In subrpt.DataSourceConnections conn.SetConnection(connection.server, db.aipDB, connection.user, connection.pass) conn.IntegratedSecurity = False Next ' 设置子报表参数 subrpt.SetParameterValue("@idBrgy", Dashboard.BurgerMenuItem.Tag) subrpt.SetParameterValue("@dateYear", Yeardate) ' 设置主报表参数 rpt.SetParameterValue("@id", Dashboard.BurgerMenuItem.Tag) rpt.SetParameterValue("@sector", code) rpt.SetParameterValue("@year", Yeardate) rpt.SetParameterValue("@stats", IIf(Prepare.checkfinale(Dashboard.BurgerMenuItem.Tag) = 3, 2, Nothing)) CrystalReportViewer1.ReportSource = rpt CrystalReportViewer1.Refresh() CrystalReportViewer1.Zoom(zooming)
额外检查点
- 确认子报表名称
"CRsignatory.rpt"和主报表中嵌入的子报表名称完全一致(注意大小写、后缀) - 检查子报表是否存在多个数据源连接,确保遍历覆盖所有连接
- 验证数据库账号密码拥有子报表数据源的访问权限
内容的提问来源于stack exchange,提问作者Yoyie Guangco
相关产品推荐
相关产品推荐

