Arquitectura y funcionalidad de ADO.NET

Bueno hemos llegado a la parte final de este artculo. Este ejemplo que detallar a continuacin le ayudar a comprender mejor los conceptos que expliqu anteriormente. La aplicacin 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 slo me limito a manejar una tabla (con 7 registros) dentro de una base de datos. Manejar una sla tabla (slo con fines de ilustrar el ejemplo, opcionalmente pueden usarse ms 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 situacin.

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 eleccin del enfoque depende en gran medida de las caractersticas de la arquitectura y las plataformas que vayan a utilizarse para el intercambio de los datos.

Expongo el cdigo de la aplicacin, la cual voy detallando paso a paso, explicando los mtodos usados y cuales son los resultados. Para entender este cdigo 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 aplicacin no dudes en escribirme al correo, ya que todos somos eternos aprendices. Bueno ahora te dejo que revises el cdigo.

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 conctamos 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),direccin varchar(60)," + _
            " e_civil char(1),sexo integer, sueldo numeric(10,2),retirado bit)", conection)
            comando.ExecuteNonQuery()
            'Confirmamos con un mensaje al cliente la creacin de la tabla.
            MsgBox("Tabla creada satisfactoriamente...")
            'Nos desconectamos de la base de datos.
            conection.Close()
        Catch ex As Exception
            'Si sucede alguna excepcin, 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 conctamos a la base de datos.
            conection.Open()
            'Instanciamos un objeto Command para ejecutar la instruccin sql en
            'el origen de datos. Este objeto recibe dos parmetros:la instruccin
            'sql y el objeto Connection para establecer la coneccin.
            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("direccin"))

                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 desconctamos 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 cdigo del registros a eliminar.
        Dim cod_eliminar As String = InputBox("Por favor asegrese de ingresar el cdigo correcto" _
        + vbCrLf + vbCrLf + vbCrLf + "Ingrese cdigo", "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 eliminacin del registro, entonces...
        If respuesta = MsgBoxResult.Yes Then
            '...Eliminamos el registro conctandonos al origen de datos
            Dim sql As New String("delete  from vendedores  where [email protected]")
            Dim ocmd As New SqlCommand
            ocmd.Parameters.Add(New SqlParameter("@codigo", SqlDbType.Int)).Value = cod_eliminar
            'Nos conctamos 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 [email protected],[email protected]," + _
    "direcci[email protected]n,[email protected],[email protected], [email protected],[email protected]  where [email protected]")
    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("@direccin", 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," + _
    "direccin,e_civil,sexo,sueldo,retirado)  values (@nombres,@apellidos,@direccin," + _
    "@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("@direccin", 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 mtodo ExecuteNonQuery() del objeto Command ejecuta una instruccin
    'de Transact-SQL en la conexin y devuelve el nmero 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 parmetro el cdigo.
    Dim sql As New String("select * from vendedores  where [email protected]")
    Dim ocmd As New SqlCommand(sql, conection)
    conection.Open()
    'Haciendo uso de parmetros
    ocmd.Parameters.Add("@codigo", SqlDbType.Int).Value = CboCodigo.Text
    Reader = ocmd.ExecuteReader
    Reader.Read()

    'A continuacin leemos todos los campos, excepto el campo cdigo, del
    'registro dnde el cdigo se especific en la instruccin Transact-SQL

    'Leemos el campo "nombres"
    Txtnom.Text = Reader("nombres")
    'Leemos el campo "apellidos"
    Txtapel.Text = Reader("apellidos")
    'Leemos el campo "direccin"
    Txtdir.Text = Reader("direccin")
    '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 mtodo ExecuteReader() enva 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

COMPARTE ESTE ARTÍCULO

ENVIAR A UN AMIGO
COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN GOOGLE +
¡SÉ EL PRIMERO EN COMENTAR!
Conéctate o Regístrate para dejar tu comentario.