Sesion 06 - Arquitectura Ado - Net - Teoria
Sesion 06 - Arquitectura Ado - Net - Teoria
Sesion 06 - Arquitectura Ado - Net - Teoria
NET - TEORIA
A medida que desarrolla aplicaciones que tienen acceso a datos en Visual Studio,
deberá cumplir con diferentes requisitos. En algunos casos, puede que
simplemente desee mostrar datos en un formulario. En otros, quizá necesite idear
un modo de compartir información con otras aplicaciones o procesos.
La tarea general de trabajar con datos en una aplicación se puede dividir en varios
procesos de nivel superior. Por ejemplo, antes de mostrar los datos a un usuario en
un formulario, debe conectarse a un origen de datos (posiblemente una base de
datos) y, a continuación, obtener los datos que desea mostrar. Una vez incluidos
estos datos en la aplicación, necesitará almacenarlos temporalmente en alguna
parte, por ejemplo en un objeto DataSet.
Una aplicación de datos típica utilizará la mayoría de los procesos que se ilustran
en el diagrama siguiente:
El ciclo de datos
Validar datos
Al realizar cambios en los datos, es posible que desee comprobar los cambios
antes de permitir que los valores sean aceptados de regreso en la base de datos o
que éstos se escriban en ella. Validación es el nombre del proceso de comprobar
que estos nuevos valores son aceptables para los requisitos de la aplicación. Puede
comprobar los valores de la aplicación a medida que los modifica.
or
Guardar datos
Después de realizar los cambios en la aplicación (y validarlos), es posible que
desee enviar los cambios a la base de datos. Si está utilizando conjuntos de datos y
un modelo de datos desconectado, debería comprobar si existen infracciones de
concurrencia. (Este término se refiere a una situación en la que los datos de una
base de datos se han modificado desde que se cargaron originalmente en la
aplicación y ahora contiene valores más recientes que los de la aplicación).
También es posible que desee actualizar varias tablas al mismo tiempo, en cuyo
caso puede utilizar una transacción.
¿Qué es ADO.NET?
ADO.NET es un conjunto de clases que exponen servicios de acceso a datos para
el programador de .NET.
Objetivos de Diseño
• Soportar el modelo de programación multinivel (n-tier): en este modelo,
los datos se leen de la fuente de datos, se desconecta y pasan a través de
los diferentes niveles.
Características
• ADO.NET no depende de conexiones continuamente activas.
Interoperabilidad
Las aplicaciones ADO.NET pueden aprovechar la flexibilidad y la amplia
aceptación de XML. Dado que XML es el formato de transmisión de
conjuntos de datos a través de la red, cualquier componente que pueda leer
el formato XML podrá procesar los datos. En realidad, no es necesario en
absoluto que el componente receptor sea un componente ADO.NET: el
componente transmisor puede transmitir simplemente el conjunto de datos
a su destino, independientemente de cómo esté implementado el
componente receptor. El componente de destino podría ser una aplicación
de Visual Studio o cualquier otra aplicación implementada con cualquier
herramienta. El único requisito es que el componente receptor pueda leer
XML. Como estándar del sector, XML se diseñó precisamente con el
propósito de alcanzar este tipo de interoperabilidad.
Mantenibilidad
A lo largo de la vida de un sistema implementado es posible hacer
pequeños cambios, pero raramente se intenta hacer cambios importantes,
estructurales, debido a su dificultad. Es de lamentar que sea así puesto que,
en la realidad, tales cambios significativos pueden hacerse necesarios. Por
ejemplo, a medida que una aplicación implementada se hace más popular
entre los usuarios, es posible que el aumento de la carga de rendimiento
haga necesarios cambios estructurales. A medida que crece la carga de
rendimiento en un servidor de la aplicación implementada, los recursos del
sistema pueden escasear y el tiempo de respuesta y el rendimiento pueden
verse afectados. Ante este problema, los arquitectos de software pueden
tomar la decisión de dividir en el servidor el procesamiento de la lógica de
empresa y el procesamiento de la interfaz de usuario en niveles diferentes
y en equipos separados. En la práctica, el nivel del servidor de aplicación
se reemplaza con dos niveles, lo que alivia la escasez de recursos del
sistema.
23
Programabilidad
En Visual Studio, los componentes de datos ADO.NET encapsulan
funcionalidad de acceso a datos de diversas formas que ayudan a
programar de modo más rápido y con menos errores. Por ejemplo, los
comandos de datos condensan la tarea de generar y ejecutar instrucciones
SQL o procedimientos almacenados.
Rendimiento
Para las aplicaciones desconectadas, los conjuntos de datos ADO.NET
ofrecen ventajas de rendimiento frente a los conjuntos de registros ADO
desconectados. Cuando se utiliza el cálculo de referencias de COM para
transmitir un conjunto de registros desconectado entre niveles, la
conversión de los valores del conjunto de registros a tipos de datos
reconocibles por COM puede suponer un costo de procesamiento
significativo. En ADO.NET, tal conversión de tipos de datos no es
necesaria.
Escalabilidad
Dado que las soluciones Web puede incrementar en gran medida la
demanda de datos, la escalabilidad adquiere una importancia crucial. Las
aplicaciones para Internet tienen un suministro ilimitado de usuarios
potenciales. Aunque una aplicación pueda dar un buen servicio a una
docena de usuarios, eso no significa que pueda dar un servicio igualmente
bueno a cientos o cientos de miles de ellos. Una aplicación que consuma
recursos tales como bloqueos y conexiones de base de datos no dará un
buen servicio a un gran número de usuarios, porque la demanda de
recursos limitados por parte de los usuarios acabará por superar su
disponibilidad.
Componentes de ADO.NET
La siguiente ilustración muestra los principales componentes de ADO.NET. Que
son:
• DataSet.
• Proveedores administrados
7
(IIS o Servicio Web) datos
Wlndows Forms Í Conjunto
de datos
Conjunto
de datos
Adaptador Conexión
□•
de datos de da tos
·--------------
�-....i''º"'��
(Por ejemplo, BlzThlk)
Componentes ADO.NET
or
Nótese que XML constituye el elemento del nexo entre las capas de presentación
y de negocio. Además el conjunto de datos es parte de la capa de presentación en
el cliente.
• Connection
• Command
• DataReader
• DataAdapter.
Arquitectura de ADO.NET
Principales objetos
Los objetos principales en ADO.NET son los que permiten el manejo de datos, y
se detallan en el esquema anterior de la arquitectura ADO.NET. Es decir:
• Connection: Conexión
• Command: Comando
• DataReader: Lector de datos
• DataAdapter: Adaptador de datos
• DataSet: Caché de datos.
Objetos de
Proveedores de Propósito
Datos .NET
Connection
El objeto Connection proporciona conectividad con un origen de datos. Un
adaptador de datos necesita una conexión abierta con un origen de datos para leer
y escribir datos. Por tanto, un adaptador utiliza objetos Connection para
comunicarse con un origen de datos.
ExecuteScalar
Este método devuelve como valor escalar el correspondiente a la primera columna
de la primera fila del conjunto de resultados.
DataReader
DataReader proporciona una secuencia de datos de alto rendimiento, de sólo
lectura y sólo hacia delante, a partir de un origen de datos.
Siempre se debe llamar al método Close cuando haya terminado de usar el objeto
DataReader. Si Command contiene parámetros de salida o valores devueltos, éstos
no estarán disponibles hasta que se cierre el DataReader.
DataAdapter
Utiliza el objeto Connection para enlazar un objeto DataSet con un Proveedor de
Datos. También permite actualizar los Datos en el origen a partir de las
modificaciones hechas en el DataSet.
Generalmente, cada adaptador de datos intercambia datos entre una sola tabla de
un origen de datos y un solo objeto DataTable del conjunto de datos. Si el
conjunto de datos contiene varias tablas de datos, la estrategia habitual consiste en
tener varios adaptadores de datos que le suministren datos y los escriban de nuevo
en tablas individuales del origen de datos.
Para llenar una tabla de un conjunto de datos, se llama a un método adaptador que
ejecute una instrucción SQL o un procedimiento almacenado. El adaptador crea
un objeto lector de datos (DataReader) para leer los datos de un conjunto de datos.
Existe la opción de leer datos de la base de datos sin tener que almacenarlos en un
conjunto de datos, lo que puede ser muy eficiente en situaciones en las que estén
implicados datos de sólo lectura, así como se pueden ejecutar instrucciones SQL
directamente, sin utilizarlas para llenar un conjunto de datos.
De forma similar, cuando se desee actualizar la base de datos, se deberá invocar
un método adaptador que llame a la instrucción SQL o el procedimiento
almacenado adecuados para realizar la actualización real en la base de datos.
Propiedades importantes
• SelectCommand - referencia a un comando (instrucción SQL o nombre
de procedimiento almacenado) que recupera filas del almacén de datos.
DataSet
El objeto DataSet es esencial para la compatibilidad con situaciones de datos
distribuidos desconectados con ADO.NET. El DataSet es una representación de
datos residente en memoria que proporciona un modelo de programación
relacional coherente con independencia del origen de datos.
Se puede utilizar con muchos y distintos orígenes de datos, con datos XML o para
administrar datos locales de la aplicación. El DataSet representa un conjunto
completo de datos que incluye tablas relacionadas y restricciones, así como
relaciones entre las tablas.
Conjunto de datos
Un conjunto de datos es una memoria caché desconectada de registros
recuperados de un origen de datos. Funciona como un almacén virtual de datos:
un conjunto de datos incluye una o más tablas basadas en las tablas de la base de
datos real y puede incluir información acerca de las relaciones entre estas tablas y
las restricciones para los datos que puede contener cada tabla.
Los datos del conjunto de datos suelen ser una versión muy reducida de lo que
hay en la base de datos. Sin embargo, puede trabajar con ellos igual que lo hace
con los datos reales.
Como el conjunto de datos es realmente una copia privada de los datos de la base
de datos, no reflejará necesariamente el estado actual de la base de datos, para ver
los últimos cambios realizados por otros usuarios, se puede actualizar el conjunto
de datos; llamando al método Fill correspondiente.
Una de las ventajas de utilizar conjuntos de datos es que los componentes pueden
intercambiarlos cuando lo necesiten. Por ejemplo, un objeto podría crear y llenar
un conjunto de datos y, a continuación, enviarlo a otro componente en otro punto
de la aplicación para que lo procese. Esta facilidad significa que los componentes
no necesitan consultar la base de datos de forma individual.
DataYiew
DataSet
t
DataSet
DataRow
Colección
DataRow Rows
DataRow
l
DataRow
Colección
DataRow Rows
DataAdapter
! DataRow
Objeto Conexión
En la siguiente ilustración se muestra el modelo de objetos DataSet.
DataSet
OataTableCollectlon
DataTable
Data RowCollect, on
DataVlew
DataRow
ChildRelat,ons
ParentRelat,ons
Constra,nts
DataColum nCollection
Extended Prope rt ,es DataColumn
PrimaryKey
ExtendedProperties
Los métodos y objetos de un DataSet concuerdan con los del modelo de base de
datos relacional:
• DataTableCollection
• DataRelationCollection
• ExtendedProperties
EI't<md �cJP'nID)l�rí:f�§l
El DataSet (así como el DataTable y el DataColumn) tiene una propiedad
ExtendedProperties. ExtendedProperties es un PropertyCollection en el que se
puede colocar información personalizada, como la instrucción SELECT que sirve
para generar el conjunto de resultados, o una marca de fecha y hora de cuándo se
generaron los datos.
La clase de un conjunto de datos con tipo tiene un modelo de objetos en el que las
tablas y las columnas se convierten en objetos de primera clase del modelo de
objetos. Por ejemplo, si se trabaja con un conjunto de datos con tipo, puede hacer
referencia a una columna utilizando código similar al siguiente:
Por el contrario, si se trabaja con un conjunto de datos sin tipo, el código sería:
El acceso con tipo además de ser más legible, es totalmente compatible con
IntelliSense en el editor de código de Visual Studio. El acceso a las tablas y las
columnas de un conjunto de datos con tipo también es algo más rápido en tiempo
de ejecución porque el acceso se determina en tiempo de compilación, no a través
de colecciones en tiempo de ejecución.
Clase DataSet
El DataSet es una clase que presenta las siguientes propiedades, métodos y
eventos:
Propiedades Descripción
CaseSensitive Obtiene o establece un valor que indica si las
comparaciones de cadena en los objetos DataTable
distinguen entre mayúsculas y minúsculas.
Container Obtiene el contenedor del componente.(Se hereda
de MarshalByValueComponent).
DataSetName Obtiene o establece el nombre del objeto DataSet
actual.
DefaultViewManager Obtiene una vista personalizada de los datos
incluidos en DataSet, lo que permite filtrar, buscar y
desplazarse mediante un DataViewManager
personalizado.
Propiedades Descripción
DesignMode Obtiene un valor que indica si el componente está
actualmente en modo de diseño.(Se hereda de
MarshalByValueComponent).
EnforceConstraints Obtiene o establece un valor que indica si se siguen
las reglas de restricción al intentar realizar cualquier
operación de actualización.
ExtendedProperties Obtiene la colección de la información
personalizada del usuario asociada a DataSet.
HasErrors Obtiene un valor que indica si hay errores en alguno
de los objetos DataTable de este DataSet.
Islnitialized Obtiene un valor que indica si el objeto DataSet
está inicializado.
Locale Obtiene o establece la información de configuración
regional que se utiliza para comparar cadenas de la
tabla.
Namespace Obtiene o establece el espacio de nombres del
objeto DataSet.
Prefix Obtiene o establece un prefijo XML que crea alias
para el espacio de nombres del objeto DataSet.
Relations Obtiene la colección de relaciones que vincula las
tablas y permite el desplazamiento desde las tablas
primarias a las secundarias.
RemotingFormat Obtiene o establece una enumeración
SerializationFormat para el objeto DataSet utilizado
durante el funcionamiento remoto.
SchemaSerializationMode Obtiene o establece una enumeración
SchemaSerializationMode para un objeto DataSet.
Site Reemplazado. Obtiene o establece una interfaz
System.ComponentModel.ISite para el objeto
DataSet.
Tables Obtiene la colección de tablas incluidas en DataSet.
Métodos Descripción
AcceptChanges Confirma todos los cambios realizados en este DataSet
desde que se ha cargado o desde la última vez que se ha
llamado a AcceptChanges.
Beginlnit Activa la inicialización de un objeto DataSet que se
emplea en un formulario o que utiliza otro componente. La
inicialización se produce en tiempo de ejecución.
Clear Borra cualquier dato de DataSet mediante el
procedimiento de quitar todas las filas de todas las tablas.
Métodos Descripción
Clone Copia la estructura de DataSet, incluidos todos los
esquemas, relaciones y restricciones de DataTable. No
copia ningún dato.
Copy Copia la estructura y los datos para este objeto DataSet.
CreateDataReader Sobrecargado. Devuelve un objeto DataTableReader con
un conjunto de resultados por cada DataTable, siguiendo la
misma secuencia con la que aparecen las tablas en la
colección Tables.
Dispose Sobrecargado. Libera los recursos utilizados por la clase
MarshalByValueComponent. (Se hereda de
MarshalByValueComponent).
Endlnit Finaliza la inicialización de un control DataSet que se
emplea en un formulario o que utiliza otro componente. La
inicialización se produce en tiempo de ejecución.
Equals Sobrecargado. Determina si dos instancias de Object son
iguales. (Se hereda de Object).
GetChanges Sobrecargado. Obtiene una copia del objeto DataSet que
contiene todos los cambios que se le han realizado desde la
última vez que se cargó o desde que se llamó a
AcceptChanges.
GetDataSetSchema
GetHashCode Sirve como función hash para un tipo concreto.
GetHashCode es apropiado para su utilización en
algoritmos de hash y en estructuras de datos como las
tablas hash. (Se hereda de Object).
GetObjectData Rellena un objeto de información de serialización con los
datos necesarios para serializar la clase DataSet.
GetService Obtiene el implementador de IServiceProvider. (Se hereda
de MarshalByValueComponent).
GetType Obtiene el objeto Type de la instancia actual. (Se hereda
de Object).
GetXrnl Devuelve la representación XML de los datos
almacenados en DataSet.
GetXrnlSchema Devuelve el esquema XML para la representación XML de
los datos almacenados en DataSet.
HasChanges Sobrecargado. Obtiene un valor que indica si DataSet
presenta cambios, incluyendo filas nuevas, eliminadas o
modificadas.
InferXrnlSchema Sobrecargado. Aplica el esquema XML al DataSet.
Load Sobrecargado. Rellena un objeto DataSet con valores de
un origen de datos utilizando la interfaz IDataReader
proporcionada.
Métodos Descripción
Merge Sobrecargado. Combina el objeto DataSet, el objeto
DataTable o la matriz de objetos DataRow que se
especifique en el objeto DataSet o DataTable actual.
ReadXml Sobrecargado. Lee esquema y datos XML en el objeto
DataSet.
ReadXmlSchema Sobrecargado. Lee un esquema XML en el DataSet.
ReferenceEquals Determina si las instancias de Object especificadas son la
misma instancia. (Se hereda de Object).
RejectChanges Deshace todos los cambios realizados en el DataSet desde
que se ha creado o desde que se ha llamado por última vez
a DataSet.AcceptChanges.
Reset Restablece el estado original del objeto DataSet. Las
subclases deben reemplazar a Reset para restaurar el
estado original de un DataSet.
ToString Devuelve una String que contiene el nombre de la clase
Component si la hay. Este método no debe reemplazarse.
(Se hereda de MarshalByValueComponent).
WriteXml Sobrecargado. Escribe datos XML y, de forma opcional, el
esquema del DataSet.
WriteXmlSchema Sobrecargado. Escribe la estructura del DataSet como un
esquema XML.
Eventos Descripción
Disposed Agrega un controlador de eventos para escuchar el evento
Disposed en el componente.(Se hereda de
MarshalByValueComponent).
Initialized Se produce después de inicializar DataSet.
MergeFailed Se produce cuando unos DataRow de origen y de destino
tienen el rmsmo valor de clave principal y
EnforceConstraints se establece en true.
Elegir un DataReader o un DataSet
A la hora de decidir si su aplicación debe utilizar un DataReader o un DataSet,
debe tener en cuenta el tipo de funcionalidad que su aplicación requiere. Use un
DataSet para hacer lo siguiente:
ADO.NET y XML
XML
El Lenguaje de marcado extensible (XML) proporciona una forma de describir
datos estructurados. A diferencia de las etiquetas HTML, que se utilizan
básicamente para controlar la presentación y apariencia de los datos, las etiquetas
XML se utilizan para definir la estructura y los tipos de datos de los propios datos.
• Al igual que HTML, XML no hace nada más. Mientras que es posible
utilizar las etiquetas XML para describir la estructura de un elemento
como un pedido, este lenguaje no contiene ningún código que se pueda
utilizar para enviar ese pedido, procesarlo o asegurarse de que está
completo. Otras personas deben escribir código para hacer realmente estas
cosas con sus datos en formato XML.
UsosdeXML
XML es una forma extremadamente flexible de transferir datos. A continuación se
presentan ejemplos donde se puede utilizar XML:
• Un documento normal.
• Los formatos XML se basan en texto, que lo hacen más legible, fácil de
documentar y, a veces, más fácil de depurar.
Incluso existen mecanismos de enlace de datos que se pueden utilizar junto con
hojas de estilos para organizar datos XML en una presentación visual y para
agregar interactividad.