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:
- Nos conectamos a la base de datos y mostramos los datos en el formulario.
- Manipulamos los Datos.
- 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

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

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