1
resposta

duvidas using SqlConnection

Galera, bom dia.

Tenho três duvidas sobre o trecho de código abaixo:

1 - Como esta sendo utilizado "using", é necessário executar um connection.Close() após ler os dados? Ou a mesma é fechada automaticamente após o bloco using terminar?

2 - Como não é executado reader.Close() após ler os dados, a conexão com o banco fica aberta mesmo utilizando o using?

3 - Como não foi executado o reader.Close(), o objeto reader irá existir na memória até o Garbage Collector executar ou a conexão sempre ficará aberta mesmo após o executar o Garbage Collector?

Obrigado.

using (SqlConnection connection = new SqlConnection(connectionString))
{

    String queryString = "select nome from produtos";

    SqlCommand command = new SqlCommand(queryString, connection);

    try
    {
        connection.Open();

        SqlDataReader reader = command.ExecuteReader();

        while (reader.Read())
        {
            Console.WriteLine("Produto: {0}", reader[0]);
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}
1 resposta

Oi, Bruno. Tudo bom?

1.) Não. Lembre-se que o bloco using é um açúcar sintático para a construção abaixo:

SqlConnection connection = new SqlConnection(connectionString)
try
{
    // código omitido
}
finally
{
    if(connection != null)
    {
        connection.Dispose(); // Este chama o "Close()"
    }
}

(sobre isso, vemos com mais detalhes no curso C# Parte 4)

2.) Como vimos na expansão acima, o método Dispose (e o Close) serão chamados mesmo que você não o faça em seu reader.

3.) O objeto reader irá existir na memória até o Garbage Collector executar e a conexão irá fechar, porque você a criou usando o bloco using. Mas, e se você não criar em um bloco using e esquecer de chamar o Dispose/Close? O GC, ao coletar um objeto, executa o seu finalizador, caso ele exista. Sempre evitamos criar finalizadores, eles lidam com situações complicadas onde precisamos ter muito cuidado com o código que escrevemos nele. Mas, o finalizador do SqlConnection irá invocar o Dispose para fechar a conexão. De qualquer forma, isto não é certeza! Não é sempre que finalizadores são executados e não sabemos quando isto acontece (o GC não é determinístico).

O que você acha? Resolvi suas dúvidas?

Abs.