2

MySql .netコネクタを使用してデータを読み取ろうとすると、かなり奇妙なことが起こっています。コードは次のとおりです。

IDataReader reader = null;

using (MySqlConnection connection = new MySqlConnection(this.ConnectionString))
{
    String getSearch = "select * from organization";
    MySqlCommand cmd = new MySqlCommand(getSearch, connection);
    cmd.CommandType = CommandType.Text;

    connection.Open();
    reader = cmd.ExecuteReader();

    while (reader.Read())
    {
        // response write some stuff to the screen (snipped for brevity)
    }
}

ExecuteReaderの後にブレークポイントを設定し、Visual Studioで結果ビューを展開すると(リーダーにカーソルを合わせて展開すると)、クエリによって返される行を確認できます。次に、それを閉じて結果ビューを再度展開すると、「列挙により結果が得られませんでした」というメッセージが表示されます。

リーダーの内容は、表示されるとすぐにリセットされているように見えます。

私たちが試したことについては: -SQLは
DBに直接正常に実行されます
-クエリの結果をデータグリッドに直接バインドすると、空のデータグリッドが返されます-.net
コネクタの最新バージョンを取得しました-2
つの異なるマシンで試してみましたローカルエラーを除外する

これまでのところ何も機能していません。

誰かが何かアイデアや提案を提供できれば、彼らは非常にありがたいです。

4

3 に答える 3

2

私が理解していることから、SqlDataReaderは、返されたデータの1回限りの列挙に使用されることを目的としています。結果を1回循環すると、オブジェクトはその役割を果たします。これを回避するためのいくつかのアイデアがあります。どちらか一方が、ニーズに応じてこれを解決する可能性があります。

  1. クエリを再実行して、必要に応じて別のSqlDataReaderを生成します

  2. SqlDataReaderを使用する代わりに、元のクエリの結果をSystem.Data.DataTableに保存します。ここで、データを好きなように再読み取りして操作できます。

お役に立てれば!

アダム

于 2008-11-03T18:45:46.440 に答える
0

データリーダーは情報を読み込むため、usingブロックは、その値を変数に割り当てた直後にリーダーへの接続を閉じます。 これは、必要な場所にたどり着く可能性のあるコードの例を示す記事です。

重要なのは、リーダーから読み取ろうとするときは、接続が開いている必要があるということです。

于 2008-11-03T18:43:07.897 に答える
0

説明は次のとおりです。

これは、デバッガーでリーダーを一度ループしたことがあるためです(初めてビューを展開したとき)。これはリーダーの動作方法であり、私が知っていることから、再実行オプションを除いて、リーダーをリセットして最初からやり直して再度読む方法はありません。

行を再度実行する必要があり cmd.ExecuteReader();ます(ソースを右クリックし、[次のステートメントの設定]メニューオプションを使用します)。

これがデータリーダーの動作です。すでにループしている場合は、戻ることはできません。コマンドを再度実行して、新しいコマンドを取得する必要があります。

リーダーを閉じた後にデータを使用する必要がある場合は、を使用するか、 Adamの回答Typed DataSetで指定されているように型なしを使用することを選択できます。DataSet

ちなみに、ここにoptimizationsあなたが作ることができるいくつかがあります:

  • リーダーを Connectionusingブロック内に移動して、使用終了後にスコープ外に移動します(usingブロックを終了すると、接続が閉じられ、とにかく使用できなくなるため、作成されません。外に置いておく感覚)
  • ExecuteReader別のusingブロックで実行し(実装時にIDisposable)、SQL Command(同じIDisposableインターフェイス)で同じことを行います
  • データベースからすべてのフィールドを取得しないでください
于 2008-11-03T19:06:28.350 に答える