もう一度表示するとIDataReaderが空になる
-
06-07-2019 - |
質問
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つの異なるマシンでローカルエラーを排除しようとしました
これまでのところ何も機能していません。
アイデアや提案を提供できる人がいたら非常にありがたいです。
解決
私が理解したことから、SqlDataReaderは、返されたデータの1回限りの列挙に使用することを目的としています。一度結果を一巡すると、オブジェクトはその役割を果たしました。これを回避するためのいくつかのアイデアがありますが、どちらかがニーズに応じてあなたのためにこれを解決するかもしれません:
-
必要に応じてクエリを再実行して別のSqlDataReaderを生成します
-
SqlDataReaderを使用する代わりに、元のクエリの結果をSystem.Data.DataTableに保存します。ここで、必要に応じてデータを再読み取りおよび操作できます。
これがお役に立てば幸いです!
アダム
他のヒント
データリーダーは情報を読み込むため、usingブロックはその値を変数に割り当てた直後にリーダーへの接続を閉じます。 こちら必要な場所にたどりつくコードの例を示す記事。
重要なのは、リーダーから読み込もうとするとき、接続が開かれていなければならないということです。
説明は次のとおりです。
これは、デバッガーでリーダーを一度ループした(ビューを初めて開いた)ためです。これはリーダーの動作方法であり、私が知っている限り、再実行オプションを除き、リーダーをリセットして最初からやり直す方法はありません:
もう一度実行する必要があります
cmd.ExecuteReader();
行(右側) ソースをクリックして" setを使用します 次のステートメント"メニューオプション)。
これはデータリーダーの動作です。既にループしている場合、戻ることはできません。コマンドを再度実行して、新しいコマンドを取得する必要があります。
リーダーを閉じた後にデータを使用する必要がある場合は、 Typed DataSet
を使用するか、Adamの回答。
ところで、ここで作成できる最適化
があります:
- リーダーを内部に移動します
Connection
ブロックを使用して作成する 終了後に範囲外に出る それを使用して(一度使用している ブロック、接続が閉じられます とにかくそれを使用することはできませんので、外に置いても意味がありません) -
ExecuteReader
を実行します 別のusing
ブロック(IDisposable
を実装するため)およびSqlCommand
(同じIDisposable
で同じことを行います)インターフェース) - 取得しない データベースのすべてのフィールド