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