Uso un patrón que se ve así más a menudo. Me pregunto si esto está bien o si hay una mejor práctica que no estoy aplicando aquí.¿Cuál es la forma correcta de garantizar que se cierra una conexión SQL cuando se lanza una excepción?
En concreto, me pregunto; en el caso de que se genere una excepción, ¿el código que tengo en el bloque finally es suficiente para garantizar que la conexión se cierra adecuadamente?
public class SomeDataClass : IDisposable
{
private SqlConnection _conn;
//constructors and methods
private DoSomethingWithTheSqlConnection()
{
//some code excluded for brevity
try
{
using (SqlCommand cmd = new SqlCommand(SqlQuery.CountSomething, _SqlConnection))
{
_SqlConnection.Open();
countOfSomething = Convert.ToInt32(cmd.ExecuteScalar());
}
}
finally
{
//is this the best way?
if (_SqlConnection.State == ConnectionState.Closed)
_SqlConnection.Close();
}
//some code excluded for brevity
}
public Dispose()
{
_conn.Dispose();
}
}
Uh ... ¿por qué estás mirando que la conexión ya está cerrado antes de cerrarlo? ¿Y por qué usar un miembro de la clase para almacenar la conexión, si vas a cerrarla en el único método que la usa? – Shog9
spoon16 incluyó la frase "// algún código excluido por brevedad". De esto, infiero que este no es el único método que lo usa. –
correcto, este es absolutamente el ejemplo más simple que pude pensar. Creo que debido a la agrupación de conexiones no es necesario tratar de almacenar un objeto SqlConnection fuera del alcance de cada método. Entonces solo voy a usar USING como otros recomendados. –