lunes, 15 de julio de 2019

Acceso a bases de datos con ADO.NET


Bases de datos

   Cualquier aplicación de interés requiere el almacenamiento y posterior recuperación de los datos con los que trabaje (pedidos en aplicaciones de comercio electrónico, datos de personal para las aplicaciones de recursos humanos, datos de clientes en sistemas CRM, etc.). Los sistemas de gestión de bases de datos (DBMSs) nos permiten almacenar, visualizar y modificar datos, así como hacer copias de seguridad y mantener la integridad de los datos, proporcionando una serie de funciones que facilitan el desarrollo de nuevas aplicaciones.

     Desde un punto de vista intuitivo, una base de datos no es más que un fondo común de información almacenada en una computadora para que cualquier persona o programa autorizado pueda acceder a ella, independientemente de su lugar de procedencia y del uso que haga de ella. Algo más formalemente, una base de datos es un conjunto de datos comunes a un "proyecto" que se almacenan sin redundancia para ser útiles en diferentes aplicaciones.

      El Sistema de Gestión de Bases de Datos (DBMS) es el software con capacidad para definir, mantener y utilizar una base de datos. Un sistema de gestión de bases de datos debe permitir definir estructuras de almacenamiento, así como acceder a los datos de forma eficiente y segura. Ejemplos: Oracle, IBM DB2, Microsoft SQL Server, Interbase...

      En una base de datos, los datos se organizan independientemente de las aplicaciones que los vayan a usar (independencia lógica) y de los ficheros en los que vayan a almacenarse (independencia física). Además, los datos deben ser accesibles a los usuarios de la manera más amigable posible, generalmente mediante lenguajes de consulta como SQL o Query-by-example. Por otro lado, es esencial que no exista redundancia (esto es, los datos no deben estar duplicados) para evitar problemas de consistencia e integridad.

Bases de datos relacionales

  • Tabla o relación: Colección de registros acerca de entidades de un tipo específico (p.ej. alumnos).
  • Atributo, campo o columna: Propiedad asociada a una entidad (p.ej. nombre, apellidos...). Cada atributo tiene un tipo asociado (p.ej. entero, cadena de caracteres...) y puede tomar el valor nulo (null).
  • Tupla, registro o fila: Datos relativos a un objeto distinguible de otros (p.ej. un alumno concreto).


Se pueden estrablecer relaciones entre las tablas de una base de datos relacional mediante el uso de claves primarias y claves externas (p.ej. cada libro tiene, al menos, un autor).

  • Clave primaria: Conjunto de atributos que nos permiten identificar unívocamente a una entidad dentro de un conjunto de entidades (p.ej. número de matrícula). La clave primaria garantiza la unicidad de una tupla, pues no se permite la existencia de varios registros que compartan su clave primaria.
  • Clave externa: Conjunto de atributos que hacen referencia a otra tabla, lo que nos permite establecer relaciones lógicas entre distintas tablas. Los valores de los atributos de la clave externa han de coincidir con los valores de los atributos de una clave (usualmente la primaria) en una de las tuplas de la tabla a la que se hace referencia (integridad referencial).


SQL


Lenguaje estándar para acceder a una base de datos relacional, estandarizado por el American National Standards Institute (ANSI): SQL-92. En gran parte, los distintos DBMS utilizan todos el mismo SQL, si bien cada vendedor le ha añadido sus propias extensiones. El lenguaje SQL se divide en:

  • DDL (Data Definition Language), utilizado para crear y modificar la estructura de la base de datos (p.ej. CREATE TABLE).
  • DML (Data Manipulation Language), empleado para manipular los datos almacenados en la base de datos (p.ej. consultas con la sentencia SELECT).
  • DCL (Data Control Language), para establecer permisos de acceso (GRANT, REVOKE, DENY) y gestionar transacciones (COMMIT y ROLLBACK).

Interfaces de acceso a bases de datos

Evolución histórica de los "estándares" propuestos por Microsoft:

  • ODBC (Open Database Connectivity): API estándar ampliamente utilizado, disponible para múltiples DBMSs, utiliza SQL para acceder a los datos.
  • DAO (Data Access Objects): Interfaz para programar con bases de datos JET/ISAM, utiliza automatización OLE y ActiveX.
  • RDO (Remote Data Objects): Fuertemente acoplado a ODBC, orientado al desarrollo de aplicaciones cliente/servidor.
  • OLE DB: Construido sobre COM, permite acceder a bases de datos tanto relacionales como no relacionales (no está restringido a SQL). Se puede emplear con controladores ODBC y proporciona un interfaz a bajo nivel en C++.
  • ADO (ActiveX Data Objects): Ofrece un interfaz orientado a objetos y proporciona un modelo de programación para OLE DB accesible desde lenguajes distintos a C++ (p.ej. Visual Basic).


ADO se diseñó para su uso en arquitecturas cliente/servidor con bases de datos relacionales (no jerárquicas, como es el caso de XML). Su diseño no está demasiado bien factorizado (ya que existen muchas formas de hacer las cosas y algunos objetos acaparan demasiadas funciones) y ADO no estaba pensado para arquitecturas multicapa en entornos distribuidos.

ADO .NET es una colección de clases, interfaces, estructuras y tipos enumerados que permiten acceder a los datos almacenados en una base de datos desde la plataforma .NET. Si bien se puede considerar una versión mejorada de ADO, no comparte con éste su jerarquía de clases (aunque sí su funcionalidad).

ADO .NET combina las capas ADO y OLE DB en una única capa de proveedores (managed providers). Cada proveedor contiene un conjunto de clases que implementan interfaces comunes para permitir el acceso uniforme a distintas fuentes de datos. Ejemplos: ADO Managed Provider (da acceso a cualquier fuente de datos OLE DB), SQL Server Managed Provider (específico para el DBMS de Microsoft), Exchange Managed Provider (datos almacenados con Microsoft Exchange)...


ADO .NET usa XML. De hecho, los conjuntos de datos se almacenan internamente en XML, en vez de almacenarse en binario como sucedía en ADO. Al estar los datos almacenados en XML, se simplifica el acceso a los datos a través de HTTP (algo que ocasiona problemas en ADO si los datos tienen que pasar cortafuegos). Por otro lado, se simplifica la comunicación entre aplicaciones al ser XML un formato estándar (p.ej. comunicación con applets Java).

Con ADO .NET se puede acceder a los datos de dos formas distintas:

  • Acceso conectado: Acceso sólo de lectura con cursores unidireccionales ("firehose cursors"). La aplicación realiza una consulta y lee los datos conforme los va procesando con la ayuda de un objeto DataReader.
  • Acceso desconectado: La aplicación ejecuta la consulta y almacena los resultados de la misma para procesarlos después accediendo a un objeto de tipo DataSet. De esta forma, se minimiza el tiempo que permanece abierta la conexión con la base de datos.


Al proporcionar conjuntos de datos de forma desconectada, se utilizan mejor los recursos de los servidores y se pueden construir sisyemas más escalables que con ADO (que mantenía abierta la conexión con la base de datos la mayor parte del tiempo). Este enfoque resulta más adecuado en sistemas distribuidos como Internet.


Arquitectura ADO.NET

El funcionamiento de ADO.NET se basa esencialmente en utilizar los siguientes componentes:

  •   Data Provider (proveedor de datos): Proporciona un acceso uniforme a conjuntos de datos (bases de datos relacionales o información ID3 de ficheros MP3). Su papel el similar al de un controlador ODBC o JDBC.
  •  DataSet: El componente más importante, puede almacenar datos provenientes de múltiples consultas (esto es, múltiples tablas).
  •  DataAdapter: Sirve de enlace entre el contenedor de conjuntos de datos (DataSet) y la base de datos (Data Provider).


Los componentes anteriores se completan con DataReader (para realizae eficientemente lecturas de grandes cantidades de datos que no caben en memoria), DataRelation (la forma de establecer una reunión entre dos tablas), Connection (utilizada por DataAdapter para conectarse a la base de datos) y Command (que permite especificar las órdenes, generalmente en SQL, que nos permiten consultar y modificar el contenido de la base de datos: select, insert, delete y update).

Un proveedor de datos debe proporcionar una implementación de Connection, Command, DataAdapter y DataReader.

El modo de funcionamiento típico de ADO.NET es el siguiente:

  • Se crean un objeto Connection especificando la cadena de conexión.
  • Se crea un DataAdapter.
  • Se crea un objeto Command asociado al DataAdapter, con la conexión adecuada y la sentencia SQL que haya de ejecutarse.
  • Se crea un DataSet donde almacenar los datos.
  • Se abre la conexión.
  • Se rellena el DataSet con datos a través del DataAdapter.
  • Se cierra la conexión.
  • Se trabaja con los datos almacenados en el DataSet.

Como los conjuntos de datos se almacenan en memoria y trabaja con ellos de forma desconectada, cuando hagamos cambios sobre ellos (inserciones, borrados o actualizaciones) debemos actualizar el contenido de la base de datos llamando al método Update del DataAdapter y, posteriormente, confirmar los cambios realizados en el DataSet (con AcceptChanges) o deshacerlos (con RejectChanges).


Video Recomendado:






ADO.NET


ADO .NET es la nueva versión del modelo de objetos ADO (ActiveX Data Objects), es decir, la estrategia que ofrece Microsoft para el acceso a datos. ADO .NET ha sido ampliado para cubrir todas las necesidades que ADO no ofrecía, ADO .NET está diseñado para trabajar con conjuntos de datos desconectados, lo que permite reducir el tráfico de red. ADO .NET utiliza XML como formato universal de transmisión de los datos. ADO .NET posee una serie de objetos que son los mismos que aparecen en la versión anterior de ADO, como pueden ser el objeto Connection o Command, e introduce nuevos objetos tales como el objeto DataReader, DataSet o DataView.

¿Qué es ADO.NET?


Con independencia de lo que hagamos con los datos, hay ciertos conceptos fundamentales que debemos conocer sobre los datos en ADO.NET. Es posible que nunca necesitemos conocer algunos de los detalles de la gestión de datos, pero es útil conocer la arquitectura de los datos en ADO.NET, cuáles son los principales componentes de datos, y cómo se acoplan las piezas. Este tema no proporciona detalles muy elaborados, sino que es una introducción a los conceptos relacionados con la integración de datos en ADO.NET.

➤ DO.NET es un conjunto de clases para trabajar con datos. Proporciona:


  1. Un sistema diseñado para entornos desconectados.
  2. Un modelo de programación con soporte avanzado de XML.
  3. Un conjunto de clases, interfaces, estructuras y enumeraciones que gestionan el acceso a datos desde el .NET Framework


Objetos comunes de ADO.NET




Los proveedores de datos de .NET y el espacio de nombres System.Data proporcionan los objetos ADO.NET que utilizaremos en un escenario desconectado. Objetos ADO.NET ADO.NET proporciona un modelo de objetos común para proveedores de datos de .NET. La siguiente tabla describe los principales objetos ADO.NET que utilizaremos en un escenario desconectado.



Objeto
Descripción
Connection
Establece y gestiona una conexión a una fuente de datos específica. Por ejemplo, la clase OleDbConnection se conecta a fuentes de datos OLE DB.
Command
Ejecuta un comando en una fuente de datos. Por ejemplo, la clase OleDbCommand puede ejecutar instrucciones SQL en una fuente de datos OLE DB.
DataSet
Diseñado para acceder a datos con independencia de la fuente de datos. En consecuencia, podemos utilizarlo con varias y diferentes fuentes de datos, con datos XML, o para gestionar datos locales a la aplicación. El objeto DataSet contiene una colección de uno o más objetos DataTable formados por filas y columnas de datos, además de clave principal, clave foránea, restricciones e información de la relación sobre los datos en los objetos DataTable.
DataReader
Proporciona un flujo de datos eficaz, sólo-reenvío y de sólo-lectura desde una fuente de datos.
DataAdapter
Utiliza los objetos Connection, Command y DataReader implícitamente para poblar un objeto DataSet y para actualizar la fuente de datos central con los cambios efectuados en el DataSet. Por ejemplo, OleDbDataAdapter puede gestionar la interacción entre un DataSet y una a base de datos Access.


Demostración: Uso del Explorador de servidores


En esta demostración, aprenderemos cómo utilizar el Explorador de servidores para agregar conexiones a bases de datos y visualizar elementos de bases de datos como tablas.
  

➤ Crear un nuevo proyecto

  1. Iniciar un nuevo proyecto de Microsoft Visual Basic® .NET basado en la plantilla Windows Application.
  2. Poner el nombre TitlesDataGrid al proyecto, establecer la ubicación, y hacer clic en Aceptar.


➤ Mostrar las capacidades de Server Explorer utilizando la tabla Titles


  1. En el Explorador de servidores, en Servidores, expandir el nodo nombre_del_pc, expandir el nodo Servidores SQL Server, y expandir el nodo nombre_del_pc/NETSDK para que se muestren todas las bases de datos SQL disponibles en el equipo.
  2. Expandir el nodo de la base de datos Pubs, expandir el nodo Tablas bajo Pubs, y expandir los campos bajo la tabla Titles.
  3. Hacer clic con el botón derecho en la tabla Titles y explicar las opciones que aparecen.
  4. Hacer clic en Recuperar datos de la tabla, y mostrar los datos de los campos de la tabla en la ventana de resultados. Explicar que los datos pueden actualizarse aquí, y que se aplicarán las limitaciones impuestas por el diseño de la tabla SQL. Cerrar la ventana de resultados.
  5. Hacer clic en varios campos de la tabla Titles en el Explorador de servidores y explicar de qué forma la información sobre el tipo y longitud de los datos que se muestra en la ventana Propiedades puede resultar útil para crear una aplicación.



➤ Agregar Connection y el DataAdapter al formulario


  1. En el Explorador de servidores, arrastrar la tabla Titles a Form1. Cuando se arrastre la tabla al formulario, se crearán SqlConnection1 y SqlDataAdapter1 y se añadirán a la bandeja de componentes.
  2. En la ventana Propiedades, cambiar la propiedad Name de SqlConnection1 por PubsConn y cambiar la propiedad Name de SqlDataAdapter1 por PubsSqlDataAdapter.
  3. Expandir la propiedad InsertCommand de PubsSqlDataAdapter. Verificar que la propiedad Connection está establecida en PubsConn. Explicar que el objeto de conexión es la fuente de datos de DataAdapter. También puede explicarse que DataAdapter gestiona los comandos SQL Select, Insert, Delete y Update. Ë Generar el DataSet para la tabla Products
  4. En la ventana Propiedades, en el área de descripción de la parte inferior de la lista de propiedades, hacer clic en Generar Dataset.
  5. En el cuadro de diálogo Generar Dataset, escribir PubsDataSet en el cuadro de texto Nuevo.
  6. En el resto de cuadros de texto, dejar los valores predeterminados. Hacer clic en Aceptar. PubsDataSet1 debería aparecer en la bandeja de componentes.

➤ Agregar un DataGrid al formulario y establecer sus propiedades


  1. En la ficha Windows Forms del Cuadro de herramientas, agregar un control DataGrid al formulario.
  2. En la ventana Propiedades, poner al control DataGrid el nombre TitlesDataGrid.
  3. En la ventana Propiedades, establecer la propiedad DataSource del control DataGrid en PubsDataSet1, y establecer la propiedad DataMember para Titles.
  4. Ajuste el tamaño del formulario y el control DataGrid para que todas las filas y columnas estén visibles. La rejilla de datos debería mostrar los nombres de los campos de la tabla Titles.



➤ Poblar el DataSet con los datos de la tabla Titles


Abrir un controlador de eventos para el evento Form1_Load. En el controlador de eventos Form1_Load, invocar el método Fill del adaptador de datos para poblar la tabla Titles con datos. El código debería ser como el siguiente: PubsSqlDataAdapter.Fill(PubsDataSet1)

➤ Probar la aplicación


  1. Ejecutar la aplicación Los datos de Titles deberían poblar la rejilla de datos.
  2. Mostrar la funcionalidad de la rejilla de datos utilizando las barras de desplazamiento y modificando los anchos de las columnas.


Cómo trabajar con bases de datos en el Explorador de servidores





Podemos utilizar el Explorador de servidores para visualizar y manipular enlaces a datos, conexiones de bases de datos, y recursos del sistema en cualquier servidor para el que tengamos acceso en red. Utilizando el Explorador de servidores, podemos:

  1. Crear y abrir conexiones de datos a Microsoft Access, a servidores ejecutando Microsoft SQL Server y a otras bases de datos.
  2. Iniciar sesión en servidores y mostrar sus bases de datos, tablas, campos y sus datos sin abandonar el entorno de desarrollo ni utilizar el software de la base de datos.
  3. Visualizar los servicios del sistema, incluyendo el registro de sucesos, colas de mensajes, contadores de rendimiento y otros servicios del sistema.
  4. Visualizar información sobre los Servicios Web XML disponibles y los métodos y esquemas que proporcionan.
  5. Almacenar proyectos y referencias a bases de datos.
  6. Crear componentes de datos que hagan referencia al recurso de datos o monitorizar su actividad arrastrando nodos desde el Explorador de servidores a nuestros proyectos de Visual Studio .NET.
  7. Interactuar con recursos de datos programando los componentes de datos creados en nuestros proyectos de Visual Studio .NET.


➤ Abrir el Explorador de servidores


Podemos abrir el Explorador de servidores en cualquier momento durante el proceso de desarrollo, mientras trabajamos con cualquier tipo de proyecto o elemento.

➤ Abrir el Explorador de servidores


  1. En el menú Ver, hacer clic en Explorador de servidores. – O –
  2. Si la ficha Explorador de servidores se muestra en el extremo izquierdo de la pantalla, hacer clic en esa ficha.



➤ Agregar y eliminar conexiones a datos


El Explorador de servidores muestra las conexiones a bases de datos bajo el nodo Conexiones de datos. Después de establecer una conexión, podemos diseñar programas para abrir conexiones y recuperar y manipular los datos. De modo predeterminado, el Explorador de servidores muestra conexiones a datos y enlaces a servidores utilizados con anterioridad.

➤ Agregar una conexión a datos en el Explorador de servidores


  1. En el menú Herramientas, hacer clic en Conectar con base de datos. Se abre el cuadro de diálogo Propiedades del vínculo de datos.
  2. En la ficha Proveedor del cuadro de diálogo Propiedades del vínculo de datos, seleccionar un proveedor.
  3. En la ficha Conexión del cuadro de diálogo Propiedades del vínculo de datos, proporcionar la información que se solicita. Los campos de entrada que se muestran pueden variar en función del proveedor seleccionado en la ficha Proveedor. Por ejemplo, si seleccionamos el proveedor OLE DB para SQL Server, la ficha Conexión muestra campos para el nombre de servidor, el tipo de autenticación y la base de datos.
  4. Hacer clic en Aceptar para establecer la conexión de datos. El cuadro de diálogo Propiedades del vínculo de datos se cierra, y la nueva conexión de datos aparece debajo del nodo Conexiones de datos, con el nombre del servidor y de la base de datos a la que se accede. Por ejemplo, si creamos una conexión de datos a una base de datos denominada NWind en un servidor llamado Server1, aparece una nueva conexión con el nombre Server1.NWind.dbo bajo el nodo Conexiones de datos.



➤ Eliminar una conexión de datos desde el Explorador de servidores


  1. En el Explorador de servidores, expandir el nodo Conexiones de datos.
  2. Seleccionar la conexión a la base de datos deseada.
  3. Pulsar DELETE. No se produce ningún efecto en la base de datos. Hemos eliminado la referencia desde nuestra vista.



➤ Arrastrar y soltar recursos de datos


Podemos arrastrar elementos desde el Explorador de servidores y soltarlos en el Diseñador de Windows Forms. Ubicar elementos en el Diseñador de Windows Forms crea nuevos recursos de datos que están preconfigurados para recuperar información de fuentes de datos seleccionadas.

➤ Crear un nuevo componente de datos utilizando el Explorador de servidores


  1. Podemos crear un componente de datos preconfigurado para hacer referencia a un determinado recurso.
  2. En la vista de Diseño, abrir el formulario al que deseamos agregar un componente de datos.
  3. En el Explorador de servidores, seleccionar el elemento de datos que deseamos utilizar. Un ejemplo de elemento de datos es un campo o una tabla.
  4. Arrastrar el elemento desde el Explorador de servidores a la superficie del diseñador.



 ➤ Visualizar elementos de la base de datos


Podemos utilizar el Explorador de servidores para visualizar y recuperar información de todas las bases de datos instaladas en un servidor. Podemos hacer una lista de tablas, vistas, procedimientos almacenados y funciones de la base de datos en el Explorador de servidores, expandir tablas individuales para hacer una lista de sus columnas y disparadores, y hacer clic con el botón derecho sobre la tabla para seleccionar el Diseñador de tablas del menú contextual.


 ➤ Video Recomendado:




Acceso a bases de datos con ADO.NET

Bases de datos    Cualquier aplicación de interés requiere el almacenamiento y posterior recuperación de los datos con los que trabaje (...