22

以下を使用して、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ステートメントを追加すると、各行に一意の識別子が作成されたことが原因である可能性があります。
これは単なる理論であり、私はそれを支持するものは何もありませんが、私のテストはすべて同じ結果につながるようです.

4

14 に答える 14

9

かなりいじった後、DataTable.Loadメソッドが基になるデータに主キー列を期待していることがわかりました。ドキュメントを注意深く読むと、これは明白になりますが、明確には述べられていません。

「id」という名前の列がある場合、それを使用しているようです(これで修正されました)。それ以外の場合は、最初の列が一意であるかどうかに関係なく、最初の列を使用しているように見え、読み取り時にその列の同じ値で行を上書きします。「id」という名前の列がなく、最初の列が一意でない場合は、データリーダーをロードする前に、データテーブルの主キー列を明示的に設定することをお勧めします。

于 2012-02-09T11:43:07.600 に答える
6

誰かが癌患者と同様の問題を抱えている場合に備えて、私は If DataReader.Read... の代わりにIf ... を使用してDoh!DataReader.HasRowsに電話する前に存在を確認していました。dt.load(DataReader)

于 2011-01-09T17:18:06.357 に答える
4

私も同じ問題を抱えていました。私はあなたのブログからヒントを得て、クエリにORDER BY句を入れて、クエリによって返されるすべてのレコードの一意のキーを一緒に形成できるようにしました。それは問題を解決しました。ちょっと変だ。

于 2009-01-17T07:59:02.763 に答える
4

使用しないでください

dr.Read()

ポインタを次の行に移動するためです。この行を削除してください。

于 2013-12-09T13:23:47.503 に答える
4

同じ問題がありました。これは、すべての行の主キーが同じであるためです。これはおそらく結果のキー入力に使用されているものであるため、同じ行を何度も上書きしているだけです。

Datatables.Load は、fill メソッドがどのように機能するかを理解するためにポイントします。このページには、主キー対応であると記載されています。主キーは一度しか発生せず、行のキーとして使用されるため...

次に、Fill 操作は、DataSet 内の宛先 DataTable オブジェクトに行を追加し、DataTable オブジェクトがまだ存在しない場合は作成します。DataTable オブジェクトを作成するとき、Fill 操作は通常、列名のメタデータのみを作成します。ただし、MissingSchemaAction プロパティが設定されている場合AddWithKey に対して、適切な主キーと制約も作成されます。」(http://msdn.microsoft.com/en-us/library/zxkb3c3d.aspx)

于 2012-02-28T20:51:16.927 に答える
4

今日、この問題に遭遇しました。

残念ながら、このスレッドでは何も修正されませんでしたが、SQL クエリを別の SELECT ステートメントでラップしたところ、問題なく動作しました。

例えば:

SELECT * FROM (
    SELECT ..... < YOUR NORMAL SQL STATEMENT HERE />
) allrecords

変....

于 2014-04-15T12:16:47.710 に答える
1

SQL プロファイラーから実行されている実際のクエリを取得して実行してみてください。それはあなたが期待したものではないかもしれません。

SqlDataAdapter.Fill(dataTable) を使用すると同じ結果が得られますか?

リーダーでさまざまなコマンド動作を試しましたか? MSDN ドキュメント

于 2008-10-23T11:52:16.620 に答える
1

私はこれが古い質問であることを知っていますが、アクセスデータベースにクエリを実行し、クエリから1行が欠落していることに気付いたときに機能したと思うのは、次を変更することでした:-

    if(dataset.read())  - Misses a row.

    if(dataset.hasrows) - Missing row appears.
于 2016-04-28T08:52:57.540 に答える
0

私の場合、ORDER BY も dt.AcceptChanges() も機能していません。なぜその問題なのかわかりません。データベースには 50 のレコードがありますが、データテーブルには 49 しか表示されません。最初の行をスキップし、datareader にレコードが 1 つしかない場合、何も表示されません。

なんてビザリィ……。

于 2010-08-03T16:50:23.803 に答える
0

電話dt.AcceptChanges()の後にdt.Load(cmd.ExecuteReader())電話してみて、それが役立つかどうかを確認しましたか?

于 2008-10-28T14:37:31.317 に答える
0

データテーブルの行が見つからない理由がわかりません。リーダーを閉じる必要がある可能性はありますか? いずれにせよ、これが私が通常レポートをロードする方法であり、毎回機能します...

        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))

それがまだ起こるかどうか興味があります。

于 2008-10-27T21:15:32.997 に答える