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:






No hay comentarios:

Publicar un comentario

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 (...