0

DbDataReader を IEnumerable オブジェクトに変換する拡張メソッドがあります。

public static IEnumerable<IDataRecord> AsEnumerable(this DbDataReader reader) {
    while (reader.Read()) {
        yield return reader;
    }
}

私のアプリケーションでは、次のようにデータベースにクエリを実行します。

var records = context.Query("select WRKORDNBR from WRKORDER").AsEnumerable();

その後、各レコードを列挙し、WRKORDNBR フィールドの値を取得します。

foreach (var record in records) {
    DoSomething((int)record["WRKORDNBR"]);
}

これは以前はうまくいきました。ここで、わざわざ DbDataReader を変換した理由は、foreach ブロックの前にレコードに対して LINQ クエリを実行する必要があるためです。ご存知のように、DbDataReader のレコードは 1 回しか列挙できません (または、完全に何かが欠けているのでしょうか)。つまり、AsEnumerable の結果を List にコピーして、複数回列挙できるようにする必要があります。

var temp = records.ToList();

少なくとも、それが私がしなければならないことだと思いました。しかし、 foreach ループを変更して一時コレクションを反復処理すると、次のようになります。

InvalidOperationException: 行/列にデータが存在しません

ここで何が欠けていますか?

4

2 に答える 2

1

列挙型には個別のオブジェクトは含まれていませんが、すべての列挙型は同じインスタンス (リーダー) を返します。基本的に次のことを行っています。

var list = new List<IDataRecord>();
while (reader.Read()) 
{
    list.Add(reader);
}

ループが終了すると、リーダーには何も含まれません。これは、リスト内の「アイテム」のいずれかを見ると得られるものです。最後から 2 番目の項目で停止しようとすると、すべて同じ値が含まれていることがわかります。

リストなしで機能する理由は、次の行に沿って何かを行っているためです。

while (reader.Read()) 
{
    DoSomething((int)record["WRKORDNBR"]);

}
于 2009-10-03T18:43:54.803 に答える
0

リーダーがあり、データセットが必要な場合は、データセットをロードします...

データセットがあり、クエリ可能なコレクションが必要な場合は、データセット エクステンションを使用します。

于 2009-10-03T19:33:31.630 に答える