Académique Documents
Professionnel Documents
Culture Documents
mayo, 2005
Abstract
This document is about the Microsoft’s new way to Data Access, ADO.NET; and an historical
reference to Data Access.
Moreover, it includes a brief introduction to the .NET Platform and the .NET Framework
from Microsoft,
-1-
Acceso a Datos con ADO.NET
Veamos como se lleva a cabo el desarrollo de una aplicación bajo .NET Framework:
Windows 2000 fue un punto de inflexión en cuanto al acceso a datos se refiere, ya que a
partir de ese momento era el propio sistema operativo el que incorporaba los mecanismos
necesarios para acceder a bases de datos.
Se fundamentó en básicamente dos cosas:
- Controladores OLE DB (para distintos sistemas RDBMS -Relational Database
Management System-)
- ADO (ActiveX Data Objects) que proporcionaba una interfaz de alto nivel para
comunicarse con los controladores anteriores.
La llegada de la plataforma .NET trajo consigo una evolución en los mecanismos de acceso
a datos, donde ADO dejó paso a ADO.NET, un modelo de objetos mas avanzado que no
necesita mantener una conexión continua con el sistema RDBMS.
Gráficamente:
3. ADO.NET
ADO.NET constituye la interfaz fundamental de las aplicaciones para proporcionar servicios de
acceso a datos en la plataforma Microsoft .NET, donde existen, básicamente, dos elementos:
¾ El conjunto de datos desconectado: permiten al usuario trabajar con los datos de una
forma desconectada (System.Data.DataSet). La representación interna de los
datos del DataSet utiliza XML, por lo que el flujo de datos transferido es independiente
de lenguaje y plataforma.
¾ Unos proveedores que facilitan la ejecución de operaciones contra un sistema RDBMS.
Actualmente están disponibles en .NET Framework 1.1:
- Proveedor de datos de .NET Framework para SQL Server
- Proveedor de datos de .NET Framework para OLE DB
- Proveedor de datos de .NET Framework para ODBC
- Proveedor de datos de .NET Framework para Oracle
Esquema de funcionamiento básico: se utilizará uno de los adaptadores para conectar con
el RDBMS recuperando un conjunto de datos y cerrando la conexión. Ese conjunto, que sería un
objeto DataSet, puede ser transferido entre aplicaciones y puede operarse sobre él como si
fuera una base de datos. Por último, se restablecerá la conexión usando el proveedor anterior y
enviando al RDBMS las actualizaciones realizadas.
3.2. Características
¾ ADO.NET no depende de conexiones continuamente activas.
Las aplicaciones se conectan a la base de datos sólo durante el tiempo necesario para
extraer o actualizar los datos. La base de datos ya no contiene conexiones que la mayor
parte del tiempo permanecen inactivas, así que puede dar servicio a muchos más usuarios.
¾ Las interacciones con la base de datos se realizan mediante comandos de datos.
Para efectuar operaciones en una base de datos, se ejecutan instrucciones SQL o
procedimientos almacenados (que incluyen instrucciones SQL).
En ADO.NET los comandos de datos se usan para empaquetar las instrucciones SQL o
los procedimientos almacenados. Por ejemplo, si se desea leer un conjunto de filas de una
base de datos, se crea un comando de datos y se configura con el texto de una instrucción
SQL Select o con el nombre del procedimiento almacenado que recupera registros.
¾ Los datos se pueden almacenar en memoria caché en conjuntos de datos (DataSet)
Ya que sólo son contenedores; se llenan con comandos SQL o procedimientos
almacenados que se ejecutan desde un adaptador de datos.
¾ Los conjuntos de datos son independientes de los orígenes de datos
Dado que un conjunto de datos no está sujeto directamente a un origen de datos, resulta
un buen punto de integración para datos procedentes de múltiples orígenes.
¾ Los datos se conservan como XML
Los datos deben moverse desde el almacén de datos hasta el conjunto de datos y de ahí
a diversos componentes. En ADO.NET, el formato de transferencia de datos es XML. En
consecuencia, si es necesario conservar datos (por ejemplo, en un archivo), se almacenarán
como XML. Si se tiene un archivo XML, se puede utilizar como cualquier otro origen de
datos y crear un conjunto de datos a partir de él.
No es necesario saber XML para utilizar datos en ADO.NET, ya que convierte
automáticamente los datos a XML y viceversa según sea preciso; así que se interactúa con
los datos utilizando métodos de programación ordinarios.
¾ Las estructuras de datos están definidas por esquemas
Los conjuntos de datos se representan como XML. La estructura del conjunto de datos,
es decir, la definición de las tablas, columnas, tipos de datos, restricciones, etc. que se
encuentran en el conjunto de datos, se define por medio de un esquema XML basado en el
lenguaje de definición de esquemas XML (XSD).
Los esquemas pueden ser generados y actualizados por Visual Studio .NET según sea
necesario, o manualmente.
3.3. Arquitectura
La siguiente ilustración muestra los componentes principales de una aplicación ADO.NET
¾ DataSets
¾ Proveedores administrados
1
BIZTALK.- BizTalk Server 2004 es un producto de Windows Server System que permite a los clientes
integrar sistemas, empleados y asociados comerciales con más eficacia y rapidez que nunca.
Los métodos y objetos contenidos en un DataSet son coherentes con los del modelo de
base de datos relacional.
3.4.1 La DataTableCollection
Un DataSet de ADO.NET contiene una colección de cero o más tablas representadas por
objetos DataTable. La DataTableCollection contiene todos los objetos DataTable
de un DataSet.
Un DataTable se define en el espacio de nombres System.Data y representa una
única tabla de datos residentes en memoria. Contiene una colección de columnas representadas
por una DataColumnCollection y restricciones representadas por una
ConstraintCollection que, juntas, definen el esquema de la tabla. Un DataTable
también contiene una colección de filas representadas por la DataRowCollection, que
contiene los datos de la tabla. Junto con su estado actual, un DataRow conserva tanto la versión
original como la actual para identificar los cambios realizados en los valores almacenados en la
fila.
3.4.2 La DataRelationCollection
Un DataSet contiene relaciones en su objeto DataRelationCollection. Una relación,
representada por el objeto DataRelation, asocia las filas de un DataTable con las filas de
otro DataTable. Es análogo a una ruta de unión que podría existir entre las columnas de
claves externas y principales en una base de datos relacional. Un DataRelation identifica
columnas coincidentes en dos tablas de un DataSet.
Las relaciones permiten pasar de una tabla a otra dentro de un mismo DataSet. Los
elementos esenciales de un DataRelation son el nombre de la relación, el nombre de las
tablas relacionadas y las columnas relacionadas de cada tabla. Se pueden establecer relaciones
con más de una columna por tabla, para lo que debe especificar una selección de objetos
DataColumn como columnas clave. Cuando se agrega una relación al
DataRelationCollection, se puede agregar también un UniqueKeyConstraint y
un ForeignKeyConstraint para imponer restricciones de integridad cuando se realicen
cambios en los valores de las columnas relacionadas.
3.4.3 ExtendedProperties
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 colección ExtendedProperties se conserva con la información del esquema del
DataSet (así como el DataTable y el DataColumn).
3.4.4 Clasificación
Los conjuntos de datos pueden tener tipo o no.
¾ Un conjunto de datos con tipo se deriva en primer lugar de la clase base DataSet y, a
continuación, utiliza la información de un archivo de esquema XML (archivo .xsd) para
generar una clase nueva. La información del esquema (tablas, columnas, etc.) se genera y
compila en esta nueva clase de conjunto de datos como un conjunto de objetos y
propiedades de primera clase. Dado que una clase DataSet con tipo hereda de la clase
base DataSet, la clase con tipo asume toda la funcionalidad de la clase DataSet y
puede utilizarse con métodos que toman como parámetro una instancia de una clase
DataSet.
¾ Por el contrario, un conjunto de datos sin tipo no tiene el esquema integrado
correspondiente. Al igual que un conjunto de datos con tipo, un conjunto de datos sin tipo
contiene tablas, columnas, etc., pero sólo se exponen como colecciones. No obstante,
después de crear manualmente las tablas y otros elementos de datos de un conjunto de datos
sin tipo, se puede exportar la estructura del conjunto de datos en forma de esquema por
medio del método WriteXmlSchema del conjunto de 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:
2
Dependiendo del proveedor de datos utilizado, sustitúyase “xxx” por: Sql, OleDb, Odbc, OrecleClient o el
que corresponda.
Ejemplos De Conexión
3
Requiere la instalación de MySQL® Connector/Net
Connection.Open();
MySqlDataReader Lector = Comando.ExecuteReader();
Lector.Close();
Connection.Close();
¾ ExecuteNonQuery
Se utiliza para ejecutar comandos que no devuelven filas (realizar operaciones en la base de
datos y modificar datos).
Mediante un proveedor de datos de .NET Framework se puede ejecutar procedimientos
almacenados o instrucciones de DDL (CREATE TABLE…) para manipular los esquemas de
una base de datos o catálogo. El objeto Command proporciona un método
ExecuteNonQuery para procesarlos.
Además de para modificar esquemas, este método se puede usar también para procesar
instrucciones SQL que modifican datos sin devolver ninguna fila, como INSERT, UPDATE y
DELETE.
El método ExecuteNonQuery devuelve un entero que representa el número de filas que
se ven afectadas por la instrucción o por el procedimiento almacenado que se haya ejecutado
Ejemplo para realizar operaciones de catálogo
Connection.Open();
Comando.ExecuteNonQuery();
Comando.CommandText="insert into latabla values "+
"(\"123456\",\"yomismo\")";
Comando.ExecuteNonQuery();
Connection.Close();
Los métodos Fill y Update abren de forma implícita el objeto Connection que
utiliza el DataAdapter cuando determina que esa conexión no está abierta. Cuando uno de
los métodos ha abierto la conexión, el mismo método la cierra cuando termina de usarla. Este
hecho simplifica el código cuando se trata de una operación única. Sin embargo, en el caso de
que se estén realizando múltiples operaciones que necesiten tener abierta una conexión, se
puede mejorar el rendimiento de la aplicación si se llama explícitamente al método Open de
Connection, se realizan a continuación las operaciones en el origen de datos y, finalmente, se
llama al método Close de Connection.
MySqlCommand selectCMD =
new MySqlCommand("SELECT * from plants", Connection);
Ejemplo CommandBuilder
4
La clase DataRow, que se utiliza para manipular registros individuales, incluye la propiedad RowState, cuyos
valores indican si la fila cambió, y de qué modo, desde que la tabla de datos se cargó por primera vez desde la base de
datos. Entre los posibles valores se encuentran Deleted, Modified, New y Unchanged. El método Update
examina el valor de la propiedad RowState para determinar qué registros deben escribirse en la base de datos y qué
comando específico de la base de datos (agregar, editar, eliminar) debe invocarse.
fila[0]="nombre comun";
fila[1]="nombre latino";
fila[2]=100; //id
fila[3]="nombre catalogo";
tabla.Rows.Add(fila);
MySqlCommandBuilder comandos = new MySqlCommandBuilder(da);
Connection.Open();
Console.WriteLine("Comando...:\n"+
comandos.GetInsertCommand().CommandText+"\n");
da.Update(dat,"Plantas");
Connection.Close();
Comando...:
INSERT INTO `plants` (`CommonName`, `LatinName`, `TypeID`, `CatalogsNew_ID`)
VALUES (?CommonName, ?LatinName, ?TypeID, ?CatalogsNew_ID);
SELECT `CommonName`, `LatinName`, `TypeID`, `CatalogsNew_ID` FROM `plants`
WHERE (`CommonName`=?CommonName)
NOTA: El símbolo ‘?’ mostrado es utilizado para el trabajo con parámetros, a continuación este
ejemplo ilustrará de forma práctica el uso de parámetros
da.UpdateCommand =
new MySqlCommand("UPDATE plants SET LatinName=?LatinName "+
"WHERE TypeID=100" , Connection);
dat.Tables["Plantas"].Rows[0]["LatinName"]="plantus silvestris";
da.Update(dat,"Plantas");
4. Conclusiones
ADO.NET ofrece varias ventajas sobre las anteriores versiones de ADO y sobre otros
componentes de acceso a datos. Estas ventajas se incluyen en las siguientes categorías:
¾ Interoperabilidad
Cualquier componente que pueda leer XML podrá procesar los datos, así 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.
¾ Programabilidad
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 y Escalabilidad.
Dado que se puede trabajar en modo desconectado, el rendimiento en las aplicaciones
se ve notablemente aumentado, sobre todo en aquellas que tengan una carga elevada de
transacciones.
Por lo tanto ADO.NET anima a los programadores a ahorrar recursos limitados. Las
aplicaciones ADO.NET utilizan un acceso desconectado a los datos, por lo que no retienen
bloqueos ni conexiones activas con bases de datos durante largos periodos de tiempo lo que
facilita enormemente la escalabilidad ya que una aplicación Web no funcionará igual con
unos pocos usuarios que con cientos de ellos.
5. Bibliografía
[1] Charte Ojeda F. “Visual C# .NET”. EDICIONES ANAYA MULTIMEDIA, 2002.
[2] Sceppa D. “Microsoft ADO.NET”. MICROSOFT PRESS, 2002.
[3] Skinner J, et al. “Professional ADO.NET Programming”. WROX PRESS, 2001.
[4] Riordan R. “Microsoft ADO .NET Step by Step., MICROSOFT PRESS, 2002
[5] Chand M. “A Programmer’s Guide to ADO.NET in C#”. APRESS, 2002.
[6] Beauchemin B. “Essential ADO.NET“. ADDISON WESLEY, 2002.
[7] Joubert T. “ADO .NET Programming”. WORDWARE PUBLISHING, 2003
[8] “Programming with ADO.NET, Delivery Guide”. MSDN TRAINNING, 2001.
[9] Price J. “Mastering C# Database Programming”. SYBEX, 2003.
[10] Hamilton B. “ADO.NET Cookbook”. O’REILLY, 2003.
[11] Deitel. “C# How To Program”. PRENTICE HALL, 2002
[12] Kimmel P. “Advanced C# Programming”. MCGRAW-HILL, 2002.
6. Enlaces
¾ http://www.ciberteca.net/articulos/programacion/net/default.asp Análisis comparativo entre
Microsoft® .NET y Sun® J2EE
¾ http://www.microsoft.com/spanish/msdn/netframework/productinfo/overview.asp
Información general sobre .NET de Microsoft.
¾ http://www.desarrolloweb.com/articulos/1328.php?manual=48 Arquitectura básica de la
plataforma .Net. Descripción del Framework y sus principales componentes: Lenguajes,
biblioteca de clases y CLR.
¾ http://www.gratisweb.com/jesus_gonzales/NetFrmework.htm Más información sobre .NET
Framework.
¾ http://www.microsoft.com/Net/Basics.aspx Página oficial de .NET.
¾ http://communities.microsoft.com/newsgroups/default.asp?icp=Latam&slcid=es&Newsgro
up=microsoft.public.es.ado Comunidad hispana de ADO.NET.
¾ http://www.elguille.info/NET/ Información de elguille (uno de los más conocidos MVP de
Microsoft) sobre .NET Framework y lenguajes punto NET.
¾ http://www.c-sharpcorner.com/ Una de las páginas más completas sobre C#
¾ http://www.microsoft.com/spanish/msdn/spain/default.asp Página de desarrollo con
herramientas de Microsoft.