¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. C# 8 y Visual Studio 2019
  3. El acceso a datos
Extrait - C# 8 y Visual Studio 2019 Los fundamentos del lenguaje
Extractos del libro
C# 8 y Visual Studio 2019 Los fundamentos del lenguaje
1 opinión
Volver a la página de compra del libro

El acceso a datos

Principios de una base de datos

Las bases de datos constituyen actualmente un elemento imprescindible para casi cualquier aplicación. Sustituyen al uso de archivos, pesados y complicados para el desarrollador. Las bases de datos permiten, también, compartir información de manera más sencilla, ofreciendo un excelente rendimiento.

El uso de bases de datos requiere el conocimiento de dos requisitos previos: ciertos elementos de la terminología que se utilizan con más frecuencia así como algunas nociones de manipulación de datos mediante el lenguaje SQL.

1. Terminología

El conocimiento de los términos descritos a continuación es imprescindible para la comprensión de este capítulo.

Tabla

Una tabla es una unidad lógica de almacenamiento que se corresponde con un tipo de dato. Su estructura se define mediante campos (columnas) y contiene registros (filas). El equivalente lógico de una tabla en C# es una clase.

Registro

Un registro es un elemento de una tabla que posee un valor para cada columna de la tabla. El equivalente en C# de un registro sería un objeto, es decir una instancia de una clase.

Campo

Un registro contiene varios campos. Cada uno de estos campos representa un dato compuesto que compone el registro. El equivalente en C# de un campo es una propiedad.

Estos tres elementos se representan, a menudo, bajo la forma de una tabla, lo que permite entender mejor y manipular estos conceptos.

images/ch8fig1.png

Clave primaria

Una clave primaria es un identificador único para cada registro de una tabla. La base de datos la reconoce de modo que puede utilizarse en alguna otra tabla para hacer...

ADO.NET

ADO.NET es un conjunto de tipos que proporciona la plataforma .NET cuyo objetivo común es manipular bases de datos. Este componente, incluido desde los inicios de .NET, es el fundamento del acceso a datos con C#.

1. Presentación

Los tipos que componen ADO.NET se dividen en dos categorías, definidas de manera que resulta muy sencillo separar las consultas a la base de datos de la manipulación de los datos en la aplicación.

Los procesamientos que deben realizarse directamente sobre una base de datos se implementan mediante tipos específicos de un proveedor de datos. Es posible, utilizando estos tipos, recuperar juegos de datos o eliminar registros, por ejemplo.

Los juegos de datos recuperados pueden, también, almacenarse de manera local y es posible manipularlos de manera completamente independiente de su fuente, gracias a ciertos tipos dedicados. Este modo de funcionamiento se denomina modo desconectado. Permite, en particular, producir secciones de código comunes a todos los tipos de bases de datos, lo que mejora la fiabilidad y la mantenibilidad de las aplicaciones reduciendo el número de líneas de código y, en consecuencia, el número de potenciales fuentes de error.

2. Los proveedores de datos

Los proveedores de datos son elementos que permiten establecer un diálogo con los distintos tipos de bases de datos. Cada uno de estos proveedores se diseña para autorizar...

Utilizar ADO.NET en modo conectado

El modo conectado es el modo de funcionamiento original de las bases de datos. Permite mantener la conexión a la base de datos permanentemente, lo que presenta las siguientes ventajas:

  • Su uso es muy sencillo. En efecto, en este modo la conexión al origen de datos se crea tras el inicio de la aplicación y se destruye cuando el usuario sale.

  • Permite disponer permanentemente de datos actualizados.

  • Permite gestionar de manera más sencilla los accesos secuenciales. Dado que los usuarios están permanentemente conectados resulta más sencillo determinar quién utiliza los datos.

El modo conectado presenta, no obstante, algunos problemas nada despreciables:

  • Impone que exista una conexión de red permanente entre el cliente y el servidor de bases de datos. A la hora de la movilidad, resulta especialmente delicado imponer esta restricción a un usuario.

  • El servidor de base de datos debe gestionar múltiples conexiones permanentes simultáneamente, lo cual puede provocar un uso excesivo de recursos. 

1. Conexión a una base de datos

Antes de ejecutar cualquier consulta es necesario abrir una conexión con el servidor de bases de datos. Esta conexión se crea mediante la clase SqlConnection. Tras la instanciación de una conexión es necesario inicializar ciertos valores relativos a la base de datos. Estos se especifican mediante la cadena de conexión.

a. Cadenas de conexión

Una cadena de conexión es una cadena de caracteres que contiene la información necesaria para establecer una conexión con una base de datos. Esta información se especifica en forma de parejas de campos clave/valor separados por puntos y coma, las claves son nombres de parámetro reconocidos por el proveedor de datos.

Cuando se asigna a la propiedad ConnectionString de un objeto SqlConnection, se realiza un análisis de la cadena de conexión. Tras este análisis, se extraen los distintos valores contenidos en ella y se asignan a las distintas propiedades de la conexión. En caso de error durante esta etapa de análisis, se produce una excepción y las propiedades de la conexión permanecen sin cambios.

Las siguientes palabras clave están disponibles para configurar una cadena de conexión:

Data Source

Nombre o dirección de red del servidor...

Utilizar ADO.NET en modo desconectado

En el modo desconectado, la conexión al servidor de bases de datos no es permanente. Esto permite liberar recursos que podrían utilizarse por otra aplicación o por otro cliente de la base de datos.

Este modo de funcionamiento implica que hay que conservar una copia local de los datos sobre los que se desea trabajar. Para ello, es posible recrear de manera local una estructura parecida a la de una base de datos.

1. DataSet y DataTable

Las clases principales que permiten trabajar en modo desconectado son DataSet, DataTable, DataRow y DataColumn.

a. Descripción

Las distintas clases utilizadas para el modo desconectado son las contrapartes .NET de los elementos de la estructura de una base de datos.

DataSet

Un objeto DataSet es un contenedor, similar lógicamente a una base de datos. Es el que contendrá la totalidad de datos del conjunto sobre el que se desea trabajar.

DataTable

El tipo DataTable representa, como su propio nombre indica, una tabla. Un objeto DataTable, si bien puede existir independientemente, está lógicamente contenido en un DataSet.

DataColumn

La clase DataColumn es el equivalente .NET de las columnas SQL. Los DataTable poseen varios DataColumn, como las tablas en base de datos poseen varias columnas.

DataRow

Los objetos DataRow son los verdaderos contenedores de los datos. Cada DataRow se corresponde con un registro en un DataTable.

Estas cuatro clases no son los únicos tipos que representan elementos de la estructura de una base de datos. Encontramos, también, los tipos UniqueConstraint, ForeignKeyConstraint o DataRelation, que representan respectivamente las restricciones de unicidad, las claves foráneas y las relaciones entre objetos DataTable.

b. Llenar un DataSet a partir de una base de datos

Para trabajar con los datos de manera local es necesario recuperar los datos del servidor en un DataSet. Para ello, cada proveedor de datos proporciona un DbDataAdapter que permite realizar intercambios bidireccionalmente entre la base de datos y el DataSet. La implementación de la clase DbDataAdapter del proveedor de datos SQL Server es SqlDataAdapter.

Uso de un DbDataAdapter

En primer lugar, es preciso instanciar un objeto de un tipo derivado de la clase DbDataAdapter.

SqlDataAdapter adaptador = new SqlDataAdapter(); 

Este objeto posee una propiedad SelectCommand a la que se le asigna un comando de selección...

Utilizar las transacciones

Una transacción es un elemento que utiliza una base de datos para definir un conjunto de operaciones que deben ejecutarse de manera atómica. El grupo de consultas se considera como indivisible, de manera que si una de ellas falla, se anula la ejecución de la totalidad y la base de datos vuelve al estado anterior al inicio de la transacción. Esta operación de anulación se denomina, a menudo, rollback, mientras que la operación de validación final resultante de la ejecución correcta de cada una de las consultas se denomina commit.

Las transacciones se utilizan con frecuencia, por tanto, cuando existen varias consultas de modificación que deben realizarse pero el fallo de alguna de ellas supone una incoherencia de datos. Un ejemplo podría ser la gestión de las reservas en un avión o en un tren. Cuando todas las plazas están reservadas, las compañías aéreas mantienen una lista de espera para poder revender fácilmente una plaza cuando algún pasajero anula su reserva. En el momento de la anulación, nos encontramos con dos acciones a realizar:

  • Anulación de la reserva del pasajero A para el vuelo 1234, asiento 45.

  • Creación de la reserva para el cliente B, primero en la lista de espera, para el vuelo 1234, asiento 45.

Si la primera operación falla pero la segunda se produce correctamente, el estado de...