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 returnantes.
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 tryrecibimos un error y se detecta. ¿La conexión todavía se cierra? Porque, de nuevo, omitimos el resto del código en el tryy vamos directamente a la catchdeclaración.
¿Estoy pensando demasiado linealmente en cómo usingfunciona? es decir, ¿ Dispose()simplemente se llama cuando dejamos el usingalcance?
fuente

try catchplazo de lausingque pueda de manera explícita.Commito.Rollbacktransacciones 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.Closesi no se confirman).Openconectar.usingsolo garantiza queDisposese 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? ¿Lausingdeclaració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
Usinggenera 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