Download ACCESO A DATOS DESDE VB .NET
Document related concepts
Transcript
CONEXIÓN VB. NET - SQL SERVER ACCESO A DATOS DESDE VB .NET 1. INTRODUCION: Las aplicaciones de acceso a datos, forman casi de forma habitual, parte de una aplicación Windows estándar. Sin lugar a dudas, en muchas ocasiones, nos resultará imprescindible acceder a fuentes de datos. En esta sesión, veremos como acceder a fuentes de datos de forma sencilla, desde nuestro entorno de desarrollo. Desde Vb Net 2005 se puede acceder a las siguientes bases de datos, utilizando las clases adecuadas. Oracle SQL Server Access Las que se puedan acceder a través de ODBC. 2. ADO.NET Si conoce el desarrollo de aplicaciones con versiones anteriores de Visual Basic a la tecnología .NET, entonces le sonará algunos aspectos entre otros como ADO, DAO. Visual Basic 2005 por su lado, ha visto de cerca el nacimiento de ADO.NET. Sin embargo, no es recomendable comparar ADO.NET con los anteriores métodos de conexión a fuentes de datos. Nos centraremos en la forma de conectar de Visual Basic 2005 con fuentes de datos a través de ADO.NET 2.0. ADO.NET es por lo tanto, un conjunto de clases que nos permiten leer e interactuar con fuentes de datos almacenadas en bases de datos y otras fuentes de almacenamiento de datos. Estas clases de ADO.NET, las encontraremos dentro de System.Data. Entre todas las clases de este nombre de espacio, destacaremos la clase DataView, DataSet y DataTable. Si usted sabe, conoce o ha trabajado con RecordSet en anteriores versiones de Visual Basic, debe saber que ahora, podremos hacer lo mismo con los objetos DataSet y DataReader. Pero sobre todo, algo que destaca a ADO.NET sobre otros métodos de acceso, es que nos permite el desarrollo de aplicaciones en n-capas. Todo esto, unido a la posibilidad de trabajar con estándares como documentos XML, nos proporciona una intercomunicación entre entornos y dispositivos que está asegurada. Aún y así, existe otro detalle a tener en cuenta a la hora de trabajar con fuentes de datos junto a las clases y objetos de la tecnología .NET, y es que podemos trabajar con fuentes de datos conectadas o fuentes de datos desconectadas. La diferencia entre ellas, es la que veremos de forma breve a continuación. ¿Acceso conectado o acceso desconectado? Cuando trabajamos con fuentes de datos dentro de la tecnología .NET, podemos trabajar con fuentes de datos conectadas o fuentes de datos desconectadas. La diferencia entre ambos métodos de conexión es clara. Por un lado, el trabajo con fuentes de datos conectadas, requiere que exista un canal de comunicación existente entre la aplicación y la fuente de datos en todo momento. De esta manera, la conectividad con la aplicación, la apertura de la conexión, etc., que es la tarea más pesada en la comunicación de una aplicación con una fuente de datos, permanece abierta mientras se trabaja con la fuente de datos, estemos en un instante dado manipulando datos de la fuente de datos o no. Por decirlo de otra forma, la puerta de acceso la hemos dejado abierta y pasaremos de una habitación a otra y viceversa cuando queramos. Por otro lado, el trabajo con fuentes de datos desconectadas, requiere que cuando se accede a la base de datos, se recoja no sólo una copia de los datos con los que vamos a trabajar, sino que además se almacene una copia de la estructura de la tabla o tablas que hemos decidido descargar y otros datos relacionados con las tablas. En sí, es una copia exacta o una foto exacta de los datos de la tabla o tablas ~1~ Ing. Henry M. Arévalo Flores CONEXIÓN VB. NET - SQL SERVER y de todas las características de la tabla o tablas. Por lo tanto, se abre un canal de comunicación, se recogen los datos para trabajar con ellos y se cierra nuevamente el canal de comunicación. Esos datos se almacenan en memoria, y se trabaja por lo tanto, con los datos de memoria, no con la fuente de datos directamente como en el caso anterior dónde trabajábamos con fuentes de datos conectadas. La única particularidad a tener en cuenta en este último caso, es que como lógicamente haremos una copia de la estructura, propiedades, características y datos de la tabla o tablas con las que queremos trabajar de forma desconectada, no es muy recomendable por no decir totalmente prohibido, hacer una copia de cualquier tabla, ya que podemos sobrecargar la aplicación y afectar considerablemente en el rendimiento de ésta. 3. LAS CLASES. Cada base de datos dispone de una clase especializada en el manejo de la misma. Oracle OracleClient SQL SQLClient Access OleDb Odbc ODBC Genérico DB Y estas clases están disponibles en el espacio de nombres System.Data. Como vamos a centrarnos en SQL, la clase que utilizaremos será SQLClient. Imports System.Data.SqlClient 4. LOS OBJETOS. Podemos clasificarlos o agruparlos en Conexión. Almacenamiento. Visualización. Otros. 3.1. Conexión. El objeto de conexión en SQL Server es el SqlConnection. Permite definir los datos necesarios para acceder a cada tipo de base de datos. Otro objeto de conexión, es el DataAdapter. Este objeto permite realizar el acceso a la base de datos para el intercambio de información en los dos sentidos, digamos que gestiona los datos entre la base de datos y la aplicación a partir de los datos facilitados en la conexión. Pertenece a Imports System.Data.Odbc.OdbcDataAdapter. Cada objeto de almacenamiento debe tener un objeto DataAdapter asignado, pues es el que a través del cual puede hacerse luego el proceso de actualización. 3.2. Almacenamiento. Los objetos de almacenamiento son: DataReader System.Data.Odbc.OdbcDataReader El objeto DataReader es un objeto ágil y que esta especializado en almacenar datos para solo lectura, lo que le quita la gestión de las actualizaciones y le permite ser más rápido en los accesos a los datos de la base de datos. DataTable System.Data.DataTable El objeto DataTable, es lo más parecido a una tabla de la base de datos, dispone de la posibilidad de definir clave primaria de uno o varios campos. El DataTable puede ser la imagen de una tabla de la base de datos, o puede ser el resultado de una SQL que combine varias tablas en la SQL, o tabla virtual si queremos llamarla así. Este objeto en el uso del DataSet es usado como parte del DataSet. DataSet System.Data.DataSet El objeto DataSet es lo que hemos dado en llamar antes un subconjunto de la base de datos de nuestra aplicación. Al iniciar el programa se carga con aquellos datos que sean necesarios para el ~2~ Ing. Henry M. Arévalo Flores CONEXIÓN VB. NET - SQL SERVER mismo, se cierra la conexión y luego se realiza la actualización de los datos en la base de datos con los cambios que haya habido en el programa. DataRow System.Data.DataRow El objeto DataRow, lo hemos incorporado como elemento de almacenamiento, aunque hace referencia a una fila, registro de la base de datos, porque hemos comprobado lo útil que llega a ser el uso del mismo, y al fin y al cabo almacena datos, un registro, pero datos. 3.3. Visualización. Los objetos de visualización puede ser cualquiera de los que tenemos disponibles en el entorno de programación. Lo importante aquí es como utilizarlos a la hora de visualizar los datos de nuestra fuente de almacenamiento. Podríamos hablar de dos posibilidades. Asignación clásica de los datos, o enlazarlos a nuestra fuente de datos. Las dos son válidas evidentemente, pero hay que ver la practicidad. El enlazado de un DataDrid a nuestro DataTable es comodísimo, pues se encarga de representar los datos que vamos incluyendo en la tabla, sea la origen o una virtual. El enlazado de un TextBox a un objeto crea el mismo código que hacer una asignación manual o clásica. La clase DataView, por otro lado, nos permite crear múltiples vistas de nuestros datos para presentar los datos de su correspondiente DataTable posteriormente. Adicionalmente a esto, también podemos ordenar y filtrar los datos, buscar y navegar un conjunto de datos dado, etc. 4.4. Otros. Estos objetos pueden ser: BindingSource CommandBuilder Command BindingSource, este objeto es el que hace de puente entre aquellos objetos que no disponen de la propiedad DataSource y el objeto fuente de los datos. CommandBuilder, genera de forma automática código SQL para las opciones Insert, Update y Delete, tanto para el uso normal, como para cuando se utiliza el DataAdapter en el entorno de un DataSet. Command, sirve para indicar, almacenar y ejecutar cuando proceda, la instrucción SQl, sea almacenada o incrustada, para un objeto DataReader o DataAdapter. Tiene dos formatos de utilización, ExecuteNonQuery se ejecuta y no devuelve datos, borrado por ejemplo. ExecuteReader se ejecuta y devuelve una colección de datos que se asignan a un objeto. ~3~ Ing. Henry M. Arévalo Flores CONEXIÓN VB. NET - SQL SERVER Crear un nuevo proyecto: Y lo guardamos en una carpeta de trabajo: Y agregamos un modulo para crear la cadena de conexión: En la parte donde se encuentra el nombre del server debe de ir el nombre de tu servidor de base de datos. ~4~ Ing. Henry M. Arévalo Flores CONEXIÓN VB. NET - SQL SERVER Diseñar el siguiente Menú Principal, recuerde que el formulario debe de ser un contenedor MDI. Opciones del Menú Mantenimiento. Adjunte la Base de Datos que se encuentra guardado en su carpeta de trabajo. ~5~ Ing. Henry M. Arévalo Flores CONEXIÓN VB. NET - SQL SERVER DISEÑO DE INTERFAZ PROPUESTA Formulario que permitirá el mantenimiento de la tabla Alumno. txtCodigo Nombre: cboSexo Items: - Masculino - Femenino txtApellidos txtNombres dtFecha Format: short txtDireccion txtEmail btnPrimero btnAnterior btnSiguiente btnUltimo btnBuscar btnNuevo btnEditar btnGuardar btnDeshacer btnEliminar dtgAlumno ~6~ Ing. Henry M. Arévalo Flores CONEXIÓN VB. NET - SQL SERVER CÓDIGO PARA CONECTAR EL FORMULARIO A LA TABLA ALUMNO 'importamos el SqlClient Imports System.Data.SqlClient Public Class FrmAlumno 'DECLARAMOS LAS VARIABLES Dim conn As New SqlConnection Dim objDataAdapter As SqlDataAdapter Dim objDataSet As DataSet Public posicion, flag As Integer 'CREAMOS LOS PROCEDMIENTOS ‘ Crear los siguientes Procedimientos Private Sub conexion() 'crear la cadena de conexion conn.ConnectionString = cadena 'crear el dataAdapter Me.objDataAdapter = New SqlDataAdapter("SELECT * FROM ALUMNO", conn) 'genera de forma automática código SQL para las opciones Insert, Update y Delete() Dim comandbuilder As SqlCommandBuilder = New SqlCommandBuilder(objDataAdapter) 'instanciar el dataSet objDataSet = New DataSet() 'abrir conexion conn.Open() 'agrega las filas al dataset recuperadas desde la tabla Me.objDataAdapter.Fill(objDataSet, "ALUMNO") 'cierra la conexion conn.Close() 'indica la posicion actual del registro posicion = 0 'llamar el procedimiento Me.cargadatos() End Sub Private Sub cargadatos() 'obtener un objeto con la fila actual Dim fila As DataRow 'obtener fila actual 'obtener la fila actual fila = Me.objDataSet.Tables("ALUMNO").Rows(Me.posicion) 'PASAR CONTENIDO A LOS CAMPOS Me.txtCodigo.Text = fila("alu_codi") Me.TxtApellidos.Text = fila("alu_apel") Me.TxtNombres.Text = fila("alu_nomb") Me.cboSexo.Text = fila("alu_sexo") Me.txtDireccion.Text = fila("alu_dire") Me.txtEmail.Text = fila("alu_mail") Me.dtfecha.Value = fila("alu_fnac") 'conectar el dataGridView con la tabla Me.DtgAlumno.DataSource = objDataSet.Tables(0) 'SELECCIONAR TODA LA FILA del dataGridView With dtgAlumno .MultiSelect = False .SelectionMode = DataGridViewSelectionMode.FullRowSelect End With 'Asignar el estilo del DatagridView Me.dtgAlumno.Font = _ New Drawing.Font("Tahoma", 8, FontStyle.Regular, GraphicsUnit.Point) 'RELACIONAR REGISTRO CON DATAGRIDVIEW dtgAlumno.Rows(posicion).Selected = True dtgAlumno.Rows(posicion).Cells(0).Selected = True 'Cambiando de Nombre a los encabezados dtgAlumno.Columns("alu_codi").HeaderText dtgAlumno.Columns("alu_apel").HeaderText dtgAlumno.Columns("alu_nomb").HeaderText dtgAlumno.Columns("alu_sexo").HeaderText dtgAlumno.Columns("alu_dire").HeaderText dtgAlumno.Columns("alu_fnac").HeaderText dtgAlumno.Columns("alu_mail").HeaderText 'estableciendo el ancho de las columnas dtgAlumno.Columns("alu_codi").Width = dtgAlumno.Columns("alu_apel").Width = 80 ~7~ de las columnas = "Código" = "Apellidos" = "Nombres" = "Sexo" = "Dirección" = "Fecha Nac" = "Correo Electronico" 40 Ing. Henry M. Arévalo Flores CONEXIÓN VB. NET - SQL SERVER dtgAlumno.Columns("alu_nomb").Width = 80 dtgAlumno.Columns("alu_sexo").Width = 30 dtgAlumno.Columns("alu_dire").Width = 80 dtgAlumno.Columns("alu_fnac").Width = 40 dtgAlumno.Columns("alu_mail").Width = 80 End Sub ‘llamamos al procedimiento conexion()desde el evento Load del Formulario Private Sub FrmAlumno_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load conexion() End Sub CODIGO PARA LOS BOTONES DE DESPLAZAMIENTO Private Sub btnPrimero_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrimero.Click Me.posicion = 0 Me.cargadatos() End Sub Private Sub btnAnterior_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAnterior.Click 'si estamos en el ultimo registro no hacer movimiento If Me.posicion = 0 Then MessageBox.Show("Primer Registro") Else 'incrementar el marcador de registro y actualizar los controladores con lños datos del registro actual Me.posicion -= 1 Me.cargadatos() End If End Sub Private Sub btnSiguiente_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSiguiente.Click 'si estamos en el ultimo registro no hacer movimiento If Me.posicion = (Me.objDataSet.Tables("ALUMNO").Rows.Count - 1) Then MessageBox.Show("Ultimo Registro") Else 'incrementar el marcador de registro y actualizar los controladores con los datos del registro actual Me.posicion += 1 Me.cargadatos() End If End Sub Private Sub btnUltimo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUltimo.Click Me.posicion = (Me.objDataSet.Tables("ALUMNO").Rows.Count - 1) Me.cargadatos() End Sub ~8~ Ing. Henry M. Arévalo Flores