Я пытаюсь заполнить DataTable, чтобы построить LocalReport, используя следующее:
.NET DataTable пропускает строки на Load (DataReader)
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
вызвало его создание уникального идентификатора для каждой строки.
Это всего лишь теория, и мне нечего ее поддерживать, но все мои тесты, похоже, приводят к такому же результату.
Mod + 1 потому что я программировал .NET и ADO.NET каждый день с момента первых попыток, и я никогда не знал, что могу просто вызвать dt.Load() без DataAdapter. Вздох. – 2008-10-27 01:16:38
Аналогичная ситуация здесь, Дейв. Я узнал об этом всего около месяца назад. – 2008-10-27 19:55:31
Сегодня я опубликовал дублированный вопрос (https://stackoverflow.com/questions/28676382/datatable-load-shows-less-rows-than-source-datareader), который в конечном итоге был разрешен путем переноса запроса. Я хочу подчеркнуть, что это ** только ** происходит на MYSQL. Это не происходит на SQLSERVER.I думаю, что проблема не должна быть вызвана компонентом DataTable, а скорее может быть ошибкой в Mysql-коннекторе. Есть предположения? – 2015-02-23 17:15:35