none
Dúvida sobre o uso do "Using" RRS feed

  • Pergunta

  • estou com a seguinte dúvida:

     

    quando eu utilizo o using para abrir uma conexão com o banco de dados, ao terminar o bloco do código ele automaticamente fecha a conexão, certo?

    Mas ele solicita o garbage collector?

    Alguém pode me explicar melhor isso?

     

    e se tem diferença de performance entre instanciar um objeto de conexão(dando open e no final fechando o mesmo e liberando os recursos utilizados) ou utilizar o using.

    quinta-feira, 27 de março de 2008 17:23

Respostas

  • A instrução Using é usada para usar recursos e ter a certeza que estes recursos serão liberados no fim do bloco da instrução End Using.

     

    Um exemplo em VB.NET

    Code Snippet

    Using conn As New SqlConnection(dsn)
          Using cmd As New SqlCommand("SELECT * FROM Clientes", conn)
              conn.Open()
                Using rdr As SqlDataReader = cmd.ExecuteReader()
                  While rdr.Read()
                     Console.WriteLine(rdr(0))
                   End While
               End Using
          End Using
    End Using

     

     

     

    Dispose()

    É recomendado que você efetue o método Dispose() dos objetos que estão sendo utilizados para garantir a liberação da memória que esta sendo usada, além de de boa prática de programação.

     

    Um exemplo em VB.NET

     

    Code Snippet

    Dim strConexao As String = ConnectionStrings("AWorks").ConnectionString()

    Dim oConn As New SqlConnection

    Dim strSQL As New StringBuilder

    Dim oTable As New DataTable()

     

    Try

     

       'abrindo conexão com o banco de dados

       oConn.ConnectionString = strConexao

       oConn.Open()

     

       'carregando os dados

       strSQL.Append(" SELECT ")

       strSQL.Append(" Production.Product.ProductID ")

       strSQL.Append(" FROM ")

       strSQL.Append(" Production.Product ")

     

       Dim oDA As New SqlDataAdapter(strSQL.ToString, oConn)

       oDA.Fill(oTable)

     

    Catch ex As Exception

        System.Diagnostics.Debug.WriteLine(ex.Message)

     

    Finally

       'fechando a conexão com o banco de dados

       oConn.Close()

     

       'liberando os objetos

       oConn.Dispose()

       oTable.Dispose()

      

       oConn = Nothing

       oTable = Nothing

     

    End Try

     

     

    Maiores informações:

     

    VB 2005 -  Liberando os objetos de forma apropriada

    http://www.macoratti.net/vbn5_dpo.htm

     


    Ajude a melhorar o nosso Fórum!
    Não esqueça de marca a mensagem como "útil", caso tenha ajudado.

     

     

     

     

    quinta-feira, 27 de março de 2008 20:55
  • Bom o que o Using faz, eh após o seu termino ele chama o Método Dispose da classe.

    Por isso vc so pode usar o Using com classes que implementem a interface IDisposable.

    Quanto a garantia de fechar conexão não sei corretamente. Na documentação diz q o método Dispose libera todos os recursos alocados, então isso significa q ele vai liberar a conexão feita. Porém, como boa prática se vc chama o método Open para abrir a conexão, é aconselhavel chamar tbem o método Close.


    Quem sabe um dia os DataSets se extinguirão?
    terça-feira, 10 de agosto de 2010 09:02



  • Olá,
    Utilizando o using, sua conexão será fechada mesmo se ocorrer uma exception. Na verdade, após a compilação o IL gerado quando se usa o using será algo parecido com o seguinte:

    try
    {
         // instancia
         // usa o objeto
    }
    finally
    {
          //Dispose
    }

    além disso, se sua connection string estiver configurada para usar pool, ao ser fechada, a conexão voltará estar disponível no pool.

    Anderson




    terça-feira, 10 de agosto de 2010 11:03

Todas as Respostas

  • A instrução Using é usada para usar recursos e ter a certeza que estes recursos serão liberados no fim do bloco da instrução End Using.

     

    Um exemplo em VB.NET

    Code Snippet

    Using conn As New SqlConnection(dsn)
          Using cmd As New SqlCommand("SELECT * FROM Clientes", conn)
              conn.Open()
                Using rdr As SqlDataReader = cmd.ExecuteReader()
                  While rdr.Read()
                     Console.WriteLine(rdr(0))
                   End While
               End Using
          End Using
    End Using

     

     

     

    Dispose()

    É recomendado que você efetue o método Dispose() dos objetos que estão sendo utilizados para garantir a liberação da memória que esta sendo usada, além de de boa prática de programação.

     

    Um exemplo em VB.NET

     

    Code Snippet

    Dim strConexao As String = ConnectionStrings("AWorks").ConnectionString()

    Dim oConn As New SqlConnection

    Dim strSQL As New StringBuilder

    Dim oTable As New DataTable()

     

    Try

     

       'abrindo conexão com o banco de dados

       oConn.ConnectionString = strConexao

       oConn.Open()

     

       'carregando os dados

       strSQL.Append(" SELECT ")

       strSQL.Append(" Production.Product.ProductID ")

       strSQL.Append(" FROM ")

       strSQL.Append(" Production.Product ")

     

       Dim oDA As New SqlDataAdapter(strSQL.ToString, oConn)

       oDA.Fill(oTable)

     

    Catch ex As Exception

        System.Diagnostics.Debug.WriteLine(ex.Message)

     

    Finally

       'fechando a conexão com o banco de dados

       oConn.Close()

     

       'liberando os objetos

       oConn.Dispose()

       oTable.Dispose()

      

       oConn = Nothing

       oTable = Nothing

     

    End Try

     

     

    Maiores informações:

     

    VB 2005 -  Liberando os objetos de forma apropriada

    http://www.macoratti.net/vbn5_dpo.htm

     


    Ajude a melhorar o nosso Fórum!
    Não esqueça de marca a mensagem como "útil", caso tenha ajudado.

     

     

     

     

    quinta-feira, 27 de março de 2008 20:55
  • Desculpe-me por upar esse tópico, mas é que tenho uma dúvida bem parecida.

    Eu entendi a utilidade de Using, mas a minha dúvida é: Using é uma forma de garantir que a conexão seja devolvida para o Connection Poolling ao final da instrução e pelo que entendi, não é necessário fechar a conexão, pois o using se encarrega disso, mas e se estourar uma exception? Existe a garantia de que a conexão é fechada? ou preciso tratar isso dentro de um Try/Catch e fechando a conexão em caso de exception?

    Eu não testei ainda, estou estudando o video do Cesar Guimarães para o MSDN Experience, mas essa questão de "sempre fechar conexão" não ficou muito claro (pelo menos pra mim).

     

    Obrigado a todos!

    terça-feira, 10 de agosto de 2010 01:56
  • Bom o que o Using faz, eh após o seu termino ele chama o Método Dispose da classe.

    Por isso vc so pode usar o Using com classes que implementem a interface IDisposable.

    Quanto a garantia de fechar conexão não sei corretamente. Na documentação diz q o método Dispose libera todos os recursos alocados, então isso significa q ele vai liberar a conexão feita. Porém, como boa prática se vc chama o método Open para abrir a conexão, é aconselhavel chamar tbem o método Close.


    Quem sabe um dia os DataSets se extinguirão?
    terça-feira, 10 de agosto de 2010 09:02



  • Olá,
    Utilizando o using, sua conexão será fechada mesmo se ocorrer uma exception. Na verdade, após a compilação o IL gerado quando se usa o using será algo parecido com o seguinte:

    try
    {
         // instancia
         // usa o objeto
    }
    finally
    {
          //Dispose
    }

    além disso, se sua connection string estiver configurada para usar pool, ao ser fechada, a conexão voltará estar disponível no pool.

    Anderson




    terça-feira, 10 de agosto de 2010 11:03