Ejemplo: Manipular una base
de datos de manera conectada Fecha: 18/Mar/2005 (05/03/2005) |
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 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 ClassNo olvides de darme tu voto en PanoramaBox, ya que es una manera de animarme a seguir compartiendo contigo lo que voy aprendiendo. Gracias
Espacios de nombres usados en el código de este artículo:
System.Data
System.Data.SqlClient
Fichero con el código de ejemplo: perxi_adonet_conectado.zip - Tamaño 16 KB