none
Fechar conexão Banco de Dados SQL SERVER usando ASPNET C# RRS feed

  • Pergunta

  • Boa noite, galera.

    Estou com o seguinte problema. Estou fazendo um sistema WEB e após varias consultas ao Banco de Dados SQL SERVER ele apresenta o seguinte erro:

    System.InvalidOperationException: 'Tempo limite expirado. O período de tempo limite foi atingido antes que fosse obtida uma conexão do pool. Isso pode ter ocorrido porque todas as conexões do pool estavam em uso e o tamanho máximo do pool foi atingido.'

    Verifiquei , usando o script abaixo, que tenho 251 conexões no banco de dados, usando minha aplicação:

    SELECT DB_NAME(dbid) as DBName, 
           COUNT(dbid) as NumberOfConnections, 
           loginame as LoginName 
    FROM sys.sysprocesses 
    WHERE dbid > 0 
    GROUP BY dbid, loginame

    Já coloquei alguns parametros em minha string de conexão, sendo ele: Min Pool Size=5;Max Pool Size=250; Connect Timeout=3".

    Ou seja, chegou em 250 conexões, ele trava.

    Em minhas conexões com o Banco de Dados eu não fecho conexão(e pelo que entendi é um erro grave).

    Ao fazer o fechamento da conexão, conforme código abaixo, é dado um erro.

     String string_conexao = ConfigurationManager.ConnectionStrings["root"].ConnectionString;
    
       
    
    
        public SqlDataReader RetornaVersao()
        {
            SqlConnection conexao = new SqlConnection();
    
            try
            {
                String query_string = " select top 1 ";
                query_string += "versao, ";
                query_string += " convert(varchar(15),dataatualizacao,103) as 'data'";
                query_string += " from versao ";
                query_string += " order by dataatualizacao desc ";
    
               
                conexao.ConnectionString = this.string_conexao;
                conexao.Open();
    
                SqlCommand comando = new SqlCommand();
                comando.CommandText = query_string;
                comando.Connection = conexao;
    
                SqlDataReader dr = comando.ExecuteReader();
    
                conexao.Close();
                conexao.Dispose();
    
                return dr;
    
            }
            finally
            {
    
            }
            
           
        }

    Recebendo informações do Banco de dados e colocando na tela

    public void RetornaVersao()
        {
            BancoDeDados bd = new BancoDeDados();
    
            SqlDataReader drVersao = bd.RetornaVersao();
            if (drVersao.Read())
            {
                lblVersao.Text = drVersao["versao"].ToString() + " - " + drVersao["data"].ToString();
            }
    
        
    
    
        }
    Na parte de ler o drVersão é dado o erro abaixo.

    System.InvalidOperationException: 'Tentativa inválida de chamar Read quando o leitor estava fechado.'

    Se eu tirar os comandos de fechar conexão , não dá erro e tudo funciona corretamente,masssss ficam várias conexões abertas.

    Eu trabalho com a conexão em uma classe e a alimentação dos valores na tela, em outra classe.

    Como faço para fechar as conexões, e evitar erro de exceço de conexões,  mas sem que dê erro?

    Valeu.


    quarta-feira, 30 de maio de 2018 02:45

Respostas

  • bom dia,

    você tem de fechar a conexão depois de fazer a leitura no sqldatareader.  Ai você pode ajustar ai essa função retornaVersao para retornar uma string com o a versão do banco, em vez de um sqldatareder. Ou pode retornar o sqldatareder, depois do seu IF, chama alguma função na sua classe banco de dados, que chama o close na conexão, acho que daria mais trabalho.

    quarta-feira, 30 de maio de 2018 12:23
    Moderador

Todas as Respostas

  • bom dia,

    você tem de fechar a conexão depois de fazer a leitura no sqldatareader.  Ai você pode ajustar ai essa função retornaVersao para retornar uma string com o a versão do banco, em vez de um sqldatareder. Ou pode retornar o sqldatareder, depois do seu IF, chama alguma função na sua classe banco de dados, que chama o close na conexão, acho que daria mais trabalho.

    quarta-feira, 30 de maio de 2018 12:23
    Moderador
  • Amigo altera o seu método RetornaVersao para ele guardar o drVersao.Read em uma variável e depois retornar ela no fim do seu método, aí você vai poder fechar a conexão e utilizar os dados retornados do banco no seu outro método.

    public SqlDataReader RetornaVersao() { SqlConnection conexao = new SqlConnection(); try { String query_string = " select top 1 "; query_string += "versao, "; query_string += " convert(varchar(15),dataatualizacao,103) as 'data'"; query_string += " from versao "; query_string += " order by dataatualizacao desc "; conexao.ConnectionString = this.string_conexao; conexao.Open(); SqlCommand comando = new SqlCommand(); comando.CommandText = query_string; comando.Connection = conexao; SqlDataReader dr = comando.ExecuteReader();

    var data = dr.Read(); conexao.Close(); conexao.Dispose(); return data; } finally { } }

    Lembrando que após você usar os dados, você deve fechar o dataReader.

    quarta-feira, 30 de maio de 2018 13:29
  • Obrigado, Welington jr.

    Funcionou perfeitamente.

    Terei de rever todo o código para fechar as conexões, mas ta valendo.

    Vlw galera

    quinta-feira, 31 de maio de 2018 17:02