Israel Aéce

Microsoft MVP, MCP, MCAD, MCTS, MCPD e MCT

My Links

Blog Stats

Archives

Post Categories

Links

Login

SqlConnection1.Open() - Sim, mas onde?!?

Já não é a primeira vez que vejo isso. Primeiramente em um outro lugar em que trabalhava, me disseram que o correto seria chamar o método Open da XXXConnection fora (antes) do bloco Try, e quando questionei o porque, não souberam me explicar. Vejo isso muitas vezes em fóruns e recentemente li um artigo em uma revista nacional em que o autor fazia isso. Exemplo:

          Dim conn As New SqlConnection("CONNECTION_STRING")
          '....
          '....
          conn.Open()
          Try
               '....

Pois bem, e se o servidor SQL Server estiver indisponível ou não existir o que acontecerá? O bloco Catch entrará em ação? Claro que não, pois a linha que gerou o erro, não está "gerenciada" pelo bloco Try e a Exception será atirada ao cliente. Pois bem, e porque será muitas pessoas insistem em dizer que o método acima é a forma correta de abrir a conexão com uma DB? Realmente estou muito curioso!

Outro código falho, é se fizer o seguinte:

          Dim conn As New SqlConnection("CONNECTION_STRING")
          '....
          '....          
          Try
               conn.Open()
               '....
               '....
               conn.Close()
          Catch ex As Expcetion
               '....

Isso também é bastante perigoso, já que se alguma Exception ocorrer depois da abertura da DB e antes do fechamento da mesma, logicamente a conexão com esta DB não fechará, e com isso, em breve o pool de conexões estoura, o que impedirá a sua aplicação e continuar a execução corretamente.

Esse tema também já foi discutido neste post, bem como as formas corretas de abrir e fechar a conexão, mas o fato de que as pessoas insistem em fazer dessa forma, ou seja, de abrir a conexão com a DB antes/fora do bloco Try ainda me deixa bastante confuso, onde não sei e gostaria de saber o que elas pensam a respeito. Será que alguém tem alguma explicação para tal?

posted on Friday, May 06, 2005 11:39 PM

Feedback

# re: SqlConnection1.Open() - Sim, mas onde?!? 5/7/2005 9:15 AM Pedro Rainho

Viva é verdade o conn.Open() deve estar dentro do try catch para evitar o problema que mensionas-te mas o conn.Close() está no sitio errado. O conn.Close() deve estar dentro do block finnaly, isto para evitares deixar uma connection aberta quando ocorre um excepção. Porque no teu caso se tiveres uma excepção depois do conn.Open() e dentro try catch nunca vais terminar a conecção. deves fazer assim:

try{
conn.Open();
..
..
}catch(Exception ex){
...
}
finnaly{
conn.Close();
}

# re: SqlConnection1.Open() - Sim, mas onde?!? 5/7/2005 6:49 PM Leonardo Bisogno

Falae Israel, beleza?
Onde fechar e onde abrir a conexão não são surpresas pra mim. O que me chamou a atenção foi ter lido sobre o dispose no post que tu indicaste. Realmente eu era um dos que pensava que chamar o dispose de uma conexão removia a mesma do pool.
Quanto a existência de artigos onde seus autores não tomam o devido cuidado, isso realmente é fato. Só não sei dizer se isso ocorre por um descuido ou por eles realmente não saberem disso.
[]'s

# re: SqlConnection1.Open() - Sim, mas onde?!? 5/9/2005 6:10 AM Paulo Morgado

Eu prefiro instanciar o objecto SqlConnection dentro do try e no finally testar se foi criado e se a ligação está aberta antes de a fechar.

SqlConnection conn = null;
try
{
conn = new SqlConnection("CONNECTION_STRING");
conn.Open();
...
}
catch
...
finally
{
if (conn != null)
{
conn.Close();
}
}

Não esquecer que a ligação deve ser aberta o mais tarde possível e fechada o mais cedo possível.

# re: SqlConnection1.Open() - Sim, mas onde?!? 5/13/2005 4:43 PM Henrique Ribeiro

Bom, eu sempre uso a instrução using no C#. É simples, útil e funciona. Na verdade eu uso o using para tudo que possível (IDisposeble). O mais comum é assim:

using ( SqlConnection connection = new SqlConnection(...) )
using ( SqlCommand command = new SqlCommand(..., connection) )
{
...
}


Pronto.

Title  
Name  
Url
Box Code
Protected by FormShield
Comments