我正在尝试使用以下内容填充 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 包含两行,但 DataTable 仅在 SQL 查询字符串包含时读取这两行ORDER BY
(否则它只读取最后一行)。谁能解释为什么会发生这种情况以及如何解决?
编辑:
当我第一次发布问题时,我说它跳过了第一行;后来我意识到它实际上只读取了最后一行,并且我已经相应地编辑了文本(当时所有记录都分为两行,当它实际上只显示最后一行时,它似乎跳过了第一行)。这可能是由于它没有唯一标识符来区分 MySQL 返回的行,因此添加ORDER BY
语句会导致它为每行创建唯一标识符。
这只是一个理论,我没有任何证据支持它,但我所有的测试似乎都得出了相同的结果。