Is it safe to write this helper method like this? Will it always close the connection? I understend if all goes well, it will, but will ExecuteReader close the connection even if it throws?
public static IEnumerable<DbDataRecord> ExecuteSelect(string commandText, DbConnection conn)
{
using (DbCommand cmd = conn.CreateCommand())
{
cmd.CommandText = commandText;
conn.Open();
using (DbDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
foreach (DbDataRecord record in reader) { yield return record; }
}
}
}
Yes even if it throws an exception it will close the connection.
If you do not specify CommandBehavior.CloseConnection
and you close the connection, your calling code cannot access the contents of the reader.
Also from MSDN:
When the command is executed, the associated Connection object is closed when the associated DataReader object is closed.
You should ensure that the reader is closed when you are done with it.
The nice thing about all of this is you've got it wrapped around a using statement and you aren't using try/catch/finally
in this case the reader will be closed which then will close the database connection.
Personally I prefer a using
clause statement to close/dispose the connection , simply for parallel construction reasons - same as in good English Grammar.
From my point of view using the CommandBehavior
is not balanced and therefore unpredictable.
I constantly tell to my developers to go simple and consistent.
As if they forget to set the CommandBehavior
...
I won't see it...
but if they don't use ausing
statement...
I will see it as it is very important.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With