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

使用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

问题原因

  1. 数据源结构不匹配:代码中用myAdapter.Fill(myData)填充DataSet时,默认生成的表名为Table,但报表绑定的数据源表名是PROPOSALS,Crystal Reports无法匹配,因此仍尝试通过DSN连接数据库。
  2. 报表残留DSN依赖:设计报表时绑定了DSN,即使代码中设置了DataSet数据源,报表仍可能残留原有DSN的连接配置,触发登录验证。
  3. 64位/32位兼容性冲突:Crystal Reports部分组件仅支持32位,若项目目标平台设为64位,与32位CR组件或ODBC驱动存在兼容性问题。
  4. 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:

  1. 打开MySQL命令行工具,登录root用户
  2. 执行以下命令:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的root密码';
FLUSH PRIVILEGES;
  1. 重启MySQL服务,重新测试报表登录

内容的提问来源于stack exchange,提问作者J. Buhrer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 19:13:23