none
Acceder a BD SQL SERVER con VB.NET RRS feed

  • Pregunta

  • Mi pregunta es la siguiente, tengo 1 clase conexion que posee un metodo para conectarse a una BD en SQL SERVER, este codigo se ejecuta correctamente. Dentro del mismo proyecto poseo un Forms en el cual puedo insertar, modificar y actualizar desde y hacia la BD. Todo el codigo funciona correctamente, pero no esta diseñado de una manera optima, me gustaria poder utilizar los metodos de la clase conexion para no tener que declarar la cadena de conexion cada vez que quiera enviar o recibir datos de mi BD, aqui van las clases a ver si me pueden ayudar:

    Public Class conexion
    
        Public Sub ConnectToSql()
            Dim conn As New SqlClient.SqlConnection
            ' TODO: Modify the connection string and include any
            ' additional required properties for your database.
            conn.ConnectionString =
                         "Data Source=localhost;" & _
                         "Initial Catalog=Clientes;" & _
                         "User Id=xxxx;Password=xxxx"
            Try
                conn.Open()
                MessageBox.Show("Conexion Exitosa")
                ' Insert code to process data.
            Catch ex As Exception
                MessageBox.Show("Error al intentar la conexión")
            Finally
                conn.Close()
            End Try
        End Sub
    
    
    End Class

    Imports System.Data
    Imports System.Data.OleDb
    Imports System.Data.SqlClient
    
    Public Class Form1
        Dim cnn As New conexion
        Dim adaptador As New SqlDataAdapter
        Dim con As New SqlConnection
        Dim cmd As New SqlCommand
    
        Private Sub btnAgregar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAgregar.Click
            Dim conexion As New SqlConnection("Data Source=localhost;Initial Catalog=Clientes;User Id=xxxx;Password=xxxx")
            Dim command As New SqlCommand("pral_insertar", conexion)
            command.CommandType = CommandType.StoredProcedure
            command.Parameters.AddWithValue("@Nombre", txtNombre.Text)
            command.Parameters.AddWithValue("@Apellidos", txtApellido.Text)
            Try
                conexion.Open()
                command.ExecuteNonQuery()
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            Finally
                conexion.Dispose()
                command.Dispose()
                MsgBox("Usuario Registrado Correctamente", vbInformation, "Sistema")
            End Try
        End Sub
    
        Private Sub btnBorrar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnModificar.Click
            Dim conexion As New SqlConnection("Data Source=localhost;Initial Catalog=Clientes;User Id=xxxx;Password=xxxx")
            Dim command As New SqlCommand("pral_editar", conexion)
            command.CommandType = CommandType.StoredProcedure
            command.Parameters.Add("@Nombre", SqlDbType.VarChar).Value = txtNombre.Text
            command.Parameters.Add("@Apellidos", SqlDbType.VarChar).Value = txtApellido.Text
            txtNombre.Clear() : txtApellido.Clear()
            Try
                conexion.Open()
                command.ExecuteNonQuery()
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            Finally
                conexion.Dispose()
                command.Dispose()
                MsgBox("Usuario Registrado Correctamente", vbInformation, "Sistema")
                consultarPersona(dgwClientes)
            End Try
        End Sub
    
        Private Sub btnBorrar_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBorrar.Click
            Dim conexion As New SqlConnection("Data Source=localhost;Initial Catalog=Clientes;User Id=xxxx;Password=xxxx")
            Dim command As New SqlCommand("pral_borrar", conexion)
            command.CommandType = CommandType.StoredProcedure
            command.Parameters.Add("@Nombre", SqlDbType.VarChar).Value = txtNombre.Text
            txtNombre.Clear() : txtApellido.Clear()
            Try
                conexion.Open()
                command.ExecuteNonQuery()
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            Finally
                conexion.Dispose()
                command.Dispose()
                MsgBox("Usuario Registrado Correctamente", vbInformation, "Sistema")
                consultarPersona(dgwClientes)
            End Try
        End Sub
    End Class



    miércoles, 22 de julio de 2015 2:52

Respuestas

  • "Conexion a SQL Server in VB.NET" preguntó:

    > me gustaria poder utilizar los metodos de la clase conexion para
    > no tener que declarar la cadena de conexion cada vez que quiera
    > enviar o recibir datos de mi BD

    Hola:

    Para obtener la cadena de conexión existente en el método ConnectToSql, en lugar de declarar un procedimiento Sub, tendrías que declararlo como Function:

    Friend Class Conexion
    
        Friend Shared Function ObtenerCadenaConexion() As String
            Return  "Data Source=localhost;" & _
                    "Initial Catalog=Clientes;" & _
                    "User Id=xxxx;Password=xxxx"
        End Sub
    
    End Class

    Y ahora, desde cualquier procedimiento del formulario obtendrías la cadena de conexión ejecutando:

        Private Sub btnAgregar_Click(sender As Object, e As EventArgs) Handles btnAgregar.Click
    
            Dim miConexion As New SqlConnection(Conexion.ObtenerCadenaConexion())
    
            ' Resto del código fuente existente
            '
            ' ...
    
        End Sub

    Nota que a la variable del tipo SqlConnecion le he tenido que llamar miConexion porque si le llamo conexion tendrías problemas con la clase de igual nombre implementada en tu proyecto (Public Class Conexion).

    Igualmente, al estar el procedimiento ObtenerCadenaConexion() declarado como compartido (Shared), no es necesario crear una instancia de la clase Conexion para poder llamar a dicho procedimiento: basta con sólo especificar NombreClase.NombreProcedimiento().

    Un saludo


    Enrique Martínez Montejo
            [MS MVP - VB]

    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.




    miércoles, 22 de julio de 2015 16:25
    Moderador
  • Muchas gracias, me ha funcionado de maravillas, pero hay un pequeño detalle.

    Solo puedo ingresar, editar o borrar 1 sola vez ya que envia la siguiente excepción

    "No se ha inicializado la propiedad ConnectionString."

    He solucionado el problema declarando la variable en cada procedimiento, quise declarar la variable

    de forma general en la clase, por eso el motivo de la excepción. Igualmente muchas gracias.

    Dim miConexion As New SqlConnection(Conexion.ObtenerCadenaConexion())

    miércoles, 22 de julio de 2015 19:14

Todas las respuestas

  • "Conexion a SQL Server in VB.NET" preguntó:

    > me gustaria poder utilizar los metodos de la clase conexion para
    > no tener que declarar la cadena de conexion cada vez que quiera
    > enviar o recibir datos de mi BD

    Hola:

    Para obtener la cadena de conexión existente en el método ConnectToSql, en lugar de declarar un procedimiento Sub, tendrías que declararlo como Function:

    Friend Class Conexion
    
        Friend Shared Function ObtenerCadenaConexion() As String
            Return  "Data Source=localhost;" & _
                    "Initial Catalog=Clientes;" & _
                    "User Id=xxxx;Password=xxxx"
        End Sub
    
    End Class

    Y ahora, desde cualquier procedimiento del formulario obtendrías la cadena de conexión ejecutando:

        Private Sub btnAgregar_Click(sender As Object, e As EventArgs) Handles btnAgregar.Click
    
            Dim miConexion As New SqlConnection(Conexion.ObtenerCadenaConexion())
    
            ' Resto del código fuente existente
            '
            ' ...
    
        End Sub

    Nota que a la variable del tipo SqlConnecion le he tenido que llamar miConexion porque si le llamo conexion tendrías problemas con la clase de igual nombre implementada en tu proyecto (Public Class Conexion).

    Igualmente, al estar el procedimiento ObtenerCadenaConexion() declarado como compartido (Shared), no es necesario crear una instancia de la clase Conexion para poder llamar a dicho procedimiento: basta con sólo especificar NombreClase.NombreProcedimiento().

    Un saludo


    Enrique Martínez Montejo
            [MS MVP - VB]

    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.




    miércoles, 22 de julio de 2015 16:25
    Moderador
  • Muchas gracias, me ha funcionado de maravillas, pero hay un pequeño detalle.

    Solo puedo ingresar, editar o borrar 1 sola vez ya que envia la siguiente excepción

    "No se ha inicializado la propiedad ConnectionString."

    miércoles, 22 de julio de 2015 18:52
  • Muchas gracias, me ha funcionado de maravillas, pero hay un pequeño detalle.

    Solo puedo ingresar, editar o borrar 1 sola vez ya que envia la siguiente excepción

    "No se ha inicializado la propiedad ConnectionString."

    He solucionado el problema declarando la variable en cada procedimiento, quise declarar la variable

    de forma general en la clase, por eso el motivo de la excepción. Igualmente muchas gracias.

    Dim miConexion As New SqlConnection(Conexion.ObtenerCadenaConexion())

    miércoles, 22 de julio de 2015 19:14
  • Pienso que debes hacer un módulo o una clase si lo prefieres, el cual contenga un procedimiento genérico llamado Ejecutar. Este procedimiento servirá para ejecutar sobre la base de datos una inserción, actualización o eliminación. Este procedimiento se conectará a la base de datos y solamente lo debes llamar en la parte que desees del proyecto, instanciando o solamente invocándolo según sea clase o módulo respectivamente. Para ello el procedimiento tendrá un parámetro que es el que envías ByVal y supongo que puedes definir como las sentencias, Por ejemplo el procedimiento será:

    Public Sub Ejecutar(ByVal sql As String)
            Dim tb As New DataTable
            Dim cn As New SqlConnection
            Try
                cn.ConnectionString = cadenaConexion()
                cn.Open()
                Dim adp As New SqlDataAdapter
                adp.SelectCommand = New SqlCommand(sql, cn)
                tb.Locale = Globalization.CultureInfo.InvariantCulture
                adp.Fill(tb)
                adp.Dispose()
            Catch ex As Exception
                MsgBox(ex.Message)
            Finally
                cn.Dispose()
            End Try
        End Sub

    La cadena de conexión la puedes definir en un módulo, en config, en una clase....

    Ejemplo: Para una base de datos en SQL

    _baseDatos es el nombre de tu base de datos


    Public Function cadenaConexion() As String
            Dim i, cadena As String
            i = Environment.MachineName.ToString
                      chain = "Data Source=" & i & "\(NOMBRE DE LA INSTANCIA SQL);Initial Catalog='" & _baseDatos & "';Integrated Security=True"
             Return cadena
    End Function

    Siempre que quieras insertar, eliminar, actualizar, llamas ese procedimiento pasándole el parámetro la sentencia SQL.

    En el caso que quieras mostrar los datos, faltaría saber en que control quieres tu mostrar los datos, pero el procedimiento es parecido a menos que es una función.

    Public Function obtenerDatos(ByVal sql As String) As DataTable
            Dim tb As New DataTable
            Dim cn As New SqlConnection
            Try
                cn.ConnectionString = cadenaConexion()
                cn.Open()
                Dim adp As New SqlDataAdapter
                adp.SelectCommand = New SqlCommand(sql, cn)
                tb.Locale = Globalization.CultureInfo.InvariantCulture
                adp.Fill(tb)
                adp.Dispose()
            Catch ex As Exception
                MsgBox(ex.Message)
            Finally
                cn.Dispose()
            End Try
            Return tb
        End Function

    Esta función devuelve una tabla que tu la adaptas a tus necesidades dentro de tus forms. Toda vez que quieras mostrar los datos en un control determinado, solamente debes saber que los datos están en una tabla que se llena a partir de esa función. También es un procedimiento que le debes proveer ByVal la sentencia SQL.



    • Editado Sixto Corbo domingo, 26 de julio de 2015 13:49
    • Propuesto como respuesta Sixto Corbo domingo, 26 de julio de 2015 13:51
    domingo, 26 de julio de 2015 13:47