yield
키워드의 작동 방식을 이해하는 동안 StackOverflow 에서 link1 및 link2 를 발견 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;
}
}
샘플 콘솔 앱에서 동일한 예제를 시도하고 finally 블록이 GetRecords()
실행되지 않는 것을 디버깅하는 동안 알았습니다 . DB 연결이 닫히도록하려면 어떻게해야합니까? yield
키워드를 사용하는 것보다 더 좋은 방법이 있습니까? DB에서 select SQL 및 저장 프로 시저를 실행하고 결과를 반환하는 사용자 정의 클래스를 설계하려고합니다. 그러나 DataReader를 호출자에게 반환하고 싶지 않습니다. 또한 모든 시나리오에서 연결이 닫히고 싶습니다.
편집 Ben의 답변에 대한 답변이 변경되었으므로 메소드 호출자가 메소드를 올바르게 사용할 것으로 예상하고 DB 연결과 관련하여 아무 이유없이 메소드를 여러 번 호출하면 더 비쌉니다.
자세한 설명은 Jakob과 Ben에게 감사드립니다.