使用Crystal Reports 2020、VB.NET 2022和MySQL时数据库登录窗口问题排查
Crystal Reports 弹出数据库登录框且登录失败问题解决
问题背景
使用VB.NET 2022开发应用,搭配Crystal Reports 2020、MySQL Server 8.0,已配置基于MySQL Connector/ODBC 8.3(64位ANSI驱动)的64位系统DSN,报表“数据源位置”设为该DSN。执行crvViewProposals.ReportSource = myReport时弹出“数据库登录”窗口:DSN和数据库名框灰显,登录ID默认显示root,输入密码后登录失败,勾选“使用集成安全”也无效。已安装最新CR for Visual Studio.Net SP5及MySQL Connector NET 8.3.0,问题未解决。
附带核心代码:
Dim cmd As New MySqlCommand, myAdapter As New MySqlDataAdapter Dim conMyConn As New MySql.Data.MySqlClient.MySqlConnection Dim myReport As New CrystalDecisions.CrystalReports.Engine.ReportDocument Dim sReportFile As String, myData As New DataSet Try conMyConn.ConnectionString = "server=localhost;port=3306;uid=root;pwd=*********;database=mydatabase;" cmd.Connection = conMyConn cmd.CommandText = "SELECT * FROM PROPOSALS" myAdapter.SelectCommand = cmd myAdapter.Fill(myData) sReportFile = "C:\proposals\crProposals.rpt" myReport.Load(sReportFile) myReport.SetDataSource(myData) 'generate the report crvViewProposals.ReportSource = myReport 'set the zoom factor at 100% crvViewProposals.Zoom(100) Catch ex As Exception MessageBox.Show(ex.Message, "Report could not be created", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try
问题原因
- 数据源结构不匹配:代码中用
myAdapter.Fill(myData)填充DataSet时,默认生成的表名为Table,但报表绑定的数据源表名是PROPOSALS,Crystal Reports无法匹配,因此仍尝试通过DSN连接数据库。 - 报表残留DSN依赖:设计报表时绑定了DSN,即使代码中设置了DataSet数据源,报表仍可能残留原有DSN的连接配置,触发登录验证。
- 64位/32位兼容性冲突:Crystal Reports部分组件仅支持32位,若项目目标平台设为64位,与32位CR组件或ODBC驱动存在兼容性问题。
- MySQL 8.0认证方式不兼容:MySQL 8.0默认采用
caching_sha2_password认证,部分旧版本CR驱动不支持该方式,导致登录失败。
解决方案
1. 确保DataSet与报表数据源结构完全匹配
修改代码中填充DataSet的语句,指定表名与报表中的表名一致:
myAdapter.Fill(myData, "PROPOSALS")
这样DataSet中的表名PROPOSALS与报表绑定的表名完全匹配,Crystal Reports会直接使用DataSet中的数据,不再尝试连接数据库。
2. 移除报表的DSN数据源绑定
打开Crystal Reports设计器:
- 点击“数据库”菜单 → “数据源位置”
- 在“当前数据源”中选中绑定的DSN,点击“移除”
- 将“项目数据源”中的对应DataSet(或手动创建的DataSet)添加到“当前数据源”,并确保字段映射完全匹配
- 保存报表,重新编译项目
3. 调整项目目标平台兼容性
- 打开VB.NET项目属性 → “编译” → “高级编译选项”
- 将“目标CPU”设置为
x86(即使系统是64位,Crystal Reports多数版本对32位支持更稳定) - 若使用64位平台,确保安装的ODBC驱动、CR组件均为64位版本,且系统DSN也配置为64位(通过
C:\Windows\System32\odbcad32.exe配置)
4. 强制覆盖报表登录信息(可选)
若上述步骤仍无效,在代码中强制设置报表的数据库连接信息,覆盖原有DSN配置:
myReport.Load(sReportFile) ' 添加以下代码 Dim connectionInfo As New CrystalDecisions.Shared.ConnectionInfo() connectionInfo.ServerName = "localhost" connectionInfo.DatabaseName = "mydatabase" connectionInfo.UserID = "root" connectionInfo.Password = "*********" For Each table As CrystalDecisions.CrystalReports.Engine.Table In myReport.Database.Tables Dim tableLogOnInfo As CrystalDecisions.Shared.TableLogOnInfo = table.LogOnInfo tableLogOnInfo.ConnectionInfo = connectionInfo table.ApplyLogOnInfo(tableLogOnInfo) ' 强制刷新表连接 table.Location = table.Location Next myReport.SetDataSource(myData)
5. 修改MySQL用户认证方式
针对MySQL 8.0的认证问题,将root用户的认证方式改为旧版兼容的mysql_native_password:
- 打开MySQL命令行工具,登录root用户
- 执行以下命令:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的root密码'; FLUSH PRIVILEGES;
- 重启MySQL服务,重新测试报表登录
内容的提问来源于stack exchange,提问作者J. Buhrer
相关产品推荐
相关产品推荐

