我还是C#的新手并且报告,为了采取措施,我开始使用一张桌子的Crystal Report。
最终我发现它并且它的工作非常出色。
然后我在报告中添加了另一张表。我的代码中没有更改任何内容。将第二个表中的字段添加到报表中会生成空白报表。
再次删除该字段(因此报表上没有第二个表的列),报表再次生成数据。
所以我觉得问题出在报告方面。但无论如何我已经包含了代码:
private void Load_Ord_Rep()
{
using (MySqlConnection conn = new MySqlConnection(OTW.Properties.Settings.Default.wcdbConnectionString))
{
conn.Open();
String sql = "SELECT * FROM wcdb.order_table, wcdb.mat_table WHERE order_no = '13661' and order_table.mat_code = mat_table.mat_code";
using (MySqlCommand cmdSel = new MySqlCommand(sql, conn))
{
DataSet ds = new DataSet();
MySqlDataAdapter da = new MySqlDataAdapter(cmdSel);
da.Fill(ds);
ReportDocument rpt = new ReportDocument();
rpt.Load("C:\\Visual Studio 2008\\Projects\\OTW\\OTW\\CrystalReport3.rpt");
dataView1.Table = ds.Tables[0];
rpt.SetDataSource(dataView1);
crystalReportViewer1.ReportSource = rpt;
crystalReportViewer1.Refresh();
}
conn.Close();
}
}
经过进一步调查,我得出的结论是问题不是代码或链接,而是第二个表的加载。我做了一个外连接,值相等或更大。只有第一个表的结果显示在报告上。因此,由于未读取第二个表的值,因此无法在两个表之间建立连接,因此报表上没有数据。现在问题是:为什么Crystal Report没有读取第二个表格??
更新
我从主报告中删除了第二个表格,并添加了包含数据的子报告。与以前相同的结果。 sup报告显示空白。它自己运行sup报告(作为主报告),它正确填充。我正在使用MySQL,那么它可能是数据库问题吗?
更新
我创建了一个新应用,这次使用ODBC(而不是ADO.NET)将报告连接到数据库。它的效果非常好。现在弄清楚为什么ADO.Net不起作用....因为我的整个程序都是基于它。
答案 0 :(得分:0)
检查水晶报告中两个表之间的链接。它们是否符合您的期望?
通过
检查Field Explorer> DataBaseFields> (RightClick)DatabaseExpert> (见标签)链接
答案 1 :(得分:0)
您无需执行使用数据集/数据视图执行的任何代码。我建议你允许报告“拉”数据(你现在正在“推送”数据到报告)。
要提取数据,只需要以下内容:
ReportDocument rpt = new ReportDocument();
rpt.Load("C:\\Visual Studio 2008\\Projects\\OTW\\OTW\\CrystalReport3.rpt");
rpt.SetDataBaseLogon("userName", "password", "servername", "database");
crystalReportViewer1.ReportSource = rpt;
这样可以通过传入数据视图来降低报告混乱的风险,因为数据视图不知道如何在设计报表时映射到您添加的表格。 (我现在99.999%肯定会发生这种情况。)
如果您需要设置任何代码,则上面的所有代码都缺少参数。看起来您可能正试图“推送”数据,因为您想过滤该订单号或其他内容?如果是这样的情况下,添加一个“记录选择公式”您的报告中,它的基础是在一个水晶报表参数公式“其中”方面并添加rpt.SetParameter(参数)线到我提供的代码。
不,这不是许可限制,我很确定。
成功排查路径:
1)使用简单代码加载报告: *没有错误,但报告中没有数据
2)在报告中使用了加入选项: *即使只有一张桌子,也会产生空白报告 *关注第二张表不读数据
3)通过“记录选择公式”检查记录过滤,这可能会限制/阻止返回行 *在这种情况下,不适用
4)分析了联接是如何完成的: [“这可能就是你加入的方式。例如:如果你对第二个表做了一个正确的外连接并且它没有数据,那么即使第一个表的行也不会回来。”]
5)尝试通过将第二个表的数据放入子报表并将子报表链接到同一个“mat_code”字段来加载第二个表的数据:
(有用的教程:http://vb.net-informations.com/crystal-report/vb.net_crystal_report_subreport.htm)
6)检查表的连接和定义与报告提交或加载的实际数据结构/内容之间是否不匹配。建议进行具体测试,请访问: i)'设置数据库位置'(您管理报告的表) ii)查看是否使用了XML / DataSet而不是OLEDB iii)将数据库表位置更改为相同的表,但使用OLEDB连接类型(对所有表重复)
7)仍然高度怀疑数据表定义和连接类型。建议进行以下测试: i)使用简单的测试代码制作一个全新的1页应用程序。 ii)从一开始使用 OLEDB 制作一份仅包含“订单”和“材料”表的新报告 iii)仅将主表中的mat_code字段添加到报告中 iv)为mat_code上链接的“材料”添加子报告 v)仅在子报表上显示mat_code vi)运行应用程序
如果数据显示,则问题是:
答案1:数据库定义(在报告首次发布时通过ADO.NET连接到表中时读取)与以后加载报告时找到的实际数据表/列定义不匹配(即有人编辑了“材料”表来更改列定义或字段数等。)
答案2:将ADO.NET数据推送到报表所需的Crystal Reports和Windows驱动程序的特定组合可能存在缺陷。在OLEDB上使用拉数据模型可能会解决一些问题。可以使用最新的Crystal Reports和/或Windows驱动程序(即修补程序或Windows更新,驱动程序包等)解决这些问题。