Primeira pergunta:
diga que eu tenho
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();
}
A conexão é fechada? Porque tecnicamente nunca chegamos ao último }
como return
antes.
Segunda pergunta:
Desta vez eu tenho:
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*/ }
Agora, digamos que, em algum lugar try
, recebemos um erro e ele seja capturado. A conexão ainda está fechada? Porque, novamente, pulamos o restante do código no try
e vamos diretamente para a catch
instrução
Estou pensando linearmente demais em como using
funciona? ou seja, Dispose()
simplesmente é chamado quando deixamos o using
escopo?
fonte
try catch
dentro dousing
você pode explicitamente.Commit
ou.Rollback
transações nocatch
. Isso é mais legível e explícito e permite que você confirme se isso faz sentido, devido ao tipo da exceção. (As transações implicitamente são revertidasconn.Close
se não confirmadas.).Open
a conexão.using
apenas garante que oDispose
método do objeto seja chamado.Sim para ambas as perguntas. A instrução using é compilada em um bloco try / finalmente
é o mesmo que
Edit: Fixing the cast to Disposable http://msdn.microsoft.com/en-us/library/yh598w02.aspx
fonte
Aqui está o meu modelo. Tudo o que você precisa para selecionar dados de um servidor SQL. A conexão é fechada e descartada e erros na conexão e execução são detectados.
* Revisado: 09-11-2015 *
Conforme sugerido por NickG; Se muitas chaves lhe incomodam, formate assim ...
Por outro lado, se você trabalha para jogos da EA ou do DayBreak, pode simplesmente renunciar a qualquer quebra de linha, porque são apenas para pessoas que precisam voltar e olhar seu código mais tarde e quem realmente se importa? Estou certo? Quero dizer, 1 linha em vez de 23 significa que sou um programador melhor, certo?
Ufa ... OK. Tirei isso do meu sistema e acabei me divertindo por um tempo. Continue.
fonte
conn.Close();
no final? Ausing
declaração não faz isso por você através do descarte?Dispose simplesmente é chamado quando você sai do escopo de uso. A intenção de "usar" é oferecer aos desenvolvedores uma maneira garantida de garantir que os recursos sejam descartados.
Do MSDN :
fonte
Using
gera uma tentativa / finalmente ao redor do objeto que está sendo alocado e chamaDispose()
por você.Isso evita o incômodo de criar manualmente o bloco try / finalmente e chamar
Dispose()
fonte
No seu primeiro exemplo, o compilador C # realmente converterá a instrução using para o seguinte:
Finalmente, as instruções sempre serão chamadas antes do retorno de uma função e, portanto, a conexão será sempre fechada / descartada.
Portanto, no seu segundo exemplo, o código será compilado da seguinte maneira:
A exceção será capturada na instrução finalmente e a conexão será fechada. A exceção não será vista pela cláusula de captura externa.
fonte
Escrevi duas instruções using dentro de um bloco try / catch e pude ver que a exceção estava sendo capturada da mesma maneira, se colocada dentro da instrução inner using , como no exemplo do ShaneLS .
Não importa onde a tentativa / captura seja feita, a exceção será capturada sem problemas.
fonte