none
Dipose e Close Connection RRS feed

  • 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á???

    domingo, 12 de abril de 2020 19:11

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

    • Marcado como Resposta Nowlights segunda-feira, 13 de abril de 2020 21:27
    • Não Marcado como Resposta Nowlights segunda-feira, 13 de abril de 2020 21:31
    • Marcado como Resposta Nowlights sábado, 18 de abril de 2020 19:26
    segunda-feira, 13 de abril de 2020 19:26

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

    • Marcado como Resposta Nowlights segunda-feira, 13 de abril de 2020 21:27
    • Não Marcado como Resposta Nowlights segunda-feira, 13 de abril de 2020 21:31
    • Marcado como Resposta Nowlights sábado, 18 de abril de 2020 19:26
    segunda-feira, 13 de abril de 2020 19:26
  • 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?

    segunda-feira, 13 de abril de 2020 21:34
  • 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

    segunda-feira, 13 de abril de 2020 21:45
  • 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...


    segunda-feira, 13 de abril de 2020 21:59
  • 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

    segunda-feira, 13 de abril de 2020 22:28
  • 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;
                }
              
            }

    segunda-feira, 13 de abril de 2020 22:57