我正在尝试填充DataTable,以构建LocalReport,使用以下内容:
MySqlCommand cmd = new MySqlCommand();
cmd.Connection = new MySqlConnection(Properties.Settings.Default.dbConnectionString);
cmd.CommandType = CommandType.Text;
cmd.CommandText = "SELECT ... LEFT JOIN ... WHERE ..."; /* query snipped */
// prepare data
dataTable.Clear();
cn.Open();
// fill datatable
dt.Load(cmd.ExecuteReader());
// fill report
rds = new ReportDataSource("InvoicesDataSet_InvoiceTable",dt);
reportViewerLocal.LocalReport.DataSources.Clear();
reportViewerLocal.LocalReport.DataSources.Add(rds);
有一次,我注意到报告不完整,缺少一条记录。我已经改变了一些条件,以便查询返回两行,然后......
dt.Load(cmd.ExecuteReader());
当我注意到DataReader
包含两个记录但DataTable
只包含一个记录时。无意中,我ORDER BY
在查询中添加了一个子句,并注意到这次报告显示正确。
显然,DataReader包含两行,但如果SQL查询字符串包含一个ORDER BY
(否则它只能读取最后一行),DataTable将只读取它们两个。任何人都可以解释为什么会发生这种情况,以及它如何解决?
当我第一次发布这个问题时,我说它跳过了第一行; 后来我意识到它实际上只是读取最后一行,并且相应地编辑了文本(当时所有记录都分成两行,而实际上只显示最后一行时,它似乎跳过第一行)。这可能是由于它没有用于区分MySQL返回的行的唯一标识符,因此添加ORDER BY
语句导致它为每行创建唯一标识符。
这只是一个理论,我没有任何支持,但我所有的测试似乎导致相同的结果。
发布于 2018-03-12 08:11:55
我有同样的问题。我从博客提取了提示,并在查询中放置了ORDER BY子句,以便它们可以一起为查询返回的所有记录构成唯一键。它解决了这个问题。有点奇怪。
发布于 2018-03-12 09:45:07
这个问题已经有好几年了,但除了上面提到的解决方法之外,我还没有找到合适的答案。
经过相当长的一段时间后,我发现DataTable.Load方法需要在底层数据中使用主键列。如果仔细阅读文档,这就变得很明显,虽然没有明确说明。
如果你有一个名为“ID”的列,它似乎使用了(它修复了我)。否则,它似乎只是使用第一列,不管它是否是唯一的,并且在它们正被读取时覆盖该列中具有相同值的行。如果你没有一个名为“id”的列,并且你的第一列不是唯一的,我建议在加载数据库之前尝试显式设置数据表的主键列。
https://stackoverflow.com/questions/-100007576
复制相似问题