Acceso a Datos · Acceso a Datos con VB .NET 2005 Ing. Eduardo Reyes 2 Acceso a datos En este...

26
Acceso a Datos Visual Basic .NET 2005

Transcript of Acceso a Datos · Acceso a Datos con VB .NET 2005 Ing. Eduardo Reyes 2 Acceso a datos En este...

Page 1: Acceso a Datos · Acceso a Datos con VB .NET 2005 Ing. Eduardo Reyes 2 Acceso a datos En este capítulo realizaremos una conexión, lectura, inserción, actualización ...

 

 

 

 

 

Acceso a Datos Visual Basic .NET 2005

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Page 2: Acceso a Datos · Acceso a Datos con VB .NET 2005 Ing. Eduardo Reyes 2 Acceso a datos En este capítulo realizaremos una conexión, lectura, inserción, actualización ...

Capítulo I

• Acceso a datos • Lectura de datos • Inserción • Actualización • Eliminación

Page 3: Acceso a Datos · Acceso a Datos con VB .NET 2005 Ing. Eduardo Reyes 2 Acceso a datos En este capítulo realizaremos una conexión, lectura, inserción, actualización ...

    Acceso a Datos con VB .NET 2005 

Ing. Eduardo Reyes  

2

Acceso a datos

En  este  capítulo  realizaremos  una  conexión,  lectura,  inserción,  actualización  y  eliminación  de  datos creando aplicaciones en Visual Basic .NET 2005 con el Framework 2.0 a través del SQL Server 2000. 

Crear  un  nuevo  proyecto  denominado WAccesoDatos,  la  tabla  a  consultar  será  Products  de  la  BD NorthWind. 

Después de crear el proyecto agregar las Referencias para poder acceder a los Datos como lo indica en la Fig. 01: 

 

Fig. 01: Agregar Referencias al Proyecto 

Respecto al código del formulario, primero vamos a declarar varios objetos de acceso a datos a nivel de la clase para poder tenerlos disponibles en diversos métodos. Veamos el Código fuente en la Fig. 02: 

 

Fig. 02: Variables declaradas con los Objetos para el Acceso a Datos 

Page 4: Acceso a Datos · Acceso a Datos con VB .NET 2005 Ing. Eduardo Reyes 2 Acceso a datos En este capítulo realizaremos una conexión, lectura, inserción, actualización ...

    Acceso a Datos con VB .NET 2005 

Ing. Eduardo Reyes  

3

En  el  formulario  del  proyecto  agregamos  un  DataGridView  para  poder mostrar  los  datos  a  enlazar, quedando el Form1 de la siguiente manera como se muestra en la Fig. 03: 

 

Fig. 03: Formulario (Form1) con el DataGridView (dgVer) 

En el siguiente paso escribiremos el código dentro del evento Load del formulario, el cual se ocupa de crear  la  conexión  con  la BD,  crear el DataAdapter  con  la  consulta,  cargar el DataSet, y asignárselo al DataGrid a través de su propiedad DataSource. Ver la Fig. 04 

Una vez escrito el código correctamente como se encuentra en la Fig. 04 se pasa a ejecutar el formulario y debe de mostrar los datos consultados tal como se muestran en la Fig. 05 

 

Fig. 05: Formulario con los Datos mostrados en el DataGrid 

Page 5: Acceso a Datos · Acceso a Datos con VB .NET 2005 Ing. Eduardo Reyes 2 Acceso a datos En este capítulo realizaremos una conexión, lectura, inserción, actualización ...

    Acceso a Datos con VB .NET 2005 

Ing. Eduardo Reyes  

4

 

Fig. 04: Código para poder Acceder a los Datos de la Tabla Products de Northwind 

No olvidar que en la línea de código de conexión: 

cnx = ("server=Srv01;database=Northwind;Trusted_Connection=True") 

 En  la parte donde se encuentra el nombre del server debe de  ir el nombre de tu servidor de base de datos en este caso el mío es Srv01. 

 

 

 

 

 

 

 

 

 

 

Page 6: Acceso a Datos · Acceso a Datos con VB .NET 2005 Ing. Eduardo Reyes 2 Acceso a datos En este capítulo realizaremos una conexión, lectura, inserción, actualización ...

    Acceso a Datos con VB .NET 2005 

Ing. Eduardo Reyes  

5

Lectura de datos

DataReader 

En  esta parte  realizaremos una  lectura  (consulta de datos) utilizando objetos DataReader, un objeto DataReader permite  la navegación hacia delante y de sólo  lectura, de  los  registros devueltos por una consulta.  

Ahora  crearemos  dentro  del  proyecto  denominado WAccesoDatos  un  nuevo  formulario  al  cual  lo llamaremos frmLeerDatos, luego agregamos los siguientes controles los cuales nos mostraran el uso de objetos DataReader. 

Control  NameButton1  btnEmpleadosButton2  btnCliProdListBox1  lstEmpleadosListBox2  lstClientesListBox3  lstProductos

 

Después de agregar  los controles que describimos anteriormente, el formulario frmLeerDatos debe de quedar como se muestra en la Fig. 06. 

 

Fig. 06: Formulario frmLeerDatos 

Ahora  realizaremos  la  codificación del botón Empleados  creando  a partir de un  comando, un objeto DataReader  que  recorreremos  para  llenar  un  ListBox  (lstEmpleados)  con  los  valores  de  una  de  las columnas de la tabla que internamente contiene el DataReader. Ver la Fig. 07. 

Después realizamos la codificación del botón Clientes/Productos que tendrá un objeto Command el cual puede estar basado en múltiples sentencias SQL, separadas por el carácter de punto y coma ( ; ), que se ejecuten en lote. Al crear un DataReader desde un comando de este tipo, podemos recorrer el conjunto de consultas mediante el método NextResult( ) del DataReader. Un ejemplo de este tipo lo tenemos al pulsar el botón Clientes/Productos del formulario, cuya fuente vemos a continuación en la Fig. 08. 

La  Fig.  09 muestra  al  formulario  después  de  haber  rellenado  los  controles  ListBox  usando  objetos DataReader. 

Page 7: Acceso a Datos · Acceso a Datos con VB .NET 2005 Ing. Eduardo Reyes 2 Acceso a datos En este capítulo realizaremos una conexión, lectura, inserción, actualización ...

    Acceso a Datos con VB .NET 2005 

Ing. Eduardo Reyes  

6

 

Fig. 07: Código del Botón Empleados. 

 

Fig. 08: Código del Botón Clientes/Productos. 

 

Page 8: Acceso a Datos · Acceso a Datos con VB .NET 2005 Ing. Eduardo Reyes 2 Acceso a datos En este capítulo realizaremos una conexión, lectura, inserción, actualización ...

    Acceso a Datos con VB .NET 2005 

Ing. Eduardo Reyes  

7

 

Fig. 09: ListBox llenados con los objetos DataReader 

DataSet 

DataSet  pertenece  al  conjunto  común  de  clases  de  ADO  .NET,  empleándose  para  todo  tipo  de proveedores, por lo que no existe una versión particular para SqlClient u OleDb. 

En  el  formulario  frmLeerDatos  agregar  los  siguientes  controles  el  cual  nos  servirá  para  realizar  un sencillo ejemplo de creación de un objeto DataSet que llenaremos con un DataAdapter. Una vez listo el DataSet, recorreremos la tabla que contiene y mostraremos valores de sus columnas en un ListBox. 

Control  NameButton1  btnCustomersListBox1  lstCustomers

 

Después de agregar los controles que describimos anteriormente el formulario debe de quedar como se muestra en la Fig. 10. 

 

Fig. 10: Formulario frmLeerDatos 

Page 9: Acceso a Datos · Acceso a Datos con VB .NET 2005 Ing. Eduardo Reyes 2 Acceso a datos En este capítulo realizaremos una conexión, lectura, inserción, actualización ...

    Acceso a Datos con VB .NET 2005 

Ing. Eduardo Reyes  

8

Ahora codificamos del botón Customers creando una consulta a partir de un DataAdapter, una vez listo el  DataSet  recorreremos  el  ListBox  (lstCustomers)  para  recorrer  y mostrar  los  datos  de  una  de  las columnas de la tabla Customers. Ver la Fig. 11. 

 

Fig. 11: Código del Botón Customers 

 

La  Fig.  12 muestra  al  formulario  después  de  haber  rellenado  los  controles  ListBox  usando  objetos DataSet. 

 

 

Fig. 12: ListBox llenados mediante un DataSet 

 

 

Page 10: Acceso a Datos · Acceso a Datos con VB .NET 2005 Ing. Eduardo Reyes 2 Acceso a datos En este capítulo realizaremos una conexión, lectura, inserción, actualización ...

    Acceso a Datos con VB .NET 2005 

Ing. Eduardo Reyes  

9

Inserción

DataAdapter 

Los objetos DataAdapter (SqlDataAdapter y OleDbDataAdapter) van a desempeñar el papel de puente entre el origen de datos y el DataSet, permitiéndonos cargar el DataSet con la información de la fuente de datos, y posteriormente, actualizar el origen de datos con la información del DataSet. 

Un  objeto  DataAdapter  puede  contener  desde  una  sencilla  sentencia  SQL,  como  hemos  visto  en  el apartado anterior, hasta varios objetos Command. 

La  clase DataAdapter dispone de  cuatro propiedades, que nos  van a permitir asignar a  cada una, un objeto Command  (SqlCommand u OleDbCommand) con  las operaciones estándar de manipulación de datos. Estas propiedades son las siguientes. 

• InsertCommand. Objeto de la clase Command, que se va a utilizar para realizar una inserción de datos. 

• SelectCommand. Objeto de la clase Command que se va a utilizar para ejecutar una sentencia Select de SQL. 

• UpdateCommand.  Objeto  de  la  clase  Command  que  se  va  a  utilizar  para  realizar  una modificación de los datos. 

• DeleteCommand. Objeto de la clase Command que se va a utilizar para realizar una eliminación de datos. 

Un método destacable de las clases SqlDataAdapter/OleDbDataAdapter es el método Fill( ), que ejecuta el comando de selección que se encuentra asociado a la propiedad SelectCommand, los datos obtenidos del origen de datos se cargarán en el objeto DataSet que pasamos por parámetro. 

Para  ver  el  uso  de  los  objetos  DataAdapter  vamos  a  crear  un  formulario  y  lo  llamaremos frmInsertaDatos luego agregamos los siguientes controles.  

Control  NameDataGridView  grdDatosTextBox1  txtProgramaTextBox2  txtDescripcionLabel1  lblProgramaLabel2  lblDescripcionButton  btnGrabar

 

En esta aplicación vamos a utilizar el objeto DataAdapter para realizar una consulta en  la tabla Region de la BD Northwind con la cual venimos trabajando e insertar nuevas filas en esa misma tabla. Después de agregar los controles que describimos anteriormente el formulario debe de quedar como se muestra en la Fig. 13. 

Respecto al código del formulario, en primer lugar, vamos a declarar varios objetos de acceso a datos a nivel de la clase para poder tenerlos disponibles en diversos métodos. Veamos la Fig. 14. 

En el siguiente paso escribiremos el procedimiento del evento Load del formulario frmInsertaDatos, y el método  CargaDatos(  ),  que  se  ocupa  de  cargar  el DataSet,  y  asignárselo  al DataGrid  a  través  de  su propiedad DataSource. Observe el  lector que en el método CargarDatos( )  lo primero que hacemos es vaciar el DataSet, puesto que este objeto conserva los datos de tablas y registros; en el caso de que no limpiáramos el DataSet, se acumularían las sucesivas operaciones de llenado de filas sobre la tabla que contiene. Veamos la Fig. 15. 

Page 11: Acceso a Datos · Acceso a Datos con VB .NET 2005 Ing. Eduardo Reyes 2 Acceso a datos En este capítulo realizaremos una conexión, lectura, inserción, actualización ...

    Acceso a Datos con VB .NET 2005 

Ing. Eduardo Reyes  

10

 

Fig. 13: Formulario frmInsertaDatos 

 

 

Fig. 14: Variables declaradas dentro del frmInsertaDatos 

 

Private Sub frmInsertaDatos_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'crear conexión oConexion = New SqlConnection oConexion.ConnectionString = "Server=Srv01;Database=Northwind;uid=sa;pwd=;" 'crear adaptador oDataAdapter = New SqlDataAdapter 'crear comandos de insercion 'consulta con sus parametros y asignarlos al adaptador Dim oCmdInsercion As New SqlCommand("INSERT INTO Region" & _ "(RegionId, RegionDescription) VALUES(@IdRegion,@Region)", oConexion) oDataAdapter.InsertCommand = oCmdInsercion oDataAdapter.InsertCommand.Parameters.Add(New SqlParameter("@IdRegion", SqlDbType.Int)) oDataAdapter.InsertCommand.Parameters.Add(New SqlParameter("@Region", SqlDbType.NVarChar)) Dim oCmdConsulta As New SqlCommand("SELECT * FROM Region", oConexion) oDataAdapter.SelectCommand = oCmdConsulta 'crear conjunto de datos oDataSet = New DataSet 'llamar procedimiento Me.CargaDatos() End Sub

  

Page 12: Acceso a Datos · Acceso a Datos con VB .NET 2005 Ing. Eduardo Reyes 2 Acceso a datos En este capítulo realizaremos una conexión, lectura, inserción, actualización ...

    Acceso a Datos con VB .NET 2005 

Ing. Eduardo Reyes  

11

Private Sub CargaDatos() 'limpiamos el conjunto de datos oDataSet.Clear() 'abrir conexion oConexion.Open() 'utilizar el adaptador para llenar el dataset con la tabla oDataAdapter.Fill(oDataSet, "Region") 'cerrar conexion oConexion.Close() 'enlazar el dataset con el datagrid 'en DataSource se asigna el dataset 'en DataMember el nombre de la tabla del dataset que mostrará el datagrid Me.grdDatos.DataSource = oDataSet Me.grdDatos.DataMember = "Region" End Sub

 Fig. 15: Código del evento Load del frmInsertaDatos 

Finalmente,  en  el botón Grabar,  escribiremos  las  instrucciones para  insertar un nuevo  registro  en  la tabla Region, el cual se codificara como se ve en la Fig. 16. 

Private Sub btnGrabar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGrabar.Click Dim iResultado As Integer 'asignar los valores a los parametros para el comando insercion oDataAdapter.InsertCommand.Parameters("IdRegion").Value = Me.txtRegion.Text oDataAdapter.InsertCommand.Parameters("Region").Value = Me.txtRegion.Text 'abrir conexion oConexion.Open() 'ejecutar comando de insercion del adaptador iResultado = oDataAdapter.InsertCommand.ExecuteNonQuery() 'cerrar conexion oConexion.Close() Me.CargaDatos() MessageBox.Show("Registros Añadidos:" & iResultado) End Sub

 Fig. 15: Código del Botón Grabar para Insertar nuevas Regiones 

Una vez codificado todos los procedimientos ejecutamos la aplicación la cual vemos en la Fig. 16. 

 

Fig. 16: Formulario con un Nuevo Registro Insertado 

Page 13: Acceso a Datos · Acceso a Datos con VB .NET 2005 Ing. Eduardo Reyes 2 Acceso a datos En este capítulo realizaremos una conexión, lectura, inserción, actualización ...

    Acceso a Datos con VB .NET 2005 

Ing. Eduardo Reyes  

12

Actualización

Para  poder  realizar  una  actualización  de  datos,  crearemos  dentro  del  evento  Load  un  objeto CommandBuilder,  pasándole  como  parámetro  el  DataAdapter.  Como  ya  sabemos,  un  DataAdapter contiene una serie de objetos Command para  las operaciones de consulta,  inserción, etc. La misión en este  caso  del  objeto  CommandBuilder,  es  la  de  construir  automáticamente  tales  comandos  y asignárselos al DataAdapter, ahorrándonos ese trabajo de codificación. 

Para  poder  hacer  uso  de  un  objeto  CommandBuilder  vamos  a  crear  un  formulario  y  lo  llamaremos frmActualizaDatos luego agregamos los siguientes controles.  

Control  NameDataGridView  grdDatosButton  btnActualizar

 

En esta aplicación vamos a utilizar el objeto DataAdapter para realizar una consulta en  la tabla Region de  la BD Northwind con  la cual venimos  trabajando y actualizar  filas en esa misma  tabla. Después de agregar los controles que describimos anteriormente el formulario debe de quedar como se muestra en la Fig. 17. 

 

Fig. 17: Formulario frmActualizaDatos 

En el siguiente paso escribiremos el procedimiento del evento Load del  formulario  frmActualizaDatos, cargamos el DataSet, y  lo asignamos al DataGrid a través de su propiedad DataSource y DataMember, luego codificamos el evento click del btnActualiza. Veamos la Fig. 18. 

Una vez codificado el evento load del frmActualizaDatos y el evento click del btnActualiza ejecutamos la aplicación la cual vemos en la Fig. 19. 

 

 

 

 

Page 14: Acceso a Datos · Acceso a Datos con VB .NET 2005 Ing. Eduardo Reyes 2 Acceso a datos En este capítulo realizaremos una conexión, lectura, inserción, actualización ...

    Acceso a Datos con VB .NET 2005 

Ing. Eduardo Reyes  

13

Dim oCn As SqlConnection Dim oDs As DataSet Dim oDa As SqlDataAdapter

Private Sub frmActualizaDatos_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

'crea conexion oCn = New SqlConnection oCn.ConnectionString = "Server=Srv01;Database=Northwind;uid=sa;pwd=;" 'crear adaptador y realizar la consulta oDa = New SqlDataAdapter("SELECT * FROM Region", oCn) 'crear command builder Dim oCb As SqlCommandBuilder = New SqlCommandBuilder(oDa) 'crear dataset oDs = New DataSet oDa.Fill(oDs, "Region") 'agregar dataset al datagrid Me.grdDatos.DataSource = oDs Me.grdDatos.DataMember = "Region" End Sub

Private Sub btnActualiza_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnActualiza.Click

oDa.Update(oDs, "Region") End Sub

Fig. 18: Código del evento Load del Formulario  el evento click del Botón Actualizar 

 

 

Fig. 19: Formulario frmActualizaDatos con un Registro Modificado 

 

 

 

 

 

 

 

 

Page 15: Acceso a Datos · Acceso a Datos con VB .NET 2005 Ing. Eduardo Reyes 2 Acceso a datos En este capítulo realizaremos una conexión, lectura, inserción, actualización ...

    Acceso a Datos con VB .NET 2005 

Ing. Eduardo Reyes  

14

Eliminación

Para poder realizar la eliminación de filas es algo diferente a lo que venimos haciendo anteriormente, a la hora de obtener la fila a borrar tenemos que hacerlo mediante un objeto DataRow, procediendo a su borrado con el método Delete( ).  

Para  actualizar  los  borrados  realizados,  empleamos  el método  GetChanges(  )  del  objeto  DataTable, obteniendo a  su vez un objeto  table  sólo  con  las  filas borradas, dicha  información que pasaremos al DataAdapter, para que actualice la información en el origen de datos. 

Para poder hacer uso de un objeto DataRow y DataTable vamos a crear un formulario y lo llamaremos frmEliminaDatos luego agregamos los siguientes controles.  

Control  NameDataGridView  grdDatosButton  btnEliminar

 

Después de agregar los controles que describimos anteriormente, el formulario debe de quedar como se muestra en la Fig. 20. 

 

Fig. 20: Formulario frmEliminaDatos 

En el siguiente paso escribiremos el código del evento Load del formulario frmEliminaDatos, cargamos el DataSet,  y  lo  asignamos  al  DataGrid  a  través  de  su  propiedad  DataSource  y  DataMember,  luego codificamos el evento  click del btnEliminar, declarando una  variable para poder  identificar  la  fila del datagrid a eliminar a travez del uso de  sus propiedades. Veamos la Fig. 21. 

Una vez codificado el evento  load del  frmEliminaDatos y el evento click del btnElimina ejecutamos  la aplicación la cual vemos en la Fig. 22. 

 

 

 

 

Page 16: Acceso a Datos · Acceso a Datos con VB .NET 2005 Ing. Eduardo Reyes 2 Acceso a datos En este capítulo realizaremos una conexión, lectura, inserción, actualización ...

    Acceso a Datos con VB .NET 2005 

Ing. Eduardo Reyes  

15

Dim oCn As SqlConnection Dim oDs As DataSet Dim oDa As SqlDataAdapter Private Sub frmEliminaDatos_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 'crea conexion oCn = New SqlConnection oCn.ConnectionString = "Server=Srv01;Database=Northwind;uid=sa;pwd=;" 'crear adaptador y realizar la consulta oDa = New SqlDataAdapter("SELECT * FROM Region", oCn) 'crear commandbuilder Dim oCb As SqlCommandBuilder = New SqlCommandBuilder(oDa) 'crear dataset oDs = New DataSet oDa.Fill(oDs, "Region") 'agregar dataset al datagrid Me.grdDatos.DataSource = oDs Me.grdDatos.DataMember = "Region" End Sub Private Sub btnEliminar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEliminar.Click Dim oDataRow As DataRow Dim iPosicFilaActual As Integer iPosicFilaActual = 0 iPosicFilaActual = CInt(grdDatos.Item(0, grdDatos.CurrentRow.Index - 1).Value) ' obtener el objeto fila, de la tabla del dataset ' en el que estamos posicionados oDataRow = oDs.Tables("Region").Rows(iPosicFilaActual) oDataRow.Delete() ' borrar la fila ' mediante el método GetChanges(), obtenemos una tabla ' con las filas borradas Dim oTablaBorrados As DataTable oTablaBorrados = oDs.Tables("Region").GetChanges(DataRowState.Deleted) ' actualizar en el almacén de datos las filas borradas oDa.Update(oTablaBorrados) ' confirmar los cambios realizados oDs.Tables("Region").AcceptChanges() End Sub 

  

Fig. 21: Código del evento Load del Formulario  el evento click del Botón Eliminar 

      

Fig. 22: Formulario frmEliminaDatos con un Registro Eliminado

Page 17: Acceso a Datos · Acceso a Datos con VB .NET 2005 Ing. Eduardo Reyes 2 Acceso a datos En este capítulo realizaremos una conexión, lectura, inserción, actualización ...

Capítulo II

• Navegación de registros • Relacionar tablas • Filtrar tablas • Seleccionar y mostrar registros

                           

Page 18: Acceso a Datos · Acceso a Datos con VB .NET 2005 Ing. Eduardo Reyes 2 Acceso a datos En este capítulo realizaremos una conexión, lectura, inserción, actualización ...

    Acceso a Datos con VB .NET 2005 

Ing. Eduardo Reyes  

17

 

Navegación de registros

Para realizar la navegación a través de los registros de una tabla, debemos de saber que la arquitectura de ADO  .NET está orientada a un modelo de  trabajo desconectado sobre el almacén de datos, al que recurriremos sólo cuando necesitemos obtener los datos para su consulta y manipulación. 

El  objeto  DataSet,  combinado  con  un  grupo  de  objetos  enfocados  al  mantenimiento  de  datos desconectados, como son DataAdapter, DataTable, DataRow, etc., nos va a permitir realizar la tarea de navegar entre los registros de una tabla del DataSet. 

El proyecto se denominara WAccesoDatos, la tabla a consultar será Customers de la BD NorthWind. Una vez creado el nuevo proyecto en VB.NET, importaremos el espacio de nombres System.Data.SqlClient, y declararemos a nivel de clase un conjunto de variables para  la manipulación de  los datos. Veamos  la figura 23. 

Imports System.Data.SqlClient Public Class frmNavegaRegistros Inherits System.Windows.Forms.Form 'Variables a nivel de clase 'para la manipulación de los datos Private oDa As SqlDataAdapter Private oDs As DataSet Private iPosFilaActual As Integer End Class 

  

Fig. 23: Variables declaradas 

Ahora diseñaremos el formulario denominado frmNavegaRegistros, para eso agregamos  los siguientes controles, los cuales nos permitirá realizar las operaciones mencionadas. 

 

Control  NameLabel1  lblIDClienteLabel2  lblClienteLabel3  lblContactoLabel4  lblDireccionLabel5  lblFonoTextBox1  txtIDClienteTextBox2  txtClienteTextBox3  txtContactoTextBox4  txtDireccionTextBox5  txtFonoButton1  btnPrimeroButton2  btnAvanzaButton3  btnRetrocedeButton4  btnUltimoGroupBox1  gbxClientesGroupBox2  gbxNavegar

   

Después de agregar los controles que describimos anteriormente, el formulario debe de quedar como se muestra en la Fig. 24. 

Page 19: Acceso a Datos · Acceso a Datos con VB .NET 2005 Ing. Eduardo Reyes 2 Acceso a datos En este capítulo realizaremos una conexión, lectura, inserción, actualización ...

    Acceso a Datos con VB .NET 2005 

Ing. Eduardo Reyes  

18

 

Fig. 24: Formulario frmNavegaRegistros 

Como  siguiente paso, escribiremos el manipulador del evento  Load del  formulario y un método para cargar los datos del registro actual en los controles del formulario, el Código se muestra en la figura  25. 

Private Sub frmNavegaRegistros_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load ' crear conexión Dim oConexion As SqlConnection oConexion = New SqlConnection() oConexion.ConnectionString = "Server=Srv01;" & _ "Database=Northwind;uid=sa;pwd=;" ' crear adaptador Me.oDa = New SqlDataAdapter("SELECT * FROM Customers", oConexion) ' crear commandbuilder Dim oCommBuild As SqlCommandBuilder = New SqlCommandBuilder(oDa) ' crear dataset Me.oDs = New DataSet() oConexion.Open() ' llenar con el adaptador el dataset Me.oDa.Fill(oDs, "Customers") oConexion.Close() ' establecer el indicador del registro a mostrar de la tabla Me.iPosFilaActual = 0 ' cargar columnas del registro en los controles del formulario Me.CargarDatos() End Sub Private Sub CargarDatos() ' obtener un objeto con la fila actual Dim oDataRow As DataRow oDataRow = Me.oDs.Tables("Customers").Rows(Me.iPosFilaActual) ' cargar los controles del formulario con ' los valores de los campos del registro Me.txtIDCliente.Text = oDataRow("CustomerID") Me.txtCliente.Text = oDataRow("CompanyName") Me.txtContacto.Text = oDataRow("ContactName") Me.txtDireccion.Text = oDataRow("Address") Me.txtFono.Text = oDataRow("Phone") ' mostrar la posición actual del registro y el número total del registros Me.lblRegistro.Text = "Cliente: " & _ Me.iPosFilaActual + 1 & " de " & _ Me.oDs.Tables("Customers").Rows.Count End Sub

 

Fig. 25: Código del Evento Load y el Procedimiento Cargar Datos 

Page 20: Acceso a Datos · Acceso a Datos con VB .NET 2005 Ing. Eduardo Reyes 2 Acceso a datos En este capítulo realizaremos una conexión, lectura, inserción, actualización ...

    Acceso a Datos con VB .NET 2005 

Ing. Eduardo Reyes  

19

Observar que en el evento Load se ha creado un objeto CommandBuilder, pasándole como parámetro el DataAdapter.  Como  ya  sabemos,  un  DataAdapter  contiene  una  serie  de  objetos  Command  para  las operaciones de  consulta,  inserción, etc.  La misión en este  caso del objeto CommandBuilder, es  la de construir automáticamente tales comandos y asignárselos al DataAdapter, ahorrándonos ese trabajo de codificación. En cuanto a las operaciones de navegación por la tabla, no hay un objeto, como ocurría con el  Recordset  de  ADO,  que  disponga  de  métodos  específicos  de  movimiento  como  MoveNext(  ), MoveLast( ), etc. Lo que debemos hacer en ADO .NET, tal y como muestra el método CargarDatos(), es obtener del DataSet,  la tabla que necesitemos mediante su colección Tables, y a su vez, a  la colección Rows de esa tabla, pasarle el número de fila/registro al que vamos a desplazarnos. En nuestro ejemplo utilizaremos la variable iPosFilaActual, definida a nivel de clase, para saber en todo momento, la fila de la  tabla en  la que nos encontramos. El Código  fuente de cada botón de navegación se muestra en  la figura 26. 

Private Sub btnPrimero_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnPrimero.Click ' establecer el marcador de registro en el primero Me.iPosFilaActual = 0 Me.CargarDatos() End Sub Private Sub btnAvanza_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnAvanza.Click ' si estamos en el primer registro, ' no hacer movimiento If Me.iPosFilaActual = 0 Then MessageBox.Show("Primer registro") Else ' disminuir el marcador de registro ' y actualizar los controles con los ' datos del registro actual Me.iPosFilaActual -= 1 Me.CargarDatos() End If End Sub Private Sub btnRetrocede_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnRetrocede.Click ' si estamos en el último registro, ' no hacer movimiento If Me.iPosFilaActual = _ (Me.oDs.Tables("Customers").Rows.Count - 1) Then MessageBox.Show("Último registro") Else ' incrementar el marcador de registro ' y actualizar los controles con los ' datos del registro actual Me.iPosFilaActual += 1 Me.CargarDatos() End If End Sub Private Sub btnUltimo_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles btnUltimo.Click ' establecer el marcador de registro en el primero ' obteniendo el número de filas que contiene la tabla menos uno Me.iPosFilaActual = (Me.oDs.Tables("Customers").Rows.Count - 1) Me.CargarDatos() End Sub

 

Fig. 26: Código de los botones de navegación 

Una vez codificado el evento load del frmNavegaRegistros, el procedimiento Cargar Datos y los eventos click de los botones de navegación ejecutamos la aplicación la cual vemos en la Fig. 27. 

Page 21: Acceso a Datos · Acceso a Datos con VB .NET 2005 Ing. Eduardo Reyes 2 Acceso a datos En este capítulo realizaremos una conexión, lectura, inserción, actualización ...

    Acceso a Datos con VB .NET 2005 

Ing. Eduardo Reyes  

20

 

Fig. 27: Formulario frmNavegaRegistros  

Page 22: Acceso a Datos · Acceso a Datos con VB .NET 2005 Ing. Eduardo Reyes 2 Acceso a datos En este capítulo realizaremos una conexión, lectura, inserción, actualización ...

    Acceso a Datos con VB .NET 2005 

Ing. Eduardo Reyes  

21

Relacionar tablas

Para  llevar a cabo  la relación entre dos tablas, ambas tablas deben de tener un campo en común para realizar la relación, en esta oportunidad realizaremos la relación entre las tablas Customers y Orders por su campo clave (CustomerID) (ambas se encuentran dentro de la BD Northwind). Después llenamos un ComboBox con datos de la tabla Customers. Al seleccionar un valor del ComboBox, se tomarán las filas relacionadas de la tabla Orders y se llenará con ellas un ListBox. 

Una  vez  conocido  lo  que  se  desea  hacer  lo  primero  es  crear  un  proyecto  al  cual  llamaremos WAccesoDatos, las tablas a consultar seran Customers y Orders de la BD NorthWind. Una vez creado el nuevo proyecto en VB.NET, importaremos el espacio de nombres System.Data.SqlClient, y declararemos a nivel de clase un conjunto de variables para la manipulación de los datos. Veamos la figura 28. 

Imports System.Data Imports System.Data.SqlClient Public Class frmNavegaRegistros 'Variables a nivel de clase 'para la manipulación de los datos Dim Cn As SqlConnection Private DaC As SqlDataAdapter Private DaO As SqlDataAdapter Private Ds As DataSet Dim str As String End Class

Fig. 28: Variables declaradas 

Ahora diseñaremos el  formulario denominado  frmRelacionaTablas, para eso agregamos  los siguientes controles, los cuales nos permitirá realizar las operaciones mencionadas. 

Control  NameGroupBox  gbxClientesComboBox  cboClientesListBox  lstOrdenes

   

Después de agregar los controles que describimos anteriormente, el formulario debe de quedar como se muestra en la Fig. 29. 

 

Fig. 29: Formulario frmRelacionaTablas 

Page 23: Acceso a Datos · Acceso a Datos con VB .NET 2005 Ing. Eduardo Reyes 2 Acceso a datos En este capítulo realizaremos una conexión, lectura, inserción, actualización ...

    Acceso a Datos con VB .NET 2005 

Ing. Eduardo Reyes  

22

Como  siguiente  paso,  escribiremos  el  código  del  evento  Load  del  frmRelacionaTablas  y  el  evento SelectedIndexChanged del cboClientes, el Código se muestra en la figura  30. 

 Private Sub frmRelacionaTablas_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load 'crear conexion Cn = New SqlConnection() str = "Server=EDUARD;database=Northwind;uid=sa;password=master" Cn.ConnectionString = str 'creamos los dos data adapter Me.DaC = New SqlDataAdapter("Select * from Customers", Cn) Me.DaO = New SqlDataAdapter("Select * from Orders", Cn) 'instaciar dataset Me.Ds = New DataSet 'abrir la conexion Cn.Open() 'utilizamos los DataAdapters para llenar los DataSets Me.DaC.Fill(Me.Ds, "Customers") Me.DaO.Fill(Me.Ds, "Orders") 'cerramos la conexion Cn.Close() 'relacionamos las tablas del DataSet por campo común Me.Ds.Relations.Add("Customers Orders", Ds.Tables _ ("Customers").Columns("CustomerID"), _ Ds.Tables("Orders").Columns("CustomerID")) 'llenar el combobox con los nombres del cliente Dim Dr As DataRow For Each Dr In Ds.Tables("Customers").Rows Me.cboClientes.Items.Add(Dr("CustomerID") & _ " - " & Dr("CompanyName")) Next End Sub Private Sub cboClientes_SelectedIndexChanged(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles cboClientes.SelectedIndexChanged 'limpiar los valores del combo Me.lstOrdenes.Items.Clear() Dim DrC As DataRow 'obtener la fila de tabla Customers DrC = Ds.Tables("Customers").Rows(Me.cboClientes.SelectedIndex) Dim DrO() As DataRow 'obtener las filas de la tabla Orders DrO = DrC.GetChildRows("Customers Orders") Dim DrFila As DataRow 'rellenar el listbox con los valores de la tabla Orders For Each DrFila In DrO Me.lstOrdenes.Items.Add(DrFila("CustomerID") & _ " - " & DrFila("OrderID") & " - " & DrFila("OrderDate")) Next End Sub End Class 

  

Fig. 30: Código del frmRelacionaTablas 

Una  vez  codificado  el  evento  load del  frmRelacionaTablas  y  el  evento del  cboClientes  ejecutamos  la aplicación la cual vemos en la Fig. 31. 

Page 24: Acceso a Datos · Acceso a Datos con VB .NET 2005 Ing. Eduardo Reyes 2 Acceso a datos En este capítulo realizaremos una conexión, lectura, inserción, actualización ...

    Acceso a Datos con VB .NET 2005 

Ing. Eduardo Reyes  

23

 

Fig. 31: Formulario frmRelacionaTablas                                        

Page 25: Acceso a Datos · Acceso a Datos con VB .NET 2005 Ing. Eduardo Reyes 2 Acceso a datos En este capítulo realizaremos una conexión, lectura, inserción, actualización ...

    Acceso a Datos con VB .NET 2005 

Ing. Eduardo Reyes  

24

Filtrar tablas

Para realizar el filtrado a través de los registros de una tabla, utilizaremos la clase DataView la cual nos permite la aplicación de vistas personalizadas a partir de una tabla contenida en un DataSet, así como la ordenación y búsqueda de filas. 

En ADO clásico, para disponer de varias vistas de una misma tabla, debíamos crear diferentes objetos Recordset,  lo cual provocaba el consumo de una gran cantidad de recursos. Este aspecto ha cambiado profundamente en ADO .NET, ya que partiendo de un objeto DataTable situado en un DataSet, vamos a definir varias vistas simultáneamente, ordenar y buscar registros, con la ventaja de que el consumo de recursos es menor, puesto que los objetos DataView se alimentan del mismo DataTable.  

El proyecto se denominara WAccesoDatos, la tabla a consultar será Customers de la BD NorthWind. Una vez creado el nuevo proyecto en VB .NET, importaremos los espacio de nombres y declararemos a nivel de clase un conjunto de variables para la manipulación de los datos. Veamos la figura 32. 

Imports System.Data Imports System.Data.SqlClient Public Class frmFiltroClientes Dim Cn As SqlConnection Private Da As SqlDataAdapter Private Ds As DataSet Dim Str As String End Class 

 Fig. 32: Variables declaradas 

Ahora  diseñaremos  el  formulario  denominado  frmFiltroClientes,  para  eso  agregamos  los  siguientes controles, los cuales nos permitirá realizar las operaciones mencionadas. 

Control  NameLabel1  lblContactoGroupBox1  gbxClientesTextBox1  txtContactoDataGridView  dgFiltro

   

Después de agregar los controles que describimos anteriormente, el formulario debe de quedar como se muestra en la Fig. 33. 

 

Fig. 33: Formulario frmFiltroClientes 

Page 26: Acceso a Datos · Acceso a Datos con VB .NET 2005 Ing. Eduardo Reyes 2 Acceso a datos En este capítulo realizaremos una conexión, lectura, inserción, actualización ...

    Acceso a Datos con VB .NET 2005 

Ing. Eduardo Reyes  

25

La  propiedad  RowFilter  de  la  clase DataView  nos  permite  asignar  a  este  objeto,  una  cadena  con  la expresión de  filtro, que en una  consulta en  lenguaje SQL  sería  la parte  correspondiente a  la  cláusula Where. 

Como  hemos  comentado  anteriormente,  a  partir  de  un  DataTable  podemos  obtener  varios  filtros mediante distintos objetos DataView, sin que ello suponga una penalización en el consumo de recursos. Para demostrar este punto, en el  frmFiltroClientes,  se  crea una  vista basada en un  filtro  y una  vista normal.  A  continuación  escribiremos  el  código  del  evento  Load  del  frmFiltroClientes  y  el  evento Keypress del txtContacto, el Código se muestra en la figura  34. 

 Private Sub frmFiltroClientes_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load 'creamos la conexion Cn = New SqlConnection Str = "Server=Srv01;DataBase=Northwind;UID=sa" Cn.ConnectionString = Str 'crear el adaptador (consulta) Me.Da = New SqlDataAdapter("Select * From Customers", Cn) 'agregar consulta al dataset Me.Ds = New DataSet() Me.Da.Fill(Ds, "Customers") Me.Da = Nothing End Sub Private Sub txtContacto_KeyPress(ByVal sender As Object, _ ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtContacto.KeyPress Dim Dv As DataView If Asc(e.KeyChar) = 13 Then Dv = New DataView 'filtrar por el campo y llenar el datagridview Dv.Table = Ds.Tables("Customers") Dv.RowFilter = "ContactName LIKE '%" & txtContacto.Text & "%'" 'agregar el filtro para mostrar en el Grid dgFiltro.DataSource = Dv End If End Sub 

  

Fig. 34: Código del frmFiltroClientes 

Una  vez  codificado  el  evento  load  del  frmFiltroClientes  y  el  evento  del  txtContacto  ejecutamos  la aplicación la cual vemos en la Fig. 35. 

 

Fig. 35: Formulario frmFiltroClientes