Primera pregunta:
digamos que tengo
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
string storedProc = "GetData";
SqlCommand command = new SqlCommand(storedProc, connection);
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add(new SqlParameter("@EmployeeID", employeeID));
return (byte[])command.ExecuteScalar();
}
¿Se cierra la conexión? Porque técnicamente nunca llegamos a lo último }
como lo hicimos return
antes.
Segunda pregunta:
esta vez tengo:
try
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
int employeeID = findEmployeeID();
connection.Open();
SqlCommand command = new SqlCommand("UpdateEmployeeTable", connection);
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add(new SqlParameter("@EmployeeID", employeeID));
command.CommandTimeout = 5;
command.ExecuteNonQuery();
}
}
catch (Exception) { /*Handle error*/ }
Ahora, digamos que en algún lugar en el try
recibimos un error y se detecta. ¿La conexión todavía se cierra? Porque, de nuevo, omitimos el resto del código en el try
y vamos directamente a la catch
declaración.
¿Estoy pensando demasiado linealmente en cómo using
funciona? es decir, ¿ Dispose()
simplemente se llama cuando dejamos el using
alcance?
fuente
try catch
plazo de lausing
que pueda de manera explícita.Commit
o.Rollback
transacciones en elcatch
. Esto es más legible y explícito, y le permite confirmar si eso tiene sentido dado el tipo de excepción. (Las transacciones se retrotraen implícitamenteconn.Close
si no se confirman).Open
conectar.using
solo garantiza queDispose
se llama al método del objeto .Sí a las dos preguntas. La instrucción using se compila en un bloque try / finally
es lo mismo que
Editar: Arreglando el elenco en Desechable http://msdn.microsoft.com/en-us/library/yh598w02.aspx
fuente
Aquí está mi plantilla. Todo lo que necesita para seleccionar datos de un servidor SQL. La conexión se cierra y se elimina y se detectan errores en la conexión y la ejecución.
* Revisado: 09/11/2015 *
Según lo sugerido por NickG; Si le molestan demasiadas llaves, formatee así ...
Por otra parte, si trabajas para juegos EA o DayBreak, también puedes renunciar a cualquier salto de línea porque son solo para personas que tienen que volver y ver tu código más tarde y a quién realmente le importa. Estoy en lo cierto? Quiero decir 1 línea en lugar de 23 significa que soy un mejor programador, ¿verdad?
Uf ... ok. Lo saqué de mi sistema y terminé de divertirme por un tiempo. Continua.
fuente
conn.Close();
al final? ¿Lausing
declaración no hace eso por ti a través de la eliminación?Deseche simplemente recibe una llamada cuando abandona el alcance del uso. La intención de "usar" es dar a los desarrolladores una forma garantizada de asegurarse de que los recursos se eliminen.
De MSDN :
fuente
Using
genera un try / finalmente alrededor del objeto que se está asignando y lo llamaDispose()
por usted.Le ahorra la molestia de crear manualmente el bloque try / finalmente y llamar
Dispose()
fuente
En su primer ejemplo, el compilador de C # traducirá la declaración de uso a lo siguiente:
Finalmente, siempre se llamará a las declaraciones antes de que regrese una función, por lo que la conexión siempre se cerrará / eliminará.
Entonces, en su segundo ejemplo, el código se compilará de la siguiente manera:
La excepción quedará atrapada en la declaración final y se cerrará la conexión. La excepción no se verá en la cláusula de captura externa.
fuente
Escribí dos declaraciones de uso dentro de un bloque try / catch y pude ver que la excepción se detectaba de la misma manera si se coloca dentro de la declaración de uso interno como en el ejemplo de ShaneLS .
No importa dónde se coloque el try / catch , la excepción se detectará sin problemas.
fuente