Leccion 6 - Conjunto de Datos y Enlace

download Leccion 6 - Conjunto de Datos y Enlace

of 17

Transcript of Leccion 6 - Conjunto de Datos y Enlace

  • 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:@Autor
  • 7/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:@IDAutor
  • 7/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