Sementara memahami cara yield
kerja kata kunci, saya menemukan link1 dan link2 di StackOverflow yang menganjurkan penggunaan yield return
sementara iterasi DataReader dan sesuai dengan kebutuhan saya juga. Tapi itu membuat saya bertanya-tanya seperti apa yang terjadi, jika saya menggunakan yield return
seperti yang ditunjukkan di bawah ini dan jika saya tidak mengulangi seluruh DataReader, akankah koneksi DB tetap terbuka selamanya?
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;
}
}
Saya mencoba contoh yang sama dalam contoh Aplikasi Konsol dan memperhatikan saat debugging bahwa blok akhirnya GetRecords()
tidak dijalankan. Bagaimana saya memastikan penutupan Koneksi DB? Apakah ada cara yang lebih baik daripada menggunakan yield
kata kunci? Saya mencoba merancang kelas khusus yang akan bertanggung jawab untuk mengeksekusi SQL pilihan dan prosedur tersimpan pada DB dan akan mengembalikan hasilnya. Tapi saya tidak ingin mengembalikan DataReader ke pemanggil. Saya juga ingin memastikan bahwa koneksi akan ditutup di semua skenario.
Sunting Mengubah jawaban atas jawaban Ben karena tidak tepat mengharapkan penelepon metode menggunakan metode ini dengan benar dan sehubungan dengan koneksi DB akan lebih mahal jika metode ini dipanggil beberapa kali tanpa alasan.
Terima kasih Jakob dan Ben untuk penjelasan terperinci.