Beruflich Dokumente
Kultur Dokumente
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
Ing. Eduardo Reyes 10
Acceso a Datos con VB .NET 2005
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.
Me.CargaDatos()
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
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
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
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.
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.
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
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
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
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
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