.NET DataTable пропускает строки при загрузке (DataReader) - PullRequest
19 голосов
/ 23 октября 2008

Я пытаюсь заполнить 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 заставило его создать уникальный идентификатор для каждой строки.
Это всего лишь теория, и мне нечего ее поддержать, но все мои тесты, похоже, дают один и тот же результат.

Ответы [ 13 ]

0 голосов
/ 03 августа 2010

В моем случае не работают ни ORDER BY, ни dt.AcceptChanges (). Я не знаю, почему эта проблема. У меня есть 50 записей в базе данных, но это только 49 в базе данных. пропуская первую строку, и если в устройстве чтения данных есть только одна запись, она вообще ничего не показывает.

что такое bizzareeee .....

0 голосов
/ 28 октября 2008

Вы пытались дозвониться до dt.AcceptChanges() после звонка dt.Load(cmd.ExecuteReader()), чтобы посмотреть, поможет ли это?

0 голосов
/ 28 октября 2008

Не уверен, почему вам не хватает строки в таблице данных, возможно, вам нужно закрыть ридер? В любом случае, вот как я обычно загружаю отчеты, и это работает каждый раз ...

        Dim deals As New DealsProvider()
        Dim adapter As New ReportingDataTableAdapters.ReportDealsAdapter
        Dim report As ReportingData.ReportDealsDataTable = deals.GetActiveDealsReport()
        rptReports.LocalReport.DataSources.Add(New ReportDataSource("ActiveDeals_Data", report))

Любопытно посмотреть, если это все еще происходит.

...