以下を使用して、LocalReport を作成するために、DataTable にデータを入力しようとしています。
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);
ある時点で、レポートが不完全で、1 つのレコードが欠落していることに気付きました。クエリが正確に 2 行を返すように、いくつかの条件を変更しました...驚き: レポートには 2 行ではなく 1 行しか表示されません。問題がどこにあるかを見つけるためにデバッグしようとしましたが、行き詰まりました
dt.Load(cmd.ExecuteReader());
DataReader
に 2 つのレコードがDataTable
含まれているのに 1 つしか含まれていないことに気付いたとき。偶然、ORDER BY
クエリに句を追加したところ、今度はレポートが正しく表示されていることに気付きました。
どうやら、DataReader には 2 つの行が含まれていますが、DataTable は、SQL クエリ文字列に が含まれている場合にのみ両方を読み取りますORDER BY
(それ以外の場合は、最後の行のみを読み取ります)。なぜこれが起こっているのか、どうすれば修正できるのか、誰でも説明できますか?
編集:
最初に質問を投稿したとき、最初の行をスキップしていると言いました。後で、実際には最後の行しか読み取っていないことに気付き、それに応じてテキストを編集しました (当時、すべてのレコードが 2 つの行にグループ化されていて、実際には最後の行しか表示されていないときに最初のレコードをスキップしているように見えました)。これは、MySQL によって返された行を区別するための一意の識別子がなかったため、ORDER BY
ステートメントを追加すると、各行に一意の識別子が作成されたことが原因である可能性があります。
これは単なる理論であり、私はそれを支持するものは何もありませんが、私のテストはすべて同じ結果につながるようです.