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
相关产品推荐
相关产品推荐

