yield
Anahtar kelimenin nasıl çalıştığını anlarken , StackOverflow üzerinde Link1 ve link2 ile karşılaştım yield return
. Ama yield return
aşağıda gösterildiği gibi kullanırsam ve tüm DataReader üzerinden yineleme yapmazsam, DB bağlantısı sonsuza kadar açık kalacak mı?
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;
}
}
Aynı örneği bir örnek Konsol App denedim ve sonunda bloğunun GetRecords()
yürütülmediğini hata ayıklama sırasında fark ettim . DB Bağlantısının kapatılmasını nasıl sağlayabilirim? yield
Anahtar kelime kullanmaktan daha iyi bir yol var mı ? Ben DB üzerinde seçili SQL'leri ve saklı yordamları yürütmekten sorumlu olacak ve sonuç dönecektir özel bir sınıf tasarlamak çalışıyorum. Ancak DataReader'ı arayana geri vermek istemiyorum. Ayrıca bağlantının tüm senaryolarda kapatıldığından emin olmak istiyorum.
Düzenle Yöntem arayanların yöntemi doğru kullanmasını beklemek yanlış olduğu için Ben'in cevabının cevabını değiştirdi ve DB bağlantısına göre, yöntemin sebepsiz olarak birden çok kez çağrılması daha pahalı olacak.
Ayrıntılı açıklama için Jakob ve Ben'e teşekkür ederiz.