Arquitectura y funcionalidad de ADO.NET

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

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP