方法を理解しながらyield
キーワード作品を、私が出会ったリンク1とリンク2の使用を提唱StackOverflowの上yield return
DataReaderオブジェクトを反復処理しながら、をし、それは私のニーズに合ったとしても。しかし、yield return
以下に示すように使用し、DataReader全体を反復処理しない場合、DB接続はいつまでも開いたままになるのか、疑問に思います。
IEnumerable<IDataRecord> GetRecords()
{
SqlConnection myConnection = new SqlConnection(@"...");
SqlCommand myCommand = new SqlCommand(@"...", myConnection);
myCommand.CommandType = System.Data.CommandType.Text;
myConnection.Open();
myReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection);
try
{
while (myReader.Read())
{
yield return myReader;
}
}
finally
{
myReader.Close();
}
}
void AnotherMethod()
{
foreach(var rec in GetRecords())
{
i++;
System.Console.WriteLine(rec.GetString(1));
if (i == 5)
break;
}
}
サンプルコンソールアプリで同じ例を試してみましたが、デバッグ中に最終ブロックがGetRecords()
実行されないことに気付きました。DB接続の終了を確認するにはどうすればよいですか?yield
キーワードを使用するよりも良い方法はありますか?DBで選択SQLとストアドプロシージャを実行し、結果を返すカスタムクラスを設計しようとしています。しかし、DataReaderを呼び出し元に返したくありません。また、すべてのシナリオで接続が閉じられるようにします。
編集メソッドの呼び出し元がメソッドを正しく使用することを期待するのは間違っているため、Benの答えへの答えを変更しました。
詳細な説明をしてくれたJakobとBenに感謝します。