none
Usando la instrucción Using vb.net

    Pregunta

  • Buenas, me gustaría saber como funciona esta instrucción: 

    Lo uso de la siguiente forma:

        Dim objConexion As New CDConexion
        Dim da As SqlDataAdapter
    
        Function listarUsuarios() As DataSet
            Using strconnection As SqlConnection = objConexion.conectar
                Try
                    da = New SqlDataAdapter("SELECT * FROM tbl_usuario", strconnection)
                    Dim ds As New DataSet
                    da.Fill(ds, "Usuario")
                    Return ds
                Catch ex As Exception
                    Throw ex
                End Try
            End Using
        End Function

    Llamo a mi clase conexion.

    Public Class CDConexion
        Dim conexion As SqlConnection
        Public Function conectar() As SqlConnection
            conexion = New SqlConnection(ConfigurationManager.ConnectionStrings("cn").ConnectionString)
            Return conexion
        End Function
    End Class

    Y mi cadena la configuro en el archivo App.config

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <connectionStrings>
        <add name="cn"
             connectionString="Server=.;Database=demo01;Trusted_Connection=True;"/>
      </connectionStrings>
    </configuration>
    Mi duda principal es, si es necesario cerrar mi conexión y mi dataAdapter o la instrucción se encarga de ello. Es recomendable usar la instrucción o hay alguna otra opción.


    lunes, 2 de enero de 2017 2:17

Respuestas

  • "Chris_Vidal" preguntó:

    > me gustaría saber como funciona esta instrucción:

    Hola:

    La instrucción Using nos sirve para asegurarnos que tras su finalización (cuando se ejecute la instrucción End Using) se ejecutará el método Dispose del objeto utilizado con dicha instrucción:

        ' Referenciamos un objeto SqlConnection
        Using strconnection As SqlConnection = objConexion.conectar
        
            ' Ejecutar aquí el código que proceda
    
        End Using  ' --> Se llamará automáticamente al método Dispose del objeto SqlConnection
    

    En el ejemplo indicado, al ejecutarse la instrucción End Using se llamará al método Dispose del objeto SqlConnection, el cual se encarga a su vez de llamar a su método Close, con lo cual se cerrará y se destruirán los recursos utilizados por dicho objeto.

    > Mi duda principal es, si es necesario cerrar mi conexión y mi dataAdapter
    > o la instrucción se encarga de ello. Es recomendable usar la instrucción
    > o hay alguna otra opción.

    Lo único que se cierra es la conexión, no el adaptador de datos (dataAdapter) ya que éste no dispone de un método Close o algo parecido, y desde luego, siempre que sea posible, es recomendable utilizar el código de ejecución de un objeto entre un bloque Using ... End Using, ya que al finalizar dicho bloque se cerrará automáticamente la conexión.

    Como alternativa al bloque Using ... End Using, podrías encerrar el código de ejecución entre un bloque Try ... Catch ... Finally ... End Try, de tal manera que en el bloque Finally llames explícitamente al método Dispose o Close del objeto SqlConnection:

       Function listarUsuarios() As DataSet
    
            Dim strconnection As SqlConnection = objConexion.conectar
    
            Try
                da = New SqlDataAdapter("SELECT * FROM tbl_usuario", strconnection)
                Dim ds As New DataSet
                da.Fill(ds, "Usuario")
                Return ds
    
            Finally
                ' Destruir el objeto
                strconnection.Dispose()
                
            End Try
    
        End Function
    

    Fíjate que he eliminado el bloque Catch, porque no merece la pena implementarlo para devolver la misma excepción producida (Throw ex). Tendrá que ser el código cliente que llama a la función listarUsuarios el que se encargue de atrapar la posible excepción que se produzca en su correspondiente bloque Catch:

        Private Sub NombreMetodo()
    
            Try
                ' Obtener un objeto DataSet
                Dim ds As DataSet = listarUsuarios()
    
            Catch ex As Exception
                ' Se ha producido un error
                MessageBox.Show(ex.Message)
    
            End Try
    
        End Sub
    

    Observando el código fuente que has publicado, te diría cómo lo haría yo, siempre y cuando no haya impedimento alguno en tu proyecto para ejecutarlo de la misma manera, claro está:

        Public NotInheritable Class CDConexion
     
            Public Shared Function GetSqlConnection() As SqlConnection
                Return New SqlConnection(ConfigurationManager.ConnectionStrings("cn").ConnectionString)
            End Function
    
        End Class
    
        Function ListarUsuarios() As DataTable
    
            Dim dt As DataTable = Nothing
    
            Using cnn As SqlConnection = CDConexion.GetSqlConnection()
    
                ' Creamos y configuramos el comando
                Dim cmd As SqlCommand = cnn.CreateCommand()
                cmd.CommandText = "SELECT * FROM tbl_usuario"
    
                ' Creamos el adaptador de datos con el comando creado anteriormente
                Dim da As New SqlDataAdapter(cmd)
    
                ' Creamos un nuevo objeto DataTable llamado Usuarios
                dt = New DataTable("Usuarios")
    
                ' Rellenamos el objeto DataTable
                da.Fill(dt)
    
            End Using
    
            ' Devolvemos el objeto DataTable al código cliente
            Return dt
    
        End Function
    

    De ésta manera te puedes ahorrar los siguientes campos globales:

        ' Dim objConexion As New CDConexion
        ' Dim da As SqlDataAdapter

    porque los declaramos en la propia función ListarUsuarios, que es donde se necesitan.

    Igualmente, la función devuelve un objeto DataTable en lugar de un objeto DataSet, porque no tiene ningún sentido utilizar un objeto DataSet si solamente vas a rellenar un único objeto DataTable.

    Y en el código cliente, llamarías a la función ListarUsuarios como indico a continuación:

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            Try
                ' Enlazamos un control DataGridView con un objeto DataTable
                DataGridView1.DataSource = ListarUsuarios()
    
            Catch ex As Exception
                ' Se ha producido un error; mostrar el mensaje
                MessageBox.Show(ex.Message)
    
            End Try
    
        End Sub
    

    Un saludo y ¡Feliz Año Nuevo!


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    • Marcado como respuesta Chris_Vidal lunes, 2 de enero de 2017 16:14
    lunes, 2 de enero de 2017 8:20
    Moderador