none
Dúvida de principiante - Por favor respondam RRS feed

  • Pergunta

  •  

    Pessoal, desculpe, mas preciso de uma ajuda dos mais experientes para tirar uma dúvida.

     

    No código abaixo eu estou deixando alguma coisa aberta, acumulando bytes em memória desnecessários? Eu não sei se devo fazer .dispose, = nothing, principiante total.

     

    Deveria deixar a conexão aberta uma vez que essa função será chamada diversas vezes na mesma página aspx? (ela retornará valores de campos)

     

        Public Shared Function BuscaValor(ByVal valor_a As String, ByVal valor_b As String, ByVal valor_c As String) As String
            Dim StringConexao As String = "Provider=sqloledb;Data Source=127.0.0.1;Initial Catalog=formdata;User Id=fd;Password=senha"
            Dim cn As System.Data.OleDb.OleDbConnection
            Dim cmdg As System.Data.OleDb.OleDbCommand
            Dim dr As System.Data.OleDb.OleDbDataReader
            If valor_c = "" Then valor_c = "all"
            Dim sSql As String = "SELECT " & valor_c & " from valores where valor_a = '" & valor_a & "' and valor_b = '" & valor_b & "'"
            cn = New OleDbConnection(StringConexao)
            Dim Valor As String
            Try
                cn.Open()
                cmdg = New OleDbCommand(sSql, cn)
                dr = cmdg.ExecuteReader(System.Data.CommandBehavior.CloseConnection)
                If dr.HasRows Then
                    dr.Read()
                    Valor = dr.Item(0).ToString
                Else
                    Valor = valor_b
                End If
                cmdg.Dispose()
            Catch ex As Exception
                Valor = ex.Message.ToString
            End Try
            cn = Nothing
            dr = Nothing
            Return Valor
        End Function

     

    Muito obrigado a todos.

     

    Abraço,

     

    Aprendendo...

    terça-feira, 29 de janeiro de 2008 19:11

Respostas

Todas as Respostas

  •  

    Olá "Aprendendo",

     

    Bom, faz assim:

     

    Try

    cn.Open()

    cmdg = New OleDbCommand(sSql, cn)

    dr = cmdg.ExecuteReader(System.Data.CommandBehavior.CloseConnection)

     

    If dr.HasRows Then

    dr.Read()

    Valor = dr.Item(0).ToString

    Else

    Valor = valor_b

    End If

     

     'Fecha o data reader após sua utilização

    dr.Close()

     

    'invoca o método dispose para liberar o objeto command para o garbage colector

    cmdg.Dispose()

     

    Catch ex As Exception

    Valor = ex.Message.ToString

    Finally

     

    'Verifica se a conexão está aberta e a fecha se estiver

    If cn.State = ConnectionState.Open Then

    cn.Close()

    End If

    End Try

     

    OBS: O Finally garante que seu código execute independente de ter gerado ou não uma exception.

     

    Espero ter ajudado.

     

    []s e bons estudos

    terça-feira, 29 de janeiro de 2008 22:38
  • Valeu Carlos, Muito obrigado. Então mesmo utilizando a function em diversos locais dentro da mesma página aspx, vale a pena abrir e fechar a conexão sempre? Mais uma vez obrigado. Aprendendo.....
    quarta-feira, 30 de janeiro de 2008 01:28
  • Olá,

     

    Então, a premissa é você abrir a conexão o mais tarde possível e fechá-la o mais cedo possível, mesmo que você use a função em diversos lugares no seu código. Porém, se você for colocar seu código dentro de um loop, ai o ideal será abrir a conexão antes de iniciar o loop, e fechá-la após o loop.

     

    Espero ter ajudado.

     

    []s

     

    Se a resposta foi útil, marque-a como tal ;-)

    quarta-feira, 30 de janeiro de 2008 10:55
  • Aprendendo,

     

    você pode chamar o método Close(), desde que o faça no bloco Finally. O conteúdo do bloco Finally sempre é executado, independentemente de ter ocorrido uma exceção ou não.

     

    Sobre abrir e fechar conexões, você só deve fazê-lo nos momentos em que for acessar efetivamente o banco de dados. Ou seja, nada de abrir uma conexão no começo e deixá-la aberta por tempo indeterminado. Um boa prática do ponto de vista de arquitetura de software é não colocar esses comandos de abrir/fechar/manipular dados diretamente na sua página. O ideal é dividir sua aplicação em camadas, sendo cada camada responsável por uma determinada função. Por exemplo, uma camada é responsável somente por montar a interface com o usuário, outra camada acessa os dados, outra camada contém as regras de negócio, etc. Isso facilita a manutenção e o reaproveitamento de código (por exemplo, você poderia reaproveitar as classes da camada de negócios em uma aplicação desktop, desde que não houvesse código vinculado com aplicações web). Veja se ajuda:

     

    Implement a Data Access Layer for Your App with ADO.NET - http://msdn.microsoft.com/msdnmag/issues/03/04/DataAccessLayer/default.aspx
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/daag.asp
    http://msdn.microsoft.com/architecture/patterns/default.aspx?pull=/library/en-us/dnpatterns/html/Dp.asp

    http://msdn2.microsoft.com/en-us/library/ms978496.aspx

     

     


    Ricardo Oneda
    http://oneda.mvps.org/blog

    quarta-feira, 30 de janeiro de 2008 11:22