Usuário com melhor resposta
Fechar conexão Banco de Dados SQL SERVER usando ASPNET C#

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.
- Editado Rodrigo Storti de Oliveira 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.
- Marcado como Resposta Rodrigo Storti de Oliveira quinta-feira, 31 de maio de 2018 17:02
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.
- Marcado como Resposta Rodrigo Storti de Oliveira quinta-feira, 31 de maio de 2018 17:02
-
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.
-