Ejemplo: manipular una base de datos de manera conectada
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