acceso a datos · acceso a datos con vb .net 2005 ing. eduardo reyes 2 acceso a datos en este...
TRANSCRIPT
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
Ing. Eduardo Reyes
2
Acceso a datos
En este capítulo realizaremos una conexión, lectura, inserción, actualización y eliminación de datos creando aplicaciones en Visual Basic .NET 2005 con el Framework 2.0 a través del SQL Server 2000.
Crear un nuevo proyecto denominado WAccesoDatos, la tabla a consultar será Products de la BD NorthWind.
Después de crear el proyecto agregar las Referencias para poder acceder a los Datos como lo indica en la Fig. 01:
Fig. 01: Agregar Referencias al Proyecto
Respecto al código del formulario, primero vamos a declarar varios objetos de acceso a datos a nivel de la clase para poder tenerlos disponibles en diversos métodos. Veamos el Código fuente en la Fig. 02:
Fig. 02: Variables declaradas con los Objetos para el Acceso a Datos
Acceso a Datos con VB .NET 2005
Ing. Eduardo Reyes
3
En el formulario del proyecto agregamos un DataGridView para poder mostrar los datos a enlazar, quedando el Form1 de la siguiente manera como se muestra en la Fig. 03:
Fig. 03: Formulario (Form1) con el DataGridView (dgVer)
En el siguiente paso escribiremos el código dentro del evento Load del formulario, el cual se ocupa de crear la conexión con la BD, crear el DataAdapter con la consulta, cargar el DataSet, y asignárselo al DataGrid a través de su propiedad DataSource. Ver la Fig. 04
Una vez escrito el código correctamente como se encuentra en la Fig. 04 se pasa a ejecutar el formulario y debe de mostrar los datos consultados tal como se muestran en la Fig. 05
Fig. 05: Formulario con los Datos mostrados en el DataGrid
Acceso a Datos con VB .NET 2005
Ing. Eduardo Reyes
4
Fig. 04: Código para poder Acceder a los Datos de la Tabla Products de Northwind
No olvidar que en la línea de código de conexión:
cnx = ("server=Srv01;database=Northwind;Trusted_Connection=True")
En la parte donde se encuentra el nombre del server debe de ir el nombre de tu servidor de base de datos en este caso el mío es Srv01.
Acceso a Datos con VB .NET 2005
Ing. Eduardo Reyes
5
Lectura de datos
DataReader
En esta parte realizaremos una lectura (consulta de datos) utilizando objetos DataReader, un objeto DataReader permite la navegación hacia delante y de sólo lectura, de los registros devueltos por una consulta.
Ahora crearemos dentro del proyecto denominado WAccesoDatos un nuevo formulario al cual lo llamaremos frmLeerDatos, luego agregamos los siguientes controles los cuales nos mostraran el uso de objetos DataReader.
Control NameButton1 btnEmpleadosButton2 btnCliProdListBox1 lstEmpleadosListBox2 lstClientesListBox3 lstProductos
Después de agregar los controles que describimos anteriormente, el formulario frmLeerDatos debe de quedar como se muestra en la Fig. 06.
Fig. 06: Formulario frmLeerDatos
Ahora realizaremos la codificación del botón Empleados creando a partir de un comando, un objeto DataReader que recorreremos para llenar un ListBox (lstEmpleados) con los valores de una de las columnas de la tabla que internamente contiene el DataReader. Ver la Fig. 07.
Después realizamos la codificación del botón Clientes/Productos que tendrá un objeto Command el cual puede estar basado en múltiples sentencias SQL, separadas por el carácter de punto y coma ( ; ), que se ejecuten en lote. Al crear un DataReader desde un comando de este tipo, podemos recorrer el conjunto de consultas mediante el método NextResult( ) del DataReader. Un ejemplo de este tipo lo tenemos al pulsar el botón Clientes/Productos del formulario, cuya fuente vemos a continuación en la Fig. 08.
La Fig. 09 muestra al formulario después de haber rellenado los controles ListBox usando objetos DataReader.
Acceso a Datos con VB .NET 2005
Ing. Eduardo Reyes
6
Fig. 07: Código del Botón Empleados.
Fig. 08: Código del Botón Clientes/Productos.
Acceso a Datos con VB .NET 2005
Ing. Eduardo Reyes
7
Fig. 09: ListBox llenados con los objetos DataReader
DataSet
DataSet pertenece al conjunto común de clases de ADO .NET, empleándose para todo tipo de proveedores, por lo que no existe una versión particular para SqlClient u OleDb.
En el formulario frmLeerDatos agregar los siguientes controles el cual nos servirá para realizar un sencillo ejemplo de creación de un objeto DataSet que llenaremos con un DataAdapter. Una vez listo el DataSet, recorreremos la tabla que contiene y mostraremos valores de sus columnas en un ListBox.
Control NameButton1 btnCustomersListBox1 lstCustomers
Después de agregar los controles que describimos anteriormente el formulario debe de quedar como se muestra en la Fig. 10.
Fig. 10: Formulario frmLeerDatos
Acceso a Datos con VB .NET 2005
Ing. Eduardo Reyes
8
Ahora codificamos del botón Customers creando una consulta a partir de un DataAdapter, una vez listo el DataSet recorreremos el ListBox (lstCustomers) para recorrer y mostrar los datos de una de las columnas de la tabla Customers. Ver la Fig. 11.
Fig. 11: Código del Botón Customers
La Fig. 12 muestra al formulario después de haber rellenado los controles ListBox usando objetos DataSet.
Fig. 12: ListBox llenados mediante un DataSet
Acceso a Datos con VB .NET 2005
Ing. Eduardo Reyes
9
Inserción
DataAdapter
Los objetos DataAdapter (SqlDataAdapter y OleDbDataAdapter) van a desempeñar el papel de puente entre el origen de datos y el DataSet, permitiéndonos cargar el DataSet con la información de la fuente de datos, y posteriormente, actualizar el origen de datos con la información del DataSet.
Un objeto DataAdapter puede contener desde una sencilla sentencia SQL, como hemos visto en el apartado anterior, hasta varios objetos Command.
La clase DataAdapter dispone de cuatro propiedades, que nos van a permitir asignar a cada una, un objeto Command (SqlCommand u OleDbCommand) con las operaciones estándar de manipulación de datos. Estas propiedades son las siguientes.
• InsertCommand. Objeto de la clase Command, que se va a utilizar para realizar una inserción de datos.
• SelectCommand. Objeto de la clase Command que se va a utilizar para ejecutar una sentencia Select de SQL.
• UpdateCommand. Objeto de la clase Command que se va a utilizar para realizar una modificación de los datos.
• DeleteCommand. Objeto de la clase Command que se va a utilizar para realizar una eliminación de datos.
Un método destacable de las clases SqlDataAdapter/OleDbDataAdapter es el método Fill( ), que ejecuta el comando de selección que se encuentra asociado a la propiedad SelectCommand, los datos obtenidos del origen de datos se cargarán en el objeto DataSet que pasamos por parámetro.
Para ver el uso de los objetos DataAdapter vamos a crear un formulario y lo llamaremos frmInsertaDatos luego agregamos los siguientes controles.
Control NameDataGridView grdDatosTextBox1 txtProgramaTextBox2 txtDescripcionLabel1 lblProgramaLabel2 lblDescripcionButton btnGrabar
En esta aplicación vamos a utilizar el objeto DataAdapter para realizar una consulta en la tabla Region de la BD Northwind con la cual venimos trabajando e insertar nuevas filas en esa misma tabla. Después de agregar los controles que describimos anteriormente el formulario debe de quedar como se muestra en la Fig. 13.
Respecto al código del formulario, en primer lugar, vamos a declarar varios objetos de acceso a datos a nivel de la clase para poder tenerlos disponibles en diversos métodos. Veamos la Fig. 14.
En el siguiente paso escribiremos el procedimiento del evento Load del formulario frmInsertaDatos, y el método CargaDatos( ), que se ocupa de cargar el DataSet, y asignárselo al DataGrid a través de su propiedad DataSource. Observe el lector que en el método CargarDatos( ) lo primero que hacemos es vaciar el DataSet, puesto que este objeto conserva los datos de tablas y registros; en el caso de que no limpiáramos el DataSet, se acumularían las sucesivas operaciones de llenado de filas sobre la tabla que contiene. Veamos la Fig. 15.
Acceso a Datos con VB .NET 2005
Ing. Eduardo Reyes
10
Fig. 13: Formulario frmInsertaDatos
Fig. 14: Variables declaradas dentro del frmInsertaDatos
Private Sub frmInsertaDatos_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'crear conexión oConexion = New SqlConnection oConexion.ConnectionString = "Server=Srv01;Database=Northwind;uid=sa;pwd=;" 'crear adaptador oDataAdapter = New SqlDataAdapter 'crear comandos de insercion 'consulta con sus parametros y asignarlos al adaptador Dim oCmdInsercion As New SqlCommand("INSERT INTO Region" & _ "(RegionId, RegionDescription) VALUES(@IdRegion,@Region)", oConexion) oDataAdapter.InsertCommand = oCmdInsercion oDataAdapter.InsertCommand.Parameters.Add(New SqlParameter("@IdRegion", SqlDbType.Int)) oDataAdapter.InsertCommand.Parameters.Add(New SqlParameter("@Region", SqlDbType.NVarChar)) Dim oCmdConsulta As New SqlCommand("SELECT * FROM Region", oConexion) oDataAdapter.SelectCommand = oCmdConsulta 'crear conjunto de datos oDataSet = New DataSet 'llamar procedimiento Me.CargaDatos() End Sub
Acceso a Datos con VB .NET 2005
Ing. Eduardo Reyes
11
Private Sub CargaDatos() 'limpiamos el conjunto de datos oDataSet.Clear() 'abrir conexion oConexion.Open() 'utilizar el adaptador para llenar el dataset con la tabla oDataAdapter.Fill(oDataSet, "Region") 'cerrar conexion oConexion.Close() 'enlazar el dataset con el datagrid 'en DataSource se asigna el dataset 'en DataMember el nombre de la tabla del dataset que mostrará el datagrid Me.grdDatos.DataSource = oDataSet Me.grdDatos.DataMember = "Region" End Sub
Fig. 15: Código del evento Load del frmInsertaDatos
Finalmente, en el botón Grabar, escribiremos las instrucciones para insertar un nuevo registro en la tabla Region, el cual se codificara como se ve en la Fig. 16.
Private Sub btnGrabar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGrabar.Click Dim iResultado As Integer 'asignar los valores a los parametros para el comando insercion oDataAdapter.InsertCommand.Parameters("IdRegion").Value = Me.txtRegion.Text oDataAdapter.InsertCommand.Parameters("Region").Value = Me.txtRegion.Text 'abrir conexion oConexion.Open() 'ejecutar comando de insercion del adaptador iResultado = oDataAdapter.InsertCommand.ExecuteNonQuery() 'cerrar conexion oConexion.Close() Me.CargaDatos() MessageBox.Show("Registros Añadidos:" & iResultado) End Sub
Fig. 15: Código del Botón Grabar para Insertar nuevas Regiones
Una vez codificado todos los procedimientos ejecutamos la aplicación la cual vemos en la Fig. 16.
Fig. 16: Formulario con un Nuevo Registro Insertado
Acceso a Datos con VB .NET 2005
Ing. Eduardo Reyes
12
Actualización
Para poder realizar una actualización de datos, crearemos dentro del evento Load un objeto CommandBuilder, pasándole como parámetro el DataAdapter. Como ya sabemos, un DataAdapter contiene una serie de objetos Command para las operaciones de consulta, inserción, etc. La misión en este caso del objeto CommandBuilder, es la de construir automáticamente tales comandos y asignárselos al DataAdapter, ahorrándonos ese trabajo de codificación.
Para poder hacer uso de un objeto CommandBuilder vamos a crear un formulario y lo llamaremos frmActualizaDatos luego agregamos los siguientes controles.
Control NameDataGridView grdDatosButton btnActualizar
En esta aplicación vamos a utilizar el objeto DataAdapter para realizar una consulta en la tabla Region de la BD Northwind con la cual venimos trabajando y actualizar filas en esa misma tabla. Después de agregar los controles que describimos anteriormente el formulario debe de quedar como se muestra en la Fig. 17.
Fig. 17: Formulario frmActualizaDatos
En el siguiente paso escribiremos el procedimiento del evento Load del formulario frmActualizaDatos, cargamos el DataSet, y lo asignamos al DataGrid a través de su propiedad DataSource y DataMember, luego codificamos el evento click del btnActualiza. Veamos la Fig. 18.
Una vez codificado el evento load del frmActualizaDatos y el evento click del btnActualiza ejecutamos la aplicación la cual vemos en la Fig. 19.
Acceso a Datos con VB .NET 2005
Ing. Eduardo Reyes
13
Dim oCn As SqlConnection Dim oDs As DataSet Dim oDa As SqlDataAdapter
Private Sub frmActualizaDatos_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
'crea conexion oCn = New SqlConnection oCn.ConnectionString = "Server=Srv01;Database=Northwind;uid=sa;pwd=;" 'crear adaptador y realizar la consulta oDa = New SqlDataAdapter("SELECT * FROM Region", oCn) 'crear command builder Dim oCb As SqlCommandBuilder = New SqlCommandBuilder(oDa) 'crear dataset oDs = New DataSet oDa.Fill(oDs, "Region") 'agregar dataset al datagrid Me.grdDatos.DataSource = oDs Me.grdDatos.DataMember = "Region" End Sub
Private Sub btnActualiza_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnActualiza.Click
oDa.Update(oDs, "Region") End Sub
Fig. 18: Código del evento Load del Formulario el evento click del Botón Actualizar
Fig. 19: Formulario frmActualizaDatos con un Registro Modificado
Acceso a Datos con VB .NET 2005
Ing. Eduardo Reyes
14
Eliminación
Para poder realizar la eliminación de filas es algo diferente a lo que venimos haciendo anteriormente, a la hora de obtener la fila a borrar tenemos que hacerlo mediante un objeto DataRow, procediendo a su borrado con el método Delete( ).
Para actualizar los borrados realizados, empleamos el método GetChanges( ) del objeto DataTable, obteniendo a su vez un objeto table sólo con las filas borradas, dicha información que pasaremos al DataAdapter, para que actualice la información en el origen de datos.
Para poder hacer uso de un objeto DataRow y DataTable vamos a crear un formulario y lo llamaremos frmEliminaDatos luego agregamos los siguientes controles.
Control NameDataGridView grdDatosButton btnEliminar
Después de agregar los controles que describimos anteriormente, el formulario debe de quedar como se muestra en la Fig. 20.
Fig. 20: Formulario frmEliminaDatos
En el siguiente paso escribiremos el código del evento Load del formulario frmEliminaDatos, cargamos el DataSet, y lo asignamos al DataGrid a través de su propiedad DataSource y DataMember, luego codificamos el evento click del btnEliminar, declarando una variable para poder identificar la fila del datagrid a eliminar a travez del uso de sus propiedades. Veamos la Fig. 21.
Una vez codificado el evento load del frmEliminaDatos y el evento click del btnElimina ejecutamos la aplicación la cual vemos en la Fig. 22.
Acceso a Datos con VB .NET 2005
Ing. Eduardo Reyes
15
Dim oCn As SqlConnection Dim oDs As DataSet Dim oDa As SqlDataAdapter Private Sub frmEliminaDatos_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 'crea conexion oCn = New SqlConnection oCn.ConnectionString = "Server=Srv01;Database=Northwind;uid=sa;pwd=;" 'crear adaptador y realizar la consulta oDa = New SqlDataAdapter("SELECT * FROM Region", oCn) 'crear commandbuilder Dim oCb As SqlCommandBuilder = New SqlCommandBuilder(oDa) 'crear dataset oDs = New DataSet oDa.Fill(oDs, "Region") 'agregar dataset al datagrid Me.grdDatos.DataSource = oDs Me.grdDatos.DataMember = "Region" End Sub Private Sub btnEliminar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEliminar.Click Dim oDataRow As DataRow Dim iPosicFilaActual As Integer iPosicFilaActual = 0 iPosicFilaActual = CInt(grdDatos.Item(0, grdDatos.CurrentRow.Index - 1).Value) ' obtener el objeto fila, de la tabla del dataset ' en el que estamos posicionados oDataRow = oDs.Tables("Region").Rows(iPosicFilaActual) oDataRow.Delete() ' borrar la fila ' mediante el método GetChanges(), obtenemos una tabla ' con las filas borradas Dim oTablaBorrados As DataTable oTablaBorrados = oDs.Tables("Region").GetChanges(DataRowState.Deleted) ' actualizar en el almacén de datos las filas borradas oDa.Update(oTablaBorrados) ' confirmar los cambios realizados oDs.Tables("Region").AcceptChanges() End Sub
Fig. 21: Código del evento Load del Formulario el evento click del Botón Eliminar
Fig. 22: Formulario frmEliminaDatos con un Registro Eliminado
Capítulo II
• Navegación de registros • Relacionar tablas • Filtrar tablas • Seleccionar y mostrar registros
Acceso a Datos con VB .NET 2005
Ing. Eduardo Reyes
17
Navegación de registros
Para realizar la navegación a través de los registros de una tabla, debemos de saber que la arquitectura de ADO .NET está orientada a un modelo de trabajo desconectado sobre el almacén de datos, al que recurriremos sólo cuando necesitemos obtener los datos para su consulta y manipulación.
El objeto DataSet, combinado con un grupo de objetos enfocados al mantenimiento de datos desconectados, como son DataAdapter, DataTable, DataRow, etc., nos va a permitir realizar la tarea de navegar entre los registros de una tabla del DataSet.
El proyecto se denominara WAccesoDatos, la tabla a consultar será Customers de la BD NorthWind. Una vez creado el nuevo proyecto en VB.NET, importaremos el espacio de nombres System.Data.SqlClient, y declararemos a nivel de clase un conjunto de variables para la manipulación de los datos. Veamos la figura 23.
Imports System.Data.SqlClient Public Class frmNavegaRegistros Inherits System.Windows.Forms.Form 'Variables a nivel de clase 'para la manipulación de los datos Private oDa As SqlDataAdapter Private oDs As DataSet Private iPosFilaActual As Integer End Class
Fig. 23: Variables declaradas
Ahora diseñaremos el formulario denominado frmNavegaRegistros, para eso agregamos los siguientes controles, los cuales nos permitirá realizar las operaciones mencionadas.
Control NameLabel1 lblIDClienteLabel2 lblClienteLabel3 lblContactoLabel4 lblDireccionLabel5 lblFonoTextBox1 txtIDClienteTextBox2 txtClienteTextBox3 txtContactoTextBox4 txtDireccionTextBox5 txtFonoButton1 btnPrimeroButton2 btnAvanzaButton3 btnRetrocedeButton4 btnUltimoGroupBox1 gbxClientesGroupBox2 gbxNavegar
Después de agregar los controles que describimos anteriormente, el formulario debe de quedar como se muestra en la Fig. 24.
Acceso a Datos con VB .NET 2005
Ing. Eduardo Reyes
18
Fig. 24: Formulario frmNavegaRegistros
Como siguiente paso, escribiremos el manipulador del evento Load del formulario y un método para cargar los datos del registro actual en los controles del formulario, el Código se muestra en la figura 25.
Private Sub frmNavegaRegistros_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load ' crear conexión Dim oConexion As SqlConnection oConexion = New SqlConnection() oConexion.ConnectionString = "Server=Srv01;" & _ "Database=Northwind;uid=sa;pwd=;" ' crear adaptador Me.oDa = New SqlDataAdapter("SELECT * FROM Customers", oConexion) ' crear commandbuilder Dim oCommBuild As SqlCommandBuilder = New SqlCommandBuilder(oDa) ' crear dataset Me.oDs = New DataSet() oConexion.Open() ' llenar con el adaptador el dataset Me.oDa.Fill(oDs, "Customers") oConexion.Close() ' establecer el indicador del registro a mostrar de la tabla Me.iPosFilaActual = 0 ' cargar columnas del registro en los controles del formulario Me.CargarDatos() End Sub Private Sub CargarDatos() ' obtener un objeto con la fila actual Dim oDataRow As DataRow oDataRow = Me.oDs.Tables("Customers").Rows(Me.iPosFilaActual) ' cargar los controles del formulario con ' los valores de los campos del registro Me.txtIDCliente.Text = oDataRow("CustomerID") Me.txtCliente.Text = oDataRow("CompanyName") Me.txtContacto.Text = oDataRow("ContactName") Me.txtDireccion.Text = oDataRow("Address") Me.txtFono.Text = oDataRow("Phone") ' mostrar la posición actual del registro y el número total del registros Me.lblRegistro.Text = "Cliente: " & _ Me.iPosFilaActual + 1 & " de " & _ Me.oDs.Tables("Customers").Rows.Count End Sub
Fig. 25: Código del Evento Load y el Procedimiento Cargar Datos
Acceso a Datos con VB .NET 2005
Ing. Eduardo Reyes
19
Observar que en el evento Load se ha creado un objeto CommandBuilder, pasándole como parámetro el DataAdapter. Como ya sabemos, un DataAdapter contiene una serie de objetos Command para las operaciones de consulta, inserción, etc. La misión en este caso del objeto CommandBuilder, es la de construir automáticamente tales comandos y asignárselos al DataAdapter, ahorrándonos ese trabajo de codificación. En cuanto a las operaciones de navegación por la tabla, no hay un objeto, como ocurría con el Recordset de ADO, que disponga de métodos específicos de movimiento como MoveNext( ), MoveLast( ), etc. Lo que debemos hacer en ADO .NET, tal y como muestra el método CargarDatos(), es obtener del DataSet, la tabla que necesitemos mediante su colección Tables, y a su vez, a la colección Rows de esa tabla, pasarle el número de fila/registro al que vamos a desplazarnos. En nuestro ejemplo utilizaremos la variable iPosFilaActual, definida a nivel de clase, para saber en todo momento, la fila de la tabla en la que nos encontramos. El Código fuente de cada botón de navegación se muestra en la figura 26.
Private Sub btnPrimero_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnPrimero.Click ' establecer el marcador de registro en el primero Me.iPosFilaActual = 0 Me.CargarDatos() End Sub Private Sub btnAvanza_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnAvanza.Click ' si estamos en el primer registro, ' no hacer movimiento If Me.iPosFilaActual = 0 Then MessageBox.Show("Primer registro") Else ' disminuir el marcador de registro ' y actualizar los controles con los ' datos del registro actual Me.iPosFilaActual -= 1 Me.CargarDatos() End If End Sub Private Sub btnRetrocede_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnRetrocede.Click ' si estamos en el último registro, ' no hacer movimiento If Me.iPosFilaActual = _ (Me.oDs.Tables("Customers").Rows.Count - 1) Then MessageBox.Show("Último registro") Else ' incrementar el marcador de registro ' y actualizar los controles con los ' datos del registro actual Me.iPosFilaActual += 1 Me.CargarDatos() End If End Sub Private Sub btnUltimo_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles btnUltimo.Click ' establecer el marcador de registro en el primero ' obteniendo el número de filas que contiene la tabla menos uno Me.iPosFilaActual = (Me.oDs.Tables("Customers").Rows.Count - 1) Me.CargarDatos() End Sub
Fig. 26: Código de los botones de navegación
Una vez codificado el evento load del frmNavegaRegistros, el procedimiento Cargar Datos y los eventos click de los botones de navegación ejecutamos la aplicación la cual vemos en la Fig. 27.
Acceso a Datos con VB .NET 2005
Ing. Eduardo Reyes
20
Fig. 27: Formulario frmNavegaRegistros
Acceso a Datos con VB .NET 2005
Ing. Eduardo Reyes
21
Relacionar tablas
Para llevar a cabo la relación entre dos tablas, ambas tablas deben de tener un campo en común para realizar la relación, en esta oportunidad realizaremos la relación entre las tablas Customers y Orders por su campo clave (CustomerID) (ambas se encuentran dentro de la BD Northwind). Después llenamos un ComboBox con datos de la tabla Customers. Al seleccionar un valor del ComboBox, se tomarán las filas relacionadas de la tabla Orders y se llenará con ellas un ListBox.
Una vez conocido lo que se desea hacer lo primero es crear un proyecto al cual llamaremos WAccesoDatos, las tablas a consultar seran Customers y Orders de la BD NorthWind. Una vez creado el nuevo proyecto en VB.NET, importaremos el espacio de nombres System.Data.SqlClient, y declararemos a nivel de clase un conjunto de variables para la manipulación de los datos. Veamos la figura 28.
Imports System.Data Imports System.Data.SqlClient Public Class frmNavegaRegistros 'Variables a nivel de clase 'para la manipulación de los datos Dim Cn As SqlConnection Private DaC As SqlDataAdapter Private DaO As SqlDataAdapter Private Ds As DataSet Dim str As String End Class
Fig. 28: Variables declaradas
Ahora diseñaremos el formulario denominado frmRelacionaTablas, para eso agregamos los siguientes controles, los cuales nos permitirá realizar las operaciones mencionadas.
Control NameGroupBox gbxClientesComboBox cboClientesListBox lstOrdenes
Después de agregar los controles que describimos anteriormente, el formulario debe de quedar como se muestra en la Fig. 29.
Fig. 29: Formulario frmRelacionaTablas
Acceso a Datos con VB .NET 2005
Ing. Eduardo Reyes
22
Como siguiente paso, escribiremos el código del evento Load del frmRelacionaTablas y el evento SelectedIndexChanged del cboClientes, el Código se muestra en la figura 30.
Private Sub frmRelacionaTablas_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load 'crear conexion Cn = New SqlConnection() str = "Server=EDUARD;database=Northwind;uid=sa;password=master" Cn.ConnectionString = str 'creamos los dos data adapter Me.DaC = New SqlDataAdapter("Select * from Customers", Cn) Me.DaO = New SqlDataAdapter("Select * from Orders", Cn) 'instaciar dataset Me.Ds = New DataSet 'abrir la conexion Cn.Open() 'utilizamos los DataAdapters para llenar los DataSets Me.DaC.Fill(Me.Ds, "Customers") Me.DaO.Fill(Me.Ds, "Orders") 'cerramos la conexion Cn.Close() 'relacionamos las tablas del DataSet por campo común Me.Ds.Relations.Add("Customers Orders", Ds.Tables _ ("Customers").Columns("CustomerID"), _ Ds.Tables("Orders").Columns("CustomerID")) 'llenar el combobox con los nombres del cliente Dim Dr As DataRow For Each Dr In Ds.Tables("Customers").Rows Me.cboClientes.Items.Add(Dr("CustomerID") & _ " - " & Dr("CompanyName")) Next End Sub Private Sub cboClientes_SelectedIndexChanged(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles cboClientes.SelectedIndexChanged 'limpiar los valores del combo Me.lstOrdenes.Items.Clear() Dim DrC As DataRow 'obtener la fila de tabla Customers DrC = Ds.Tables("Customers").Rows(Me.cboClientes.SelectedIndex) Dim DrO() As DataRow 'obtener las filas de la tabla Orders DrO = DrC.GetChildRows("Customers Orders") Dim DrFila As DataRow 'rellenar el listbox con los valores de la tabla Orders For Each DrFila In DrO Me.lstOrdenes.Items.Add(DrFila("CustomerID") & _ " - " & DrFila("OrderID") & " - " & DrFila("OrderDate")) Next End Sub End Class
Fig. 30: Código del frmRelacionaTablas
Una vez codificado el evento load del frmRelacionaTablas y el evento del cboClientes ejecutamos la aplicación la cual vemos en la Fig. 31.
Acceso a Datos con VB .NET 2005
Ing. Eduardo Reyes
23
Fig. 31: Formulario frmRelacionaTablas
Acceso a Datos con VB .NET 2005
Ing. Eduardo Reyes
24
Filtrar tablas
Para realizar el filtrado a través de los registros de una tabla, utilizaremos la clase DataView la cual nos permite la aplicación de vistas personalizadas a partir de una tabla contenida en un DataSet, así como la ordenación y búsqueda de filas.
En ADO clásico, para disponer de varias vistas de una misma tabla, debíamos crear diferentes objetos Recordset, lo cual provocaba el consumo de una gran cantidad de recursos. Este aspecto ha cambiado profundamente en ADO .NET, ya que partiendo de un objeto DataTable situado en un DataSet, vamos a definir varias vistas simultáneamente, ordenar y buscar registros, con la ventaja de que el consumo de recursos es menor, puesto que los objetos DataView se alimentan del mismo DataTable.
El proyecto se denominara WAccesoDatos, la tabla a consultar será Customers de la BD NorthWind. Una vez creado el nuevo proyecto en VB .NET, importaremos los espacio de nombres y declararemos a nivel de clase un conjunto de variables para la manipulación de los datos. Veamos la figura 32.
Imports System.Data Imports System.Data.SqlClient Public Class frmFiltroClientes Dim Cn As SqlConnection Private Da As SqlDataAdapter Private Ds As DataSet Dim Str As String End Class
Fig. 32: Variables declaradas
Ahora diseñaremos el formulario denominado frmFiltroClientes, para eso agregamos los siguientes controles, los cuales nos permitirá realizar las operaciones mencionadas.
Control NameLabel1 lblContactoGroupBox1 gbxClientesTextBox1 txtContactoDataGridView dgFiltro
Después de agregar los controles que describimos anteriormente, el formulario debe de quedar como se muestra en la Fig. 33.
Fig. 33: Formulario frmFiltroClientes
Acceso a Datos con VB .NET 2005
Ing. Eduardo Reyes
25
La propiedad RowFilter de la clase DataView nos permite asignar a este objeto, una cadena con la expresión de filtro, que en una consulta en lenguaje SQL sería la parte correspondiente a la cláusula Where.
Como hemos comentado anteriormente, a partir de un DataTable podemos obtener varios filtros mediante distintos objetos DataView, sin que ello suponga una penalización en el consumo de recursos. Para demostrar este punto, en el frmFiltroClientes, se crea una vista basada en un filtro y una vista normal. A continuación escribiremos el código del evento Load del frmFiltroClientes y el evento Keypress del txtContacto, el Código se muestra en la figura 34.
Private Sub frmFiltroClientes_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load 'creamos la conexion Cn = New SqlConnection Str = "Server=Srv01;DataBase=Northwind;UID=sa" Cn.ConnectionString = Str 'crear el adaptador (consulta) Me.Da = New SqlDataAdapter("Select * From Customers", Cn) 'agregar consulta al dataset Me.Ds = New DataSet() Me.Da.Fill(Ds, "Customers") Me.Da = Nothing End Sub Private Sub txtContacto_KeyPress(ByVal sender As Object, _ ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtContacto.KeyPress Dim Dv As DataView If Asc(e.KeyChar) = 13 Then Dv = New DataView 'filtrar por el campo y llenar el datagridview Dv.Table = Ds.Tables("Customers") Dv.RowFilter = "ContactName LIKE '%" & txtContacto.Text & "%'" 'agregar el filtro para mostrar en el Grid dgFiltro.DataSource = Dv End If End Sub
Fig. 34: Código del frmFiltroClientes
Una vez codificado el evento load del frmFiltroClientes y el evento del txtContacto ejecutamos la aplicación la cual vemos en la Fig. 35.
Fig. 35: Formulario frmFiltroClientes