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

Crystal Report加载无数据问题求助(WinForms场景)

Crystal Report加载后无数据显示(已确认数据源有数据)

以下是针对该问题的排查与解决步骤:

  • 表名匹配检查
    Crystal Report对数据源表名的大小写、拼写严格敏感。确认代码中Fill(dataSet, "表名")的表名,与报表设计器中绑定的表名完全一致。比如代码中填充的"IMAGO_RPT_IRD_IRDCHQ",需和报表数据库字段中的表名完全匹配,包括大小写。

  • 参数映射验证
    若报表设计时定义了参数(如@FROM、@TO),需在代码中显式传递参数值,否则报表可能因参数过滤导致无数据:

    oCRDoc.SetParameterValue("@FROM", fromDate);
    oCRDoc.SetParameterValue("@TO", toDate);
    oCRDoc.SetParameterValue("@PROFILE_ID", profileId);
    

    注意参数名称需与报表中定义的完全一致。

  • 数据集结构一致性
    检查IWD0001数据集的列名、数据类型,是否与报表绑定的字段完全匹配。例如存储过程返回的列名若与报表字段名不符,或数据类型不兼容(如DateTime vs String),会导致数据无法渲染。可通过调试查看dataSet中各DataTable的结构,与报表设计器字段对比。

  • 报表数据源重新绑定
    确保报表设计时使用的是项目中的IWD0001数据集作为数据源,而非直接绑定数据库连接。若之前是直接绑定数据库,需重新操作:打开报表设计器 → 数据库 → 数据库专家 → 选择项目中的IWD0001数据集,重新绑定所有字段。

  • 刷新方法修正
    代码中最后调用的Refresh()是窗体的刷新方法,需替换为CrystalViewer的报表刷新方法:

    crystalViewer.ReportSource = oCRDoc;
    crystalViewer.RefreshReport(); // 替换原Refresh()
    
  • 重置报表连接信息
    即使代码中数据源有数据,Crystal Report可能仍使用设计时的旧连接配置,需重置连接:

    foreach (Table table in oCRDoc.Database.Tables)
    {
        TableLogOnInfo logOnInfo = table.LogOnInfo;
        logOnInfo.ConnectionInfo.ConnectionString = IMAGO.Common.Portal.Switcher.GetConnectionString(product);
        table.ApplyLogOnInfo(logOnInfo);
    }
    

原始代码参考

报表加载事件代码

private void frmIWDReportViewer_Load(object sender, EventArgs e)
{
    try
    {
        oCRDoc.Load(fileFullPath);

        switch (reportName)
        {
            case "IWD0001.rpt":
                IWD0001 IWD0001 = GetIWD0001Data(fromDate, toDate, profileId);
                oCRDoc.SetDataSource(IWD0001);
                break;

            default:
                break;
        }

        crystalViewer.ReportSource = oCRDoc;
        Refresh();
    }
    catch(Exception ex) 
    {
        DMSLogger.Write(ex);
        MessageBox.Show(ex.Message.ToString());
    }
}

数据源获取方法

public IWD0001 GetIWD0001Data(int product, DateTime fromDate, DateTime toDate, int profileId)
{
    IWD0001 dataSet = new IWD0001();

    try
    {
        using (SqlConnection connection = new SqlConnection(IMAGO.Common.Portal.Switcher.GetConnectionString(product)))
        {
            connection.Open();

            // 调用第一个存储过程:IMAGO_RPT_IRD_IRDCHQ
            using (SqlCommand command1 = new SqlCommand("IMAGO_RPT_IRD_IRDCHQ", connection))
            {
                command1.CommandType = CommandType.StoredProcedure;

                command1.Parameters.Add(new SqlParameter("@FROM", fromDate));
                command1.Parameters.Add(new SqlParameter("@TO", toDate));

                using (SqlDataAdapter adapter1 = new SqlDataAdapter(command1))
                {
                    adapter1.Fill(dataSet, "IMAGO_RPT_IRD_IRDCHQ");
                }
            }

            // 调用第二个存储过程:IMAGO_RPT_GET_BRANCHES
            using (SqlCommand command2 = new SqlCommand("IMAGO_RPT_GET_BRANCHES", connection))
            {
                command2.CommandType = CommandType.StoredProcedure;

                command2.Parameters.Add(new SqlParameter("@PROFILE_ID", profileId));

                using (SqlDataAdapter adapter2 = new SqlDataAdapter(command2))
                {
                    adapter2.Fill(dataSet, "IMAGO_RPT_GET_BRANCHES");
                }
            }

            // 查询MSYSTEMSETTING表
            string sqlQuery2 = "SELECT * FROM MSYSTEMSETTING";

            using (SqlCommand command3 = new SqlCommand(sqlQuery2, connection))
            {
                using (SqlDataAdapter adapter2 = new SqlDataAdapter(command3))
                {
                    adapter2.Fill(dataSet, "MSYSTEMSETTING");
                }
            }
        }
    }
    catch (Exception ex)
    {
        DMSLogger.Write(ex);
        throw; // 确保异常被重新抛出或按需处理
    }

    return dataSet;
}

内容的提问来源于stack exchange,提问作者Jinushi Rajapaksha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 18:05:56