用利回りに対して繰り返し処理を実行するdatareaderない場合がある。

StackOverflow https://stackoverflow.com/questions/47521

  •  09-06-2019
  •  | 
  •  

質問

ここではサンプルコードからデータを取得するデータベースの利回りをキーワードから数がgoogling頃:

public IEnumerable<object> ExecuteSelect(string commandText)
{
    using (IDbConnection connection = CreateConnection())
    {
        using (IDbCommand cmd = CreateCommand(commandText, connection))
        {
             connection.Open();
             using (IDbDataReader reader = cmd.ExecuteReader())
             {
                while(reader.Read())
                {
                    yield return reader["SomeField"];
                }
             }
             connection.Close();
        }
    }
}

私正しいことを考えてこのサンプルコードは、接続が閉じないがない場合は、繰り返し処理を実行し、全体datareader?

ここでは一例となり、接続がわかれば、利回りを正しく..

foreach(object obj in ExecuteSelect(commandText))
{
  break;
}

のためのdb接続するものは有害なものではないことがよいのではないでしょうかGCいクリーンですが、その場合には接続でしたがより重要な資源か?

役に立ちましたか?

解決

反復子のコンパイラsynthesisesを実装しIDisposable、foreachの通話の場合は、foreachループが終了した.

反復子のDispose()メソッドの清掃を計算書の早期終了します。

としてお使いいただいた反復子にはforeachで商品情報を順次取得、()ブロック、またはお電話にDispose()メソッドその他の清掃活動、反復子のことが起こると思います。

他のヒント

接続すると自動的に閉じまいとしま"を"ブロックです。

からの簡単なテストして、アクは、処分はというと、foreachのブロック終了します。

@David:しかし呼び出しスタックですって話での接続が閉じないで、次の通りの指導後の利回りするのをブロックです。

私の理解では、この場合、反復子が配置された接続のように処理します。また、接続します。近は必要ありませんしていることに注意してくださの場合、オブジェクトが処理での使用を提供しています。

ここでは、簡単なプログラムを試みた試験を行...

class Program
{
    static void Main(string[] args)
    {
        foreach (int v in getValues())
        {
            Console.WriteLine(v);
        }
        Console.ReadKey();

        foreach (int v in getValues())
        {
            Console.WriteLine(v);
            break;
        }
        Console.ReadKey();
    }

    public static IEnumerable<int> getValues()
    {
        using (TestDisposable t = new TestDisposable())
        {
            for(int i = 0; i<10; i++)
                yield return t.GetValue();
        }
    }
}

public class TestDisposable : IDisposable
{
    private int value;

    public void Dispose()
    {
        Console.WriteLine("Disposed");
    }

    public int GetValue()
    {
        value += 1;
        return value;
    }
}

審査から この技術解説, は、コードは期待通りの働きを見せたものの、中断の項目では、接続したときの最初の項目です。

@ジョエルGauvreau:あったものの、読みます。 第3部 このシリーズにコンパイラの追加の特別の取扱いは、最終的にブロックをトリガーのみの ます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top