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