Sie sind auf Seite 1von 26

 

 
 
 
 

Acceso a Datos
Visual Basic .NET 2005
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Capítulo I
• Acceso a datos
• Lectura de datos
• Inserción
• Actualización
• Eliminación
    Acceso a Datos con VB .NET 2005 

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 

Ing. Eduardo Reyes  2
 
    Acceso a Datos con VB .NET 2005 

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 

Ing. Eduardo Reyes  3
 
    Acceso a Datos con VB .NET 2005 

 
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. 

Ing. Eduardo Reyes  4
 
    Acceso a Datos con VB .NET 2005 

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  Name
Button1  btnEmpleados
Button2  btnCliProd
ListBox1  lstEmpleados
ListBox2  lstClientes
ListBox3  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. 

Ing. Eduardo Reyes  5
 
    Acceso a Datos con VB .NET 2005 

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

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

Ing. Eduardo Reyes  6
 
    Acceso a Datos con VB .NET 2005 

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  Name
Button1  btnCustomers
ListBox1  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 

Ing. Eduardo Reyes  7
 
    Acceso a Datos con VB .NET 2005 

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 

Ing. Eduardo Reyes  8
 
    Acceso a Datos con VB .NET 2005 

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  Name
DataGridView  grdDatos
TextBox1  txtPrograma
TextBox2  txtDescripcion
Label1  lblPrograma
Label2  lblDescripcion
Button  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. 

Ing. Eduardo Reyes  9
 
    Acceso a Datos con VB .NET 2005 

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
 
 

Ing. Eduardo Reyes  10
 
    Acceso a Datos con VB .NET 2005 

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 

Ing. Eduardo Reyes  11
 
    Acceso a Datos con VB .NET 2005 

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  Name
DataGridView  grdDatos
Button  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. 

Ing. Eduardo Reyes  12
 
    Acceso a Datos con VB .NET 2005 

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 

Ing. Eduardo Reyes  13
 
    Acceso a Datos con VB .NET 2005 

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  Name
DataGridView  grdDatos
Button  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. 

Ing. Eduardo Reyes  14
 
    Acceso a Datos con VB .NET 2005 

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

Ing. Eduardo Reyes  15
 
Capítulo II
• Navegación de registros
• Relacionar tablas
• Filtrar tablas
• Seleccionar y mostrar registros
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
    Acceso a Datos con VB .NET 2005 

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  Name
Label1  lblIDCliente
Label2  lblCliente
Label3  lblContacto
Label4  lblDireccion
Label5  lblFono
TextBox1  txtIDCliente
TextBox2  txtCliente
TextBox3  txtContacto
TextBox4  txtDireccion
TextBox5  txtFono
Button1  btnPrimero
Button2  btnAvanza
Button3  btnRetrocede
Button4  btnUltimo
GroupBox1  gbxClientes
GroupBox2  gbxNavegar
   

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

Ing. Eduardo Reyes  17
 
    Acceso a Datos con VB .NET 2005 

 
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 

Ing. Eduardo Reyes  18
 
    Acceso a Datos con VB .NET 2005 

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. 

Ing. Eduardo Reyes  19
 
    Acceso a Datos con VB .NET 2005 

Fig. 27: Formulario frmNavegaRegistros 
 

Ing. Eduardo Reyes  20
 
    Acceso a Datos con VB .NET 2005 

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  Name
GroupBox  gbxClientes
ComboBox  cboClientes
ListBox  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 

Ing. Eduardo Reyes  21
 
    Acceso a Datos con VB .NET 2005 

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. 

Ing. Eduardo Reyes  22
 
    Acceso a Datos con VB .NET 2005 

Fig. 31: Formulario frmRelacionaTablas 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Ing. Eduardo Reyes  23
 
    Acceso a Datos con VB .NET 2005 

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  Name
Label1  lblContacto
GroupBox1  gbxClientes
TextBox1  txtContacto
DataGridView  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 

Ing. Eduardo Reyes  24
 
    Acceso a Datos con VB .NET 2005 

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 

Ing. Eduardo Reyes  25
 

Das könnte Ihnen auch gefallen