7/29/2019 Leccion 6 - Conjunto de Datos y Enlace
1/17
[VISUAL BASIC.NET CON BASE DE DATOS] IDSYSTEMS 2013
La clase DataSet
DataSet pertenece al conjunto comn de clases de ADO .NET, emplendose para todo tipo de
proveedores, por lo que no existe una versin particular para SqlClient u OleDb,. En la introduccinque sobre ADO .NET realizamos en el anterior tema, hemos comentado algunos aspectos sobre esta
clase.
Bsicamente, un objeto DataSet va a ser similar a un objeto Recordset de ADO, pero ms potente y
complejo. Es el almacn de datos por excelencia en ADO .NET, representando una base de datos en
memoria y desconectada del proveedor de datos, que contiene tablas y sus relaciones.
El objeto DataSet nos proporciona el mejor concepto sobre datos desconectados: una copia en el
cliente de la arquitectura de la base de datos, basada en un esquema XML que la independiza del
fabricante, proporcionando al desarrollador la libertad de trabajo independiente de la plataforma.
Cada tabla contenida dentro de un objeto DataSet se encuentra disponible a travs de su propiedad
Tables, que es una coleccin de objetos System.Data.DataTable. Cada objeto DataTable contiene unacoleccin de objetos DataRow que representan las filas de la tabla. Y si seguimos con esta analoga
tenemos que decir que cada objeto DataRow, es decir, cada fila, posee una coleccin de objetos
DataColumn, que representan cada una de las columnas de la fila actual. Existen adems, colecciones
y objetos para representan las relaciones, claves y valores por defecto existentes dentro de un objetoDataSet.
Cada objeto DataTable dispone de una propiedad llamada DefaultView, que devuelve un objeto de la
clase DataView, el cual nos ofrece una vista de los datos de la tabla para que podamos recorrer los
datos, filtrarlos, ordenarlos, etc.
Para poder crear e inicializar las tablas del DataSet debemos hacer uso del objeto DataAdapter, que
posee las dos versiones, es decir, el objeto SqlDataAdapter para SQL Server y OleDbDataAdapter
genrico de OLE DB.
Al objeto DataAdapter le pasaremos como parmetro una cadena que representa la consulta que se va
a ejecutar, y que va a rellenar de datos el DataSet. Del objeto DataAdapter utilizaremos el mtodoFill(), que posee dos parmetros; el primero es el DataSet a rellenar de informacin; y el segundo, una
cadena con el nombre que tendr la tabla creada dentro del DataSet, producto de la ejecucin de la
consulta.
En el siguiente apartado veremos los objetos DataAdapter, que van a funcionar como intermediarios
entre el almacn de datos, y el objeto DataSet, que contiene la versin desconectada de los datos.
Entre los mtodos ms destacables de la clase DataSet podemos mencionar los siguientes.
Clear( ). Elimina todos los datos almacenados en el objeto DataSet, vaciando todas las tablas
contenidas en el mismo.
AcceptChanges( ). Confirma todos los cambios realizados en las tablas y relaciones
contenidas en el objeto DataSet, o bien los ltimos cambios que se han producido desde la
ltima llamada al mtodo AcceptChanges.
GetChanges( ). Devuelve un objeto DataSet que contiene todos los cambios realizados desde
que se carg con datos, o bien desde que se realiz la ltima llamada al mtodo
AcceptChanges.
LECCION 6 Conjunto de Datos y enlace Pgina 1
7/29/2019 Leccion 6 - Conjunto de Datos y Enlace
2/17
[VISUAL BASIC.NET CON BASE DE DATOS] IDSYSTEMS 2013
HasChanges( ). Devuelve true o false para indicar si se han realizado cambios al contenido
del DataSet desde que fue cargado o bien desde que se realiz la ltima llamada al mtodo
AcceptChanges.
RejectChanges( ). Abandona todos los cambios realizados en las tablas contenidas en el
objeto DataSet desde que fue cargado el objeto o bien desde la ltima vez que se lanz el
mtodo AcceptChanges.
Merge( ). Toma los contenidos de un DataSet y los mezcla con los de otro DataSet, de forma
que contendr los datos de ambos objetos DataSet.
En lo que respecta a las propiedades de la clase DataSet, podemos remarcar las siguientes.
CaseSensitive. Propiedad que indica si las comparaciones de texto dentro de las tablas
distinguen entre maysculas y minsculas. Por defecto tiene el valor False.
DataSetName. Establece o devuelve mediante una cadena de texto el nombre del objeto
DataSet.
HasErrors. Devuelve un valor lgico para indicar si existen errores dentro de las tablas del
DataSet.
Relations. Esta propiedad devuelve una coleccin de objetos DataRelation, que representan
todas las relaciones existentes entre las tablas del objeto DataSet.
Tables. Devuelve una coleccin de objetos DataTable, que representan a cada una de las
tablas existentes dentro del objeto DataSet.
En el ejemplo del Cdigo fuente 568 ofrecemos un sencillo ejemplo de creacin 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.
' crear conexinDim oConexion As New SqlConnection()oConexion.ConnectionString = "Server=(local);Database=Northwind;uid=sa;pwd=;"
' crear adaptadorDim oDataAdapter As New SqlDataAdapter("SELECT * FROM Customers ORDER BYContactName", oConexion)
' crear conjunto de datosDim oDataSet As New DataSet()
oConexion.Open()' utilizar el adaptador para llenar el dataset con una tablaoDataAdapter.Fill(oDataSet, "Customers")oConexion.Close()
' una vez desconectados, recorrer la tabla del datasetDim oTabla As DataTableoTabla = oDataSet.Tables("Customers")
Dim oFila As DataRowFor Each oFila In oTabla.Rows
' mostrar los datos mediante un objeto filaMe.lstCustomers.Items.Add(oFila.Item("CompanyName") & _
" - " & oFila.Item("ContactName") & " - " & _oFila.Item("Country"))
Next
LECCION 6 Conjunto de Datos y enlace Pgina 2
7/29/2019 Leccion 6 - Conjunto de Datos y Enlace
3/17
[VISUAL BASIC.NET CON BASE DE DATOS] IDSYSTEMS 2013
Cdigo fuente 568
La Figura 343 muestra el ListBox llenado a partir del DataSet.
Figura 343. Relleno de un ListBox mediante un DataSet.
Las clases DataAdapter
Como hemos comentado en anteriores apartados, los objetos DataAdapter (SqlDataAdapter yOleDbDataAdapter) van a desempear el papel de puente entre el origen de datos y el DataSet,
permitindonos cargar el DataSet con la informacin de la fuente de datos, y posteriormente,actualizar el origen de datos con la informacin 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 estndar de manipulacin de
datos. Estas propiedades son las siguientes.
InsertCommand. Objeto de la clase Command, que se va a utilizar para realizar una insercin
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
modificacin de los datos.
DeleteCommand. Objeto de la clase Command que se va a utilizar para realizar una
eliminacin de datos.
Un mtodo destacable de las clases SqlDataAdapter/OleDbDataAdapter es el mtodo Fill( ), que
LECCION 6 Conjunto de Datos y enlace Pgina 3
7/29/2019 Leccion 6 - Conjunto de Datos y Enlace
4/17
[VISUAL BASIC.NET CON BASE DE DATOS] IDSYSTEMS 2013
ejecuta el comando de seleccin que se encuentra asociado a la propiedad SelectCommand, los datos
obtenidos del origen de datos se cargarn en el objeto DataSet que pasamos por parmetro.
La Figura 344 muestra la relacin entre los objetos DataAdapter y el objeto DataSet.
Figura 344. Relacin entre objetos DataAdapter y DataSet.
Para demostrar el uso de los objetos DataAdapter vamos a desarrollar un proyecto con el nombrePruDataAdapter (hacer clic aqupara acceder a este ejemplo). En esta aplicacin vamos a utilizar el
mismo objeto DataAdapter para realizar una consulta contra una tabla e insertar nuevas filas en esa
misma tabla.
En primer lugar disearemos el formulario del programa. Como novedad, introduciremos el control
DataGrid, que trataremos con ms profundidad en un prximo apartado. Baste decir por el momento,que a travs del DataGrid visualizaremos una o varias tablas contenidas en un DataSet. La Figura 345
muestra el aspecto de esta aplicacin en funcionamiento.
LECCION 6 Conjunto de Datos y enlace Pgina 4
7/29/2019 Leccion 6 - Conjunto de Datos y Enlace
5/17
[VISUAL BASIC.NET CON BASE DE DATOS] IDSYSTEMS 2013
Figura 345. Formulario para operaciones con DataAdapter y DataGrid.
Respecto al cdigo 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 mtodos. Veamos el Cdigo fuente 569.
Imports System.Data.SqlClient
Public Class Form1Inherits System.Windows.Forms.Form
Private oConexion As SqlConnectionPrivate oDataSet As DataSetPrivate oDataAdapter As SqlDataAdapter
'....'....
Cdigo fuente 569
En el siguiente paso escribiremos el procedimiento del evento Load del formulario, y el mtodo
CargarDatos( ), que se ocupa de cargar el DataSet, y asignrselo al DataGrid a travs de su propiedad
DataSource. Observe el lector que en el mtodo 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
limpiramos el DataSet, se acumularan las sucesivas operaciones de llenado de filas sobre la tabla que
contiene. Veamos el Cdigo fuente 570.
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) HandlesMyBase.Load
' crear conexinoConexion = New SqlConnection()oConexion.ConnectionString = "Server=(local);Database=MUSICA;uid=sa;pwd=;"
' crear adaptadoroDataAdapter = New SqlDataAdapter()
' crear comandos para insercin, consulta con sus parmetros' y asignarlos al adaptadorDim oCmdInsercion As New SqlCommand("INSERT INTO AUTORES " & _
"(IDAutor,Autor) VALUES(@IDAutor,@Autor)", oConexion)oDataAdapter.InsertCommand = oCmdInsercionoDataAdapter.InsertCommand.Parameters.Add(NewSqlParameter("@IDAutor",
SqlDbType.Int))oDataAdapter.InsertCommand.Parameters.Add(NewSqlParameter("@Autor",
SqlDbType.NVarChar))
LECCION 6 Conjunto de Datos y enlace Pgina 5
mailto:@IDAutormailto:@Autormailto:@IDAutormailto:@Autor7/29/2019 Leccion 6 - Conjunto de Datos y Enlace
6/17
[VISUAL BASIC.NET CON BASE DE DATOS] IDSYSTEMS 2013
Dim oCmdConsulta As New SqlCommand("SELECT * FROM AUTORES", _oConexion)
oDataAdapter.SelectCommand = oCmdConsulta
' crear conjunto de datosoDataSet = New DataSet()
Me.CargarDatos()
End Sub
Private Sub CargarDatos()' vaciar el datasetoDataSet.Clear()
oConexion.Open() ' abrir conexin' utilizar el adaptador para llenar el dataset con una tablaoDataAdapter.Fill(oDataSet, "Autores")oConexion.Close() ' cerrar conexin
' enlazar dataset con datagrid;' en DataSource se asigna el dataset,' en DataMember el nombre de la tabla del' dataset que mostrar el datagridMe.grdDatos.DataSource = oDataSetMe.grdDatos.DataMember = "Autores"
End Sub
Cdigo fuente 570
Finalmente, en el botn Grabar, escribiremos las instrucciones para insertar un nuevo registro en la
tabla. Veamos el Cdigo fuente 571.
Private Sub btnGrabar_Click(ByVal sender As System.Object, ByVal e AsSystem.EventArgs) Handles btnGrabar.Click
Dim iResultado As Integer
' asignar valores a los parmetros para el' comando de insercinoDataAdapter.InsertCommand.Parameters("@IDAutor").Value = Me.txtIDAutor.TextoDataAdapter.InsertCommand.Parameters("@Autor").Value = Me.txtAutor.Text
' abrir conexinoConexion.Open()
' ejecutar comando de insercin del adaptadoriResultado = oDataAdapter.InsertCommand.ExecuteNonQuery()' cerrar conexinoConexion.Close()
Me.CargarDatos()
MessageBox.Show("Registros aadidos: " & iResultado)
End Sub
Cdigo fuente 571
Navegacin y edicin de registros en modo desconectado
LECCION 6 Conjunto de Datos y enlace Pgina 6
mailto:@IDAutormailto:@IDAutor7/29/2019 Leccion 6 - Conjunto de Datos y Enlace
7/17
[VISUAL BASIC.NET CON BASE DE DATOS] IDSYSTEMS 2013
Anteriormente vimos la forma de realizar operaciones de edicin, en modo conectado, sobre las tablas
de una base de datos, empleando los objetos Command.
Pero como tambin ya sabemos, la arquitectura de ADO .NET est orientada a un modelo de trabajo
desconectado del almacn de datos, al que recurriremos slo cuando necesitemos obtener los datos
para su consulta y manipulacin, o bien, cuando esos mismos datos desconectados, los hayamosmodificado y tengamos que actualizarlos en la fuente de datos.
El objeto DataSet, combinado con un grupo de objetos enfocados al mantenimiento de datos
desconectados, como son DataAdapter, DataTable, DataRow, etc., nos van a permitir realizar tareas
como la navegacin entre los registros de una tabla del DataSet, adems de la modificacin de sus
datos en las operaciones habituales de insercin, modificacin y borrado de filas.
El proyecto NavegaEdita que se acompaa como ejemplo (hacer clic aqu para acceder a este
ejemplo), muestra los pasos necesarios que debemos dar para crear un sencillo mantenimiento de datos
para una tabla albergada en un DataSet, junto a las tpicas operaciones de navegacin por las filas de
dicha tabla. Seguidamente iremos desgranando el conjunto de pasos a realizar.
Partimos de una sencilla base de datos en SQL Server, que contiene la tabla Clientes, con los campos
ms caractersticos de esta entidad de datos: cdigo cliente, nombre, fecha ingreso, crdito. Una vezcreado un nuevo proyecto en VB.NET, disearemos el formulario de la aplicacin que como vemos en
la Figura 346, a travs de sus controles, nos permitir realizar las operaciones mencionadas.
Pasando a la escritura del cdigo del programa, en primer lugar importaremos el espacio de nombres
System.Data.SqlClient, y declararemos a nivel de clase un conjunto de variables para la manipulacin
de los datos. Veamos el Cdigo fuente 572.
Imports System.Data.SqlClientPublic Class Form1
Inherits System.Windows.Forms.Form' variables a nivel de clase para' la manipulacin de datosPrivate oDataAdapter As SqlDataAdapterPrivate oDataSet As DataSetPrivate iPosicFilaActual As Integer'....'....
Cdigo fuente 572
LECCION 6 Conjunto de Datos y enlace Pgina 7
7/29/2019 Leccion 6 - Conjunto de Datos y Enlace
8/17
[VISUAL BASIC.NET CON BASE DE DATOS] IDSYSTEMS 2013
Figura 346. Formulario de navegacin y edicin manual de datos.
Como siguiente paso, escribiremos el manipulador del evento Load del formulario y un mtodo para
cargar los datos del registro actual en los controles del formulario, el Cdigo fuente 573 muestra esta
parte.
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) HandlesMyBase.Load
' crear conexinDim oConexion As SqlConnection oConexion = New
SqlConnection() oConexion.ConnectionString ="Server=(local);" & _"Database=Gestion;uid=sa;pwd=;"
' crear adaptadorMe.oDataAdapter = New SqlDataAdapter("SELECT * FROM Clientes", _
oConexion)
' crear commandbuilderDim oCommBuild As SqlCommandBuilder = New SqlCommandBuilder(oDataAdapter)
' crear datasetMe.oDataSet = New DataSet()
oConexion.Open()
' llenar con el adaptador el datasetMe.oDataAdapter.Fill(oDataSet, "Clientes")oConexion.Close()
' establecer el indicador del registro' a mostrar de la tablaMe.iPosicFilaActual = 0
' cargar columnas del registro en' los controles del formularioMe.CargarDatos()
End Sub
Private Sub CargarDatos()
' obtener un objeto con la fila actual
LECCION 6 Conjunto de Datos y enlace Pgina 8
7/29/2019 Leccion 6 - Conjunto de Datos y Enlace
9/17
[VISUAL BASIC.NET CON BASE DE DATOS] IDSYSTEMS 2013
Dim oDataRow As DataRowoDataRow = Me.oDataSet.Tables("Clientes").Rows(Me.iPosicFilaActual)
' cargar los controles del formulario con' los valores de los campos del registroMe.txtIDCliente.Text = oDataRow("IDCliente")Me.txtNombre.Text = oDataRow("Nombre")Me.txtFIngreso.Text = oDataRow("FIngreso")
Me.txtCredito.Text = oDataRow("Credito")
' mostrar la posicin actual del registro' y el nmero total del registrosMe.lblRegistro.Text = "Registro: " & _
Me.iPosicFilaActual + 1 & " de " & _Me.oDataSet.Tables("Clientes").Rows.Count
End Sub
Cdigo fuente 573
Observe el lector que en el evento Load hemos creado un objeto CommandBuilder, pasndole como
parmetro el DataAdapter. Como ya sabemos, un DataAdapter contiene una serie de objetos
Command para las operaciones de consulta, insercin, etc. La misin en este caso del objetoCommandBuilder, es la de construir automticamente tales comandos y asignrselos al DataAdapter,
ahorrndonos ese trabajo de codificacin.
En cuanto a las operaciones de navegacin por la tabla, no hay un objeto, como ocurra con el
Recordset de ADO, que disponga de mtodos especficos de movimiento como MoveNext( ),
MoveLast( ), etc. Lo que debemos hacer en ADO .NET, tal y como muestra el mtodo CargarDatos(),
es obtener del DataSet, la tabla que necesitemos mediante su coleccin Tables, y a su vez, a lacoleccin Rows de esa tabla, pasarle el nmero de fila/registro al que vamos a desplazarnos. En
nuestro ejemplo utilizaremos la variable iPosicFilaActual, definida a nivel de clase, para saber en todo
momento, la fila de la tabla en la que nos encontramos.
El Cdigo fuente 574 muestra el cdigo de los botones de navegacin, reunidos en el GroupBox
Navegar, del formulario.
Private Sub btnAvanzar_Click(ByVal sender As System.Object, ByVal e AsSystem.EventArgs) Handles btnAvanzar.Click
' si estamos en el ltimo registro,' no hacer movimientoIf Me.iPosicFilaActual = _(Me.oDataSet.Tables("Clientes").Rows.Count - 1) Then
MessageBox.Show("ltimo registro")
Else
' incrementar el marcador de registro' y actualizar los controles con los' datos del registro actualMe.iPosicFilaActual += 1Me.CargarDatos()
End If
End Sub
Private Sub btnRetroceder_Click(ByVal sender As System.Object, ByVal e As
LECCION 6 Conjunto de Datos y enlace Pgina 9
7/29/2019 Leccion 6 - Conjunto de Datos y Enlace
10/17
[VISUAL BASIC.NET CON BASE DE DATOS] IDSYSTEMS 2013
System.EventArgs) Handles btnRetroceder.Click
' si estamos en el primer registro,' no hacer movimientoIf Me.iPosicFilaActual = 0 Then
MessageBox.Show("Primer registro")
Else
' disminuir el marcador de registro' y actualizar los controles con los' datos del registro actualMe.iPosicFilaActual -= 1Me.CargarDatos()
End If
End Sub
Private Sub btnPrimero_Click(ByVal sender As System.Object, ByVal e AsSystem.EventArgs) Handles btnPrimero.Click
' establecer el marcador de registro en el primeroMe.iPosicFilaActual = 0Me.CargarDatos()
End Sub
Private Sub btnUltimo_Click(ByVal sender As System.Object, ByVal e AsSystem.EventArgs) Handles btnUltimo.Click
' establecer el marcador de registro en el primero' obteniendo el nmero de filas que contiene la tabla menos unoMe.iPosicFilaActual = (Me.oDataSet.Tables("Clientes").Rows.Count - 1)Me.CargarDatos()
End Sub
Cdigo fuente 574
Respecto a las operaciones de edicin, debemos utilizar los miembros del objeto tabla del DataSet,
como se muestra en el Cdigo fuente 575. Una vez terminado el proceso de edicin, actualizaremos el
almacn de datos original con el contenido del DataSet, empleando el DataAdapter.
Private Sub btnInsertar_Click(ByVal sender As System.Object, ByVal e AsSystem.EventArgs) Handles btnInsertar.Click
Dim oDataRow As DataRow' obtener un nuevo objeto fila de la tabla del datasetoDataRow = Me.oDataSet.Tables("Clientes").NewRow()
' asignar valor a los campos de la nueva filaoDataRow("IDCliente") = Me.txtIDCliente.TextoDataRow("Nombre") = Me.txtNombre.TextoDataRow("FIngreso") = Me.txtFIngreso.TextoDataRow("Credito") = Me.txtCredito.Text
' aadir el objeto fila a la coleccin de filas' de la tabla del datasetMe.oDataSet.Tables("Clientes").Rows.Add(oDataRow)
End Sub
LECCION 6 Conjunto de Datos y enlace Pgina 10
7/29/2019 Leccion 6 - Conjunto de Datos y Enlace
11/17
[VISUAL BASIC.NET CON BASE DE DATOS] IDSYSTEMS 2013
Private Sub btnModificar_Click(ByVal sender As System.Object, ByVal e AsSystem.EventArgs) Handles btnModificar.Click
Dim oDataRow As DataRow' obtener el objeto fila de la tabla del dataset' en el que estamos posicionadosoDataRow = Me.oDataSet.Tables("Clientes").Rows(Me.iPosicFilaActual)
' modificar las columnas de la fila' excepto la correspondiente al identificador clienteoDataRow("Nombre") = Me.txtNombre.TextoDataRow("FIngreso") = Me.txtFIngreso.TextoDataRow("Credito") = Me.txtCredito.Text
End Sub
Private Sub btnActualizar_Click(ByVal sender As System.Object, ByVal e AsSystem.EventArgs) Handles btnActualizar.Click
' actualizar los cambios realizados en el dataset' contra la base de datos realMe.oDataAdapter.Update(Me.oDataSet, "Clientes")
End Sub
Cdigo fuente 575
El caso del borrado de filas es algo diferente, por ello lo mostramos aparte del resto de operaciones de
edicin. En el Cdigo fuente 576 vemos el cdigo del botn Eliminar, dentro del cual, obtenemos la
fila a borrar mediante un objeto DataRow, procediendo a su borrado con el mtodo Delete( ). Para
actualizar los borrados realizados, empleamos el mtodo GetChanges( ) del objeto DataTable,
obteniendo a su vez, un objeto tabla slo con las filas borradas; informacin esta, que pasaremos al
DataAdapter, para que actualice la informacin en el origen de datos.
Private Sub btnEliminar_Click(ByVal sender As System.Object, ByVal e AsSystem.EventArgs) Handles btnEliminar.Click
Dim oDataRow As DataRow' obtener el objeto fila, de la tabla del dataset' en el que estamos posicionadosoDataRow = Me.oDataSet.Tables("Clientes").Rows(Me.iPosicFilaActual)oDataRow.Delete() ' borrar la fila
' mediante el mtodo GetChanges(), obtenemos una tabla' con las filas borradasDim oTablaBorrados As DataTableoTablaBorrados =
Me.oDataSet.Tables("Clientes").GetChanges(DataRowState.Deleted)
' actualizar en el almacn de datos las filas borradasMe.oDataAdapter.Update(oTablaBorrados)
' confirmar los cambios realizadosMe.oDataSet.Tables("Clientes").AcceptChanges()
' reposicionar en la primera filaMe.btnPrimero.PerformClick()
End Sub
Cdigo fuente 576
LECCION 6 Conjunto de Datos y enlace Pgina 11
7/29/2019 Leccion 6 - Conjunto de Datos y Enlace
12/17
[VISUAL BASIC.NET CON BASE DE DATOS] IDSYSTEMS 2013
Data Binding. Enlace de datos a controles
Data Binding es el mecanismo proporcionado por la plataforma .NET, que en aplicaciones con interfaz
Windows Forms, enlaza objetos contenedores de datos con los controles del formulario, para poder
realizar operaciones automticas de navegacin y edicin.
Tipos de Data Binding
Existen dos tipos de enlace de datos: simple y complejo.
Enlace simple (Simple Data Binding). Este tipo de enlace consiste en una asociacin entre
un control que puede mostrar un nico dato y el objeto que acta como contenedor de datos.
El ejemplo ms ilustrativo es el control TextBox.
Enlace complejo (Complex Data Binding). En este enlace, el control que acta como
interfaz o visualizador de datos, dispone de la capacidad de mostrar varios o todos los datos
del objeto que contiene la informacin. El control ms comn es el control DataGrid, que yahemos visto inicialmente en un apartado anterior, y que trataremos con ms detenimiento
prximamente.
Elementos integrantes en un proceso de Data Binding
El mecanismo de enlace automtico de datos a controles est compuesto por un elevado conjunto de
elementos del conjunto de tipos de .NET Framework, entre clases, colecciones, enumeraciones, etc. A
continuacin vamos a mencionar los ms importantes, que emplearemos en el ejemplo desarrollado
seguidamente.
Binding. Clase que permite crear un enlace (binding) para un control, indicando la propiedad
del control que mostrar los datos, el DataSet del que se extraer la informacin, y el nombre
de la tabla-columna, cuyos datos pasarn a la propiedad del control.
DataBindings. Coleccin de que disponen los controles, con la informacin de enlaces a
datos. Gracias a su mtodo Add( ), podemos aadir un objeto Binding, para que el control
muestre los datos que indica el enlace.
BindingContext. Propiedad de la clase Form, que representa el contexto de enlace a datos
establecido en los controles del formulario, es decir, toda la informacin de enlaces
establecida entre los controles y objetos proveedores de datos. Devuelve un objeto de tipo
BindingManagerBase.
BindingManagerBase. Objeto que se encarga de administrar un conjunto de objetos de
enlace, por ejemplo, los de un formulario, obtenidos a travs del BindingContext del
formulario.
Empleo de Data Binding simple para navegar y editar
datos
En el proyecto DataBindSimple (hacer clic aqu para acceder a este ejemplo) vamos a utilizar loselementos de enlace a datos comentados en el apartado anterior, para construir un formulario en el
LECCION 6 Conjunto de Datos y enlace Pgina 12
7/29/2019 Leccion 6 - Conjunto de Datos y Enlace
13/17
[VISUAL BASIC.NET CON BASE DE DATOS] IDSYSTEMS 2013
que, gracias a la arquitectura de enlace automtico proporcionado por la plataforma .NET,
simplificaremos en gran medida el acceso a datos hacia una tabla de un DataSet.
El diseo del formulario ser muy similar al realizado para el ejemplo de navegacin y edicin
manual, descrito en un apartado anterior. Ver Figura 347.
Figura 347. Formulario utilizado en Data Binding automtico.
Pasando al cdigo de la clase del formulario, deberemos realizar las siguientes declaraciones a nivel de
clase, mostradas en el Cdigo fuente 577.
Imports System.Data.SqlClient
Public Class Form1Inherits System.Windows.Forms.Form
Private oDataAdapter As SqlDataAdapterPrivate oDataSet As DataSetPrivate oBMB As BindingManagerBase'....'....
Cdigo fuente 577
En el evento de carga del formulario, aparte de la creacin de los objetos de conexin, adaptador, etc.,
estableceremos el enlace entre los controles y el DataSet, como se muestra en el Cdigo fuente 578.
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) HandlesMyBase.Load
' crear conexinDim oConexion As New SqlConnection()oConexion.ConnectionString = "Server=(local);" & _
LECCION 6 Conjunto de Datos y enlace Pgina 13
7/29/2019 Leccion 6 - Conjunto de Datos y Enlace
14/17
[VISUAL BASIC.NET CON BASE DE DATOS] IDSYSTEMS 2013
"Database=Gestion;uid=sa;pwd=;"
' crear adaptadoroDataAdapter = New SqlDataAdapter("SELECT * FROM Clientes", oConexion)
' crear commandbuilder
Dim oCB As SqlCommandBuilder = New SqlCommandBuilder(oDataAdapter)
' crear datasetoDataSet = New DataSet()oDataAdapter.Fill(oDataSet, "Clientes")
' enlazar controles del formulario con el dataset;' se debe utilizar un objeto Binding, al crear este objeto' indicar en su constructor qu propiedad del control' se debe enlazar, el dataset, y el nombre de tabla-columna;' una vez creado el objeto Binding, aadirlo a la coleccin' de enlaces de datos, DataBindings, del control que necesitemos,' con el mtodo Add() de dicha coleccinDim oBind As Binding
oBind = New Binding("Text", oDataSet, "Clientes.IDCliente")Me.txtIDCliente.DataBindings.Add(oBind)oBind = Nothing
oBind = New Binding("Text", oDataSet, "Clientes.Nombre")Me.txtNombre.DataBindings.Add(oBind)oBind = Nothing
oBind = New Binding("Text", oDataSet, "Clientes.FIngreso")'AddHandler oBind.Format, AddressOf FormatoFechaMe.txtFIngreso.DataBindings.Add(oBind)oBind = Nothing
oBind = New Binding("Text", oDataSet, "Clientes.Credito")Me.txtCredito.DataBindings.Add(oBind)
oBind = Nothing
' obtener del contexto de enlace del formulario,' el enlace de un dataset y una tabla determinadasMe.oBMB = Me.BindingContext(oDataSet, "Clientes")
Me.VerContadorReg()
End Sub
Private Sub VerContadorReg()' mostrar informacin sobre el nmero de' registro actual y registros totales' en la tabla del datasetMe.lblRegistro.Text = "Registro: " & _
Me.oBMB.Position + 1 & " de " & Me.oBMB.Count
End Sub
Cdigo fuente 578
Debido al enlace automtico, el cdigo para las operaciones de navegacin se simplifica en gran
medida, como muestra el Cdigo fuente 579, en el que vemos los manipuladores de evento para los
botones de desplazamiento del formulario.
Private Sub btnAvanzar_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnAvanzar.Click
LECCION 6 Conjunto de Datos y enlace Pgina 14
7/29/2019 Leccion 6 - Conjunto de Datos y Enlace
15/17
[VISUAL BASIC.NET CON BASE DE DATOS] IDSYSTEMS 2013
' avanzar a la siguiente fila;' la actualizacin de los controles con los datos' de la fila en la que acabamos de posicionarnos' es automtica, gracias al objeto BindingManagerBaseMe.oBMB.Position += 1Me.VerContadorReg()
End Sub
Private Sub btnRetroceder_Click(ByVal sender As System.Object, ByVal e AsSystem.EventArgs) Handles btnRetroceder.Click
Me.oBMB.Position -= 1Me.VerContadorReg()
End Sub
Private Sub btnPrimero_Click(ByVal sender As System.Object, ByVal e AsSystem.EventArgs) Handles btnPrimero.Click
Me.oBMB.Position = 0Me.VerContadorReg()
End Sub
Private Sub btnUltimo_Click(ByVal sender As System.Object, ByVal e AsSystem.EventArgs) Handles btnUltimo.Click
Me.oBMB.Position = Me.oBMB.Count - 1Me.VerContadorReg()
End Sub
Cdigo fuente 579
La Figura 348 muestra este formulario en ejecucin.
Figura 348. Ejecucin del formulario con Data Binding.
Como detalle importante a observar en las operaciones de navegacin entre los registros, destacaremos
el hecho de que al mostrar el campo que contiene una fecha, dicho dato se muestra con toda la
informacin al completo, fecha y hora, sin ningn formato especfico.
LECCION 6 Conjunto de Datos y enlace Pgina 15
7/29/2019 Leccion 6 - Conjunto de Datos y Enlace
16/17
[VISUAL BASIC.NET CON BASE DE DATOS] IDSYSTEMS 2013
Para conseguir en este caso, que la fecha se muestre con el formato que necesitemos, al crear el objeto
Binding para ese control, deberemos asignar a su evento Format un procedimiento manipulador, que
realice tal formateo y lo devuelva a travs del objeto ConvertEventArgs, que recibe ese evento.
Veamos estas operaciones en el Cdigo fuente 580.
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) HandlesMyBase.Load
'....oBind = New Binding("Text", oDataSet, "Clientes.FIngreso")AddHandler oBind.Format, AddressOf FormatoFechaMe.txtFIngreso.DataBindings.Add(oBind)oBind = Nothing'....
End Sub
' manipulador del Evento format del objeto BindingPrivate Sub FormatoFecha(ByVal sender As Object, ByVal e As ConvertEventArgs)
Dim dtFecha As DateTime
dtFecha = e.Valuee.Value = dtFecha.ToString("dd-MMMM-yyyy")
End Sub
Cdigo fuente 580
La Figura 349 muestra ahora este control al haberle aplicado el formato.
Figura 349. Control enlazado a datos, que muestra una fecha con formato personalizado.
El proceso de edicin (insercin en este ejemplo), es muy similar al caso anterior. Aunque debemos
tener en cuenta que debido a las particularidades del Data Binding, no podemos borrar el contenido de
los TextBox, teclear datos e insertarlos, ya que eso realmente modificara el registro sobre el queestbamos posicionados. Por ese motivo, en el botn Insertar, asignamos los valores directamente a las
columnas del objeto DataRow. Ver el Cdigo fuente 581.
Private Sub btnInsertar_Click(ByVal sender As System.Object, ByVal e AsSystem.EventArgs) Handles btnInsertar.Click
Dim oDataRow As DataRow
' crear un nuevo objeto filaoDataRow = Me.oDataSet.Tables("Clientes").NewRow()' aadir datos a las columnas de la filaoDataRow("IDCliente") = 100
LECCION 6 Conjunto de Datos y enlace Pgina 16
7/29/2019 Leccion 6 - Conjunto de Datos y Enlace
17/17
[VISUAL BASIC.NET CON BASE DE DATOS] IDSYSTEMS 2013
oDataRow("Nombre") = "Isabel"oDataRow("FIngreso") = "12/9/01"oDataRow("Credito") = 228' aadir el objeto fila a la coleccin' de filas de la tablaMe.oDataSet.Tables("Clientes").Rows.Add(oDataRow)
End Sub
Private Sub btnActualizar_Click(ByVal sender As System.Object, ByVal e AsSystem.EventArgs) Handles btnActualizar.Click
Me.oDataAdapter.Update(Me.oDataSet, "Clientes")
End Sub
Cdigo fuente 581
LECCION 6 Conjunto de Datos y enlace Pgina 17