Usuário com melhor resposta
Dúvida sobre o uso do "Using"

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.
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 SnippetUsing 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 UsingDispose()
É 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 SnippetDim 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 dadosoConn.Close()
oConn.Dispose()
oTable.Dispose()
oConn =
NothingoTable =
NothingEnd 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.- Sugerido como Resposta Eduardo Oliveira terça-feira, 10 de agosto de 2010 01:56
- Marcado como Resposta AndreAlvesLimaModerator terça-feira, 10 de agosto de 2010 12:03
-
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?- Sugerido como Resposta AndreAlvesLimaModerator terça-feira, 10 de agosto de 2010 12:03
- Marcado como Resposta AndreAlvesLimaModerator terça-feira, 10 de agosto de 2010 12:03
-
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
- Sugerido como Resposta AndreAlvesLimaModerator terça-feira, 10 de agosto de 2010 12:03
- Marcado como Resposta AndreAlvesLimaModerator terça-feira, 10 de agosto de 2010 12: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 SnippetUsing 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 UsingDispose()
É 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 SnippetDim 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 dadosoConn.Close()
oConn.Dispose()
oTable.Dispose()
oConn =
NothingoTable =
NothingEnd 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.- Sugerido como Resposta Eduardo Oliveira terça-feira, 10 de agosto de 2010 01:56
- Marcado como Resposta AndreAlvesLimaModerator terça-feira, 10 de agosto de 2010 12:03
-
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!
-
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?- Sugerido como Resposta AndreAlvesLimaModerator terça-feira, 10 de agosto de 2010 12:03
- Marcado como Resposta AndreAlvesLimaModerator terça-feira, 10 de agosto de 2010 12:03
-
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
- Sugerido como Resposta AndreAlvesLimaModerator terça-feira, 10 de agosto de 2010 12:03
- Marcado como Resposta AndreAlvesLimaModerator terça-feira, 10 de agosto de 2010 12:03