Mientras que la comprensión de cómo yield
funciona la palabra clave, me encontré con Link1 y Link2 en StackOverflow que aboga por el uso de yield return
tiempo interactuando sobre el DataReader y se adapta a mi necesidad también. Pero me pregunto qué sucede si uso lo yield return
que se muestra a continuación y si no repito todo el DataReader, ¿la conexión de la base de datos permanecerá abierta para siempre?
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;
}
}
Intenté el mismo ejemplo en una aplicación de consola de ejemplo y noté durante la depuración que el bloque finalmente GetRecords()
no se ejecuta. ¿Cómo puedo asegurar el cierre de DB Connection? ¿Hay una mejor manera que usar yield
palabras clave? Estoy tratando de diseñar una clase personalizada que se encargará de ejecutar SQL seleccionados y procedimientos almacenados en la base de datos y devolverá el resultado. Pero no quiero devolver el DataReader a la persona que llama. También quiero asegurarme de que la conexión se cerrará en todos los escenarios.
Editar Cambió la respuesta a la respuesta de Ben, ya que es incorrecto esperar que quienes llaman al método usen el método correctamente y con respecto a la conexión de la base de datos, será más costoso si el método se llama varias veces sin razón alguna.
Gracias Jakob y Ben por la explicación detallada.