Я пытаюсь заполнить 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
(в противном случае она читает только последнюю). Кто-нибудь может объяснить, почему это происходит и как это можно исправить?
Edit:
Когда я впервые опубликовал вопрос, я сказал, что он пропускает первый ряд; позже я понял, что он на самом деле только прочитал последнюю строку, и я соответственно отредактировал текст (в то время все записи были сгруппированы в две строки, и казалось, что первая пропускается, когда фактически отображается только последняя). Это может быть вызвано тем, что у него не было уникального идентификатора, по которому можно было бы различать строки, возвращаемые MySQL, поэтому добавление оператора ORDER BY
заставило его создать уникальный идентификатор для каждой строки.
Это всего лишь теория, и мне нечего ее поддержать, но все мои тесты, похоже, дают один и тот же результат.