VB.NET程序部署后Crystal Report Viewer运行时反复要求输入登录账号密码
解决方案
问题根因
- Crystal Report设计时会硬编码存储数据源的连接配置,部署到其他设备后开发环境的路径、权限配置失效,就会触发登录弹窗
- 仅设置主报表的登录信息无法解决问题,主报表和所有子报表都需要单独配置数据库登录凭证
代码插入位置
在你初始化ReportDocument对象之后,将报表绑定到CrystalReportViewer控件之前插入代码即可。
完整代码示例(VB.NET)
' 1. 初始化报表对象 Dim myreport As New ReportDocument() myreport.Load("你的rpt文件实际存储路径") ' 2. 配置主报表的数据库登录信息,Access默认用户名为Admin,无密码 myreport.SetDatabaseLogon("Admin", "") ' 3. 遍历配置所有子报表的登录信息,这步是缺失的关键步骤 For Each subReport As ReportDocument In myreport.Subreports subReport.SetDatabaseLogon("Admin", "") Next ' 4. 可选:如果部署后Access数据库路径有变化,动态修改连接路径(避免硬编码开发机路径报错) Dim connInfo As New ConnectionInfo() connInfo.ServerName = AppDomain.CurrentDomain.BaseDirectory & "report.accdb" ' 示例:数据库放在程序运行目录 connInfo.UserID = "Admin" connInfo.Password = "" ' 应用到主报表所有表 For Each table As Table In myreport.Database.Tables Dim tableLogonInfo As TableLogOnInfo = table.LogOnInfo tableLogonInfo.ConnectionInfo = connInfo table.ApplyLogOnInfo(tableLogonInfo) Next ' 应用到所有子报表的表 For Each subReport As ReportDocument In myreport.Subreports For Each table As Table In subReport.Database.Tables Dim tableLogonInfo As TableLogOnInfo = table.LogOnInfo tableLogonInfo.ConnectionInfo = connInfo table.ApplyLogOnInfo(tableLogonInfo) Next Next ' 5. 绑定到查看控件 CrystalReportViewer1.ReportSource = myreport CrystalReportViewer1.Refresh()
注意事项
- MS Access默认的登录账号是
Admin,无密码,无特殊配置不要填写其他账号;如果你的Access数据库单独设置了打开密码,把上述代码中的""(空密码)替换为实际的数据库密码即可 - 不要硬编码开发机的
C:\User\Documents\report.accdb路径,建议把数据库放在程序运行目录,用AppDomain.CurrentDomain.BaseDirectory动态获取路径 - 目标设备需要安装和你开发版本一致的Crystal Report运行时,避免出现兼容性报错
内容的提问来源于stack exchange,提问作者junjun09
相关产品推荐
相关产品推荐

