Usuário com melhor resposta
Dipose e Close Connection

Pergunta
-
Boa tarde!
Me deparei com uma duvida, tenho uma classe de gerenciamento de conexão com banco de dados e a utilizo desta forma,
try { using (MySqlConnection cn = new MyC().GetConn()) { using (MySqlCommand cmd = new MySqlCommand()) { cmd.Connection = cn; .. Operção... if(cn.State == System.Data.ConnectionState.Closed) { cn.Open(); } return await cmd.ExecuteNonQueryAsync(); } } } catch (Exception) { throw; }
A duvida é, ao sair do bloco using é fechada a conexão? digo pelo fato do Dispose(); que a o bloco using dá???
Respostas
-
Ao utilizar o using cria-se um escopo que ao final de sua execução, libera recursos automaticamente através do método Dispose(). Então sim, a conexão é fechada.
Leandro Ferreira
Desenvolvedor .Net
Skype: leandro.vipsolucoes
GitHub: github.com/leandrovip
leandro@vipsolucoes.com
Todas as Respostas
-
Ao utilizar o using cria-se um escopo que ao final de sua execução, libera recursos automaticamente através do método Dispose(). Então sim, a conexão é fechada.
Leandro Ferreira
Desenvolvedor .Net
Skype: leandro.vipsolucoes
GitHub: github.com/leandrovip
leandro@vipsolucoes.com -
E no caso de uma aplicação ASP.NET, caso faça um GET que consome algum tempo necessário, porém o usuário requisite outra página?
No meu caso acontece isso, tenho um método de relatório que demora um certo tempo para jogar na tela os resultados (são muitos dados), porém, se o usuário, no meio do carregamento do método, requisitar/acessar outra página, a connection "buga" que gera o erro "Connection must be valid and open"...
Porém desta forma (colocando a connection no bloco Using) eu solucionaria este problema?
-
Como está este GET? É assíncrono? Para este tipo de requisição eu faria em background, porque se fizer outra requisição no meio do processamento provavelmente irá cancelar.
Outra coisa, seu método de conexão está estático ou não?
Leandro Ferreira
Desenvolvedor .Net
Skype: leandro.vipsolucoes
GitHub: github.com/leandrovip
leandro@vipsolucoes.com -
Sim, todos os métodos de conexão são assíncronos.
"Outra coisa, seu método de conexão está estático ou não?"
Então, sim, por isso estou estudando sobre utilizar minha classe de conexão não estática, da forma a qual mostrei acima, estanciando ela para então abri-la...
-
Isso, conexões com SGDB ou qualquer coisa que use recursos não-gerenciados não funcionam muito bem com métodos estáticos, singleton. Deveria criar, usar e fechar. Se possível a melhor opção seria mesmo mudar este método.
Leandro Ferreira
Desenvolvedor .Net
Skype: leandro.vipsolucoes
GitHub: github.com/leandrovip
leandro@vipsolucoes.com -
Cheguei a esta conclusão,
public async Task<int> Delete(int IdAtivo, int IdServico) { try { using (MySqlConnection cn = new MyC().GetConn()) { using (MySqlCommand cmd = new MySqlCommand()) { cmd.Connection = cn; cmd.CommandText = "DELETE FROM t_crud_serv_servicos_ativos WHERE IdServico=" + IdServico + " AND IdAtivo=" + IdAtivo + ";"; try { if(cn.State == System.Data.ConnectionState.Closed) { cn.Open(); } return await cmd.ExecuteNonQueryAsync(); } catch (Exception) { throw; } finally { if(cn.State == System.Data.ConnectionState.Open) { cn.Close(); } } } } } catch (Exception) { throw; } }