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