Ejemplo: Manipular una base de datos de manera conectada

Fecha: 18/Mar/2005 (05/03/2005)
Autor: Arbis Percy Reyes Paredes - Perxindrome Withoutlimits2983@hotmail.com

 


Bueno hemos llegado a la parte final de este artículo. Este ejemplo que detallaré a continuación le ayudará a comprender mejor los conceptos que expliqué anteriormente. La aplicación que implementé se basa en trabajar con una base de datos u origen de datos de manera desconectada, donde para realizar determinadas operaciones en el origen de datos, procederemos de la siguiente manera: 1) nos conectamos a la base de datos y mostramos los datos en el formulario 2)Manipulamos los Datos 3) finalmente retornamos los datos para actualizar la base de datos.

Por motivos de tiempo, tan sólo me limito a manejar una tabla(con 7 registros) dentro de una base de datos. Manejaré una sóla tabla(sólo con fines de ilustrar el ejemplo, opcionalmente pueden usarse más tablas), la cual será previamente creada en la Base de Datos northwind ,luego realizaremos algunas operaciones como por ejemplo insertar registros en la tabla, visualizarlos, actualizar los datos, eliminar registros y modificarlos de acuerdo a la situación.

Algo a resaltar es que este tipo de acceso a la base de datos, es decir trabajar en modo conectado, puede consumir grande recursos sacrificando el rendimiento al mantener conexiones abiertas a la base de datos. Cada enfoque, modo conectado o desconectado, ofrece una serie de beneficios y desventajas. La elección del enfoque depende en gran medida de las características de la arquitectura y las plataformas que vayan a utilizarse para el intercambio de los datos.

Expongo el código de la aplicación, la cual voy detallando paso a paso, explicando los métodos usados y cuales son los resultados. Para entender este código usted debe tener conocimientos previos respecto al manejo de instrucciones Transact-SQL. Espero sinceramente que sea de utilidad lo poco que estoy aportando, deseo que comprendas muchas cosillas referente a ADO .NET, por eso incluí conceptos muy importantes las cuales debes asimilar con cuidado. Si encuentras alguna manera de mejorar la aplicación no dudes en escribirme al correo, ya que todos somos eternos aprendices. Bueno ahora te dejo que revises el código.

Imports System.Data
Imports System.Data.SqlClient

Module Module1
    Public Estado As New Boolean
    Public Reader As SqlDataReader
    Public conection As New SqlConnection("data source=(local); integrated security=SSPI; initial catalog=northwind")
End Module
Formulario principal
Public Class Form1
    Inherits System.Windows.Forms.Form
    Private Sub Btnsalir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btnsalir.Click
        Me.Close()
    End Sub
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Try
            'Nos conéctamos a la base de datos.
            conection.Open()
            'Creamos la tabla.
            Dim comando As New SqlCommand("create table vendedores(codigo int not null primary " + _
            " key identity, nombres  varchar(25),apellidos varchar(25),dirección varchar(60)," + _
            " e_civil char(1),sexo integer, sueldo numeric(10,2),retirado bit)", conection)
            comando.ExecuteNonQuery()
            'Confirmamos con un mensaje al cliente la creación de la tabla.
            MsgBox("Tabla creada satisfactoriamente...")
            'Nos desconectamos de la base de datos.
            conection.Close()
        Catch ex As Exception
            'Si sucede alguna excepción, entonces nos desconectamos de todas 
            'maneras  de la base de datos.
            conection.Close()
            MsgBox(ex.Message)
        End Try
    End Sub

    Private Sub BtnRefrescar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
        Handles BtnRefrescar.Click
        Try
            ListView1.Items.Clear()
            'Nos conéctamos a la base de datos.
            conection.Open()
            'Instanciamos un objeto Command para ejecutar la instrucción sql en 
            'el origen de datos. Este objeto recibe dos parámetros:la instrucción
            'sql y el objeto Connection para establecer la conección.
            Dim Micomando As New SqlCommand("select * from vendedores", conection)
            'Mediante el objeto Reader procedemos a leer los resultados de la consulta sql.
            Reader = Micomando.ExecuteReader
            Dim oreg As New ListViewItem
            While Reader.Read = True
                oreg = ListView1.Items.Add(Reader("codigo"))
                oreg.SubItems.Add(Reader("nombres"))
                oreg.SubItems.Add(Reader("apellidos"))
                oreg.SubItems.Add(Reader("dirección"))

                Select Case Reader("e_civil")
                    Case "C" : oreg.SubItems.Add("Casado")
                    Case "S" : oreg.SubItems.Add("soltero")
                    Case "D" : oreg.SubItems.Add("Divorciado")
                    Case "V" : oreg.SubItems.Add("Viudo")
                End Select

                Select Case Reader("sexo")
                    Case 1 : oreg.SubItems.Add("Masculino")
                    Case 0 : oreg.SubItems.Add("Femenino")
                End Select

                oreg.SubItems.Add(Reader("Sueldo"))

                Select Case Reader("Retirado")
                    Case "0" : oreg.SubItems.Add("No")
                    Case "1" : oreg.SubItems.Add("Sí")
                End Select
            End While
            'Nos desconéctamos de la base de datos.
            conection.Close()
            Reader.Close()
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

    Private Sub BtnNuevo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
        Handles BtnNuevo.Click
        instanciar_form(True)
    End Sub

    Private Sub BtnModificar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
        Handles BtnModificar.Click
        instanciar_form(False)
    End Sub

    Private Sub BtnEliminar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
        Handles BtnEliminar.Click
        'Capturamos el código del registros a eliminar.
        Dim cod_eliminar As String = InputBox("Por favor asegúrese de ingresar el código correcto" _
        + vbCrLf + vbCrLf + vbCrLf + "Ingrese código", "Eliminar registro", "1", Me.Width / 2, Me.Height / 2)
        Dim respuesta As MsgBoxResult = MsgBox("Seguro de eliminar", MsgBoxStyle.Exclamation + MsgBoxStyle.YesNo, "Aviso")
        'En caso de confirmar la eliminación del registro, entonces...
        If respuesta = MsgBoxResult.Yes Then
            '...Eliminamos el registro conéctandonos al origen de datos
            Dim sql As New String("delete  from vendedores  where codigo=@codigo")
            Dim ocmd As New SqlCommand
            ocmd.Parameters.Add(New SqlParameter("@codigo", SqlDbType.Int)).Value = cod_eliminar
            'Nos conéctamos a la base de datos.
            conection.Open()
            ocmd.CommandText = sql
            ocmd.Connection = conection
            ocmd.ExecuteNonQuery()
            MsgBox("El registro ha sido eliminado con éxito")
            conection.Close()
        End If
    End Sub
    Sub instanciar_form(ByVal valor_estado As Boolean)
        Dim oForma As New auxiliar
        Estado = valor_estado
        oForma.ShowDialog()
    End Sub
End Class
Nuevo/Modificar Registro
Private Sub BtnCancelar_Click(ByVal sender As System.Object, ByVal e _
    As System.EventArgs) Handles BtnCancelar.Click
    Me.Close()
End Sub

Private Sub Guardar_cambios_Click(ByVal sender As System.Object, ByVal e _
    As System.EventArgs) Handles BtnGuardar_cambios.Click
    'guardamos los cambios realizados
    Dim sqlcadena As String
    sqlcadena = New String("update vendedores set nombres=@nombres,apellidos=@apellidos," + _
    "dirección=@dirección,e_civil=@civil,sexo=@sexo, sueldo=@sueldo,retirado=@retirado  where codigo=@codigo")
    Dim ocmd As New SqlCommand
    ocmd.Parameters.Add(New SqlParameter("@codigo", SqlDbType.Int)).Value = CboCodigo.Text
    ocmd.Parameters.Add(New SqlParameter("@nombres", SqlDbType.Text, 25)).Value = Txtnom.Text.ToString
    ocmd.Parameters.Add(New SqlParameter("@apellidos", SqlDbType.Text, 25)).Value = Txtapel.Text.ToString
    ocmd.Parameters.Add(New SqlParameter("@dirección", SqlDbType.VarChar, 60)).Value = Txtdir.Text
    ocmd.Parameters.Add(New SqlParameter("@sueldo", SqlDbType.Decimal)).Value = Txtsueldo.Text
    Select Case CboCivil.Text
        Case Is = "Casado"
            ocmd.Parameters.Add("@civil", SqlDbType.Char, 1).Value = "C"
        Case Is = "Soltero"
            ocmd.Parameters.Add("@civil", SqlDbType.Char, 1).Value = "S"
        Case Is = "Viudo"
            ocmd.Parameters.Add("@civil", SqlDbType.Char, 1).Value = "V"
        Case Is = "Divorciado"
            ocmd.Parameters.Add("@civil", SqlDbType.Char, 1).Value = "D"
    End Select

    If CboSexo.Text = "Masculino" Then
        ocmd.Parameters.Add("@sexo", SqlDbType.Int, 1).Value = 1
    ElseIf CboSexo.Text = "Femenino" Then
        ocmd.Parameters.Add("@sexo", SqlDbType.Int, 1).Value = 0
    End If
    If chkRetirado.Checked = True Then
        ocmd.Parameters.Add("@retirado", SqlDbType.Bit, 1).Value = chkRetirado.Checked
    ElseIf chkRetirado.Checked = False Then
        ocmd.Parameters.Add("@retirado", SqlDbType.Bit, 1).Value = chkRetirado.Checked
    End If
    conection.Open()
    ocmd.CommandText = sqlcadena
    ocmd.Connection = conection
    ocmd.ExecuteNonQuery()
    conection.Close()
End Sub
'Este evento lo que hace es guardar los datos del nuevo registro en la base de datos
Private Sub BtnGuardar_nuevo_Click(ByVal sender As System.Object, ByVal e As _
    System.EventArgs) Handles BtnGuardar_nuevo.Click
    Dim ocmd As New SqlCommand
    Dim sqlcadena As New String("Insert into vendedores(nombres,apellidos," + _
    "dirección,e_civil,sexo,sueldo,retirado)  values (@nombres,@apellidos,@dirección," + _
    "@e_civil,@sexo,@sueldo,@retirado)")
    ocmd.Parameters.Add(New SqlParameter("@nombres", SqlDbType.Text, 25)).Value = Txtnom.Text.ToString
    ocmd.Parameters.Add(New SqlParameter("@apellidos", SqlDbType.Text, 25)).Value = Txtapel.Text.ToString
    ocmd.Parameters.Add(New SqlParameter("@dirección", SqlDbType.VarChar, 60)).Value = Txtdir.Text.ToString
    ocmd.Parameters.Add(New SqlParameter("@sueldo", SqlDbType.Real)).Value = CDbl(Txtsueldo.Text)
    Select Case CboCivil.Text
        Case "Casado"
            ocmd.Parameters.Add("@e_civil", SqlDbType.Char, 1).Value = "C"
        Case "Soltero"
            ocmd.Parameters.Add("@e_civil", SqlDbType.Char, 1).Value = "S"
        Case "Viudo"
            ocmd.Parameters.Add("@e_civil", SqlDbType.Char, 1).Value = "V"
        Case "Divorciado"
            ocmd.Parameters.Add("@e_civil", SqlDbType.Char, 1).Value = "D"
    End Select
    If CboSexo.Text = "Masculino" Then
        ocmd.Parameters.Add("@sexo", SqlDbType.Int).Value = 1
    ElseIf CboSexo.Text = "Femenino" Then
        ocmd.Parameters.Add("@sexo", SqlDbType.Int).Value = 0
    End If
    If chkRetirado.Checked = True Then
        ocmd.Parameters.Add("@retirado", SqlDbType.Bit).Value = 1
    ElseIf chkRetirado.Checked = False Then
        ocmd.Parameters.Add("@retirado", SqlDbType.Bit).Value = 0
    End If
    conection.Open()
    ocmd.CommandText = sqlcadena
    ocmd.Connection = conection
    'el método ExecuteNonQuery() del objeto Command ejecuta una instrucción 
    'de Transact-SQL en la conexión y devuelve el número de filas afectadas.
    ocmd.ExecuteNonQuery()
    conection.Close()
End Sub

Private Sub BtnMostrar_datos_Click(ByVal sender As System.Object, ByVal e As _
    System.EventArgs) Handles BtnMostrar_datos.Click
    'Muestra los datos del registro tomando como parámetro el código.
    Dim sql As New String("select * from vendedores  where codigo=@codigo")
    Dim ocmd As New SqlCommand(sql, conection)
    conection.Open()
    'Haciendo uso de parámetros
    ocmd.Parameters.Add("@codigo", SqlDbType.Int).Value = CboCodigo.Text
    Reader = ocmd.ExecuteReader
    Reader.Read()

    'A continuación leemos todos los campos, excepto el campo código, del
    'registro dónde el código se especificó en la instrucción Transact-SQL

    'Leemos el campo "nombres" 
    Txtnom.Text = Reader("nombres")
    'Leemos el campo "apellidos" 
    Txtapel.Text = Reader("apellidos")
    'Leemos el campo "dirección"
    Txtdir.Text = Reader("dirección")
    'Leemos el campo "sueldo" 
    Txtsueldo.Text = Reader("sueldo")
    'Leemos el campo "e_civil" 
    Select Case Reader("e_civil")
        Case Is = "C" : CboCivil.SelectedIndex = 0
        Case Is = "S" : CboCivil.SelectedIndex = 1
        Case Is = "V" : CboCivil.SelectedIndex = 2
        Case Is = "D" : CboCivil.SelectedItem = 3
    End Select

    'Leemos el campo "sexo"
    Select Case Reader("sexo")
        Case Is = 1 : CboSexo.SelectedIndex = 0
        Case Is = 0 : CboSexo.SelectedIndex = 1
    End Select
    'Leemos el campo "retirado" 
    chkRetirado.Checked = Reader("retirado")
    Reader.Close()
    conection.Close()
End Sub

Private Sub auxiliar_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    Handles MyBase.Load
    If Estado = True Then
        CboCodigo.Visible = False
        Label1.Visible = False
        BtnMostrar_datos.Visible = False
        BtnGuardar_cambios.Visible = False
    Else

        BtnGuardar_nuevo.Visible = False
        Dim o As New SqlCommand("select * from vendedores", conection)
        conection.Open()
        'El método ExecuteReader() envía CommandText a Connection y crea un SqlDataReader.
        Reader = o.ExecuteReader
        While Reader.Read = True
            'Leemos el campo "codigo" de  cada uno de los registros.
            CboCodigo.Items.Add(Reader("codigo"))
        End While
        conection.Close()
        CboCodigo.SelectedIndex = 0
    End If

End Sub
End Class

No olvides de darme tu voto en PanoramaBox, ya que es una manera de animarme a seguir compartiendo contigo lo que voy aprendiendo. Gracias

Anterior


Espacios de nombres usados en el código de este artículo:

System.Data

System.Data.SqlClient


ir al índice

Fichero con el código de ejemplo: perxi_adonet_conectado.zip - Tamaño 16 KB