You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

解决方案

问题核心是你单独实例化了子报表对象,但该对象和主报表中嵌入的子报表并非同一个实例,导致连接配置没有生效。正确做法是直接操作主报表内的子报表对象:

  1. 移除单独实例化subrpt的代码,通过主报表的Subreports集合获取嵌入的子报表对象
  2. 遍历子报表的所有数据源连接,确保全部配置数据库参数
  3. 直接在该子报表对象上设置参数

修改后的代码如下:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 12:56:17