Está en la página 1de 57

Marco Besteiro y Miguel Rodrguez ADO.

NET
1/57
ADO.NET

Introduccin
ADO .NET responde a las siglas de Microsoft ActiveX Data Objects de la plataforma .NET, y
es una mejora evolutiva de la tecnologa ADO. Realmente es una evolucin ms en las
tecnologas de acceso a la informacin.
En este captulo se comparan las tecnologas ADO y ADO.NET, se describen y detallan los
objetos ms importantes de la tecnologa, el objeto Dat aSet y los proveedores de acceso a
datos. Se profundizar sobre el objeto Dat aSet describiendo los objetos Dat aTabl e,
Dat aCol umn, etc. En cuanto a los proveedores de acceso a datos se describir el proveedor
para SQL Server y el proveedor para OLE DB.
Requisitos de la plataforma ADO.NET
Para utilizar los proveedores de datos de SQL Server .NET y OLE DB .NET se necesita la
instalacin de la versin 2.6 o superior de Microsoft Data Access Components. Para utilizar
ADO.NET en las aplicaciones se ha de incluir el namespace Syst em. Dat a.
Desde DAO hasta ADO
Hace varios aos naci un API (Application Programming Interface) llamado ODBC (Open
Database Connectivity) diseado para proporcionar acceso a un amplio rango de orgenes de
datos. Un origen de datos consiste bsicamente en los datos asociados a un sistema de gestin
de bases de datos, la plataforma en la que este sistema existe y la red usada para acceder a
dicha plataforma.
Poco tiempo despus apareci la primera interfaz orientado a objetos llamado DAO (Data
Access Objects) que utilizaba el motor de bases de datos J ET de Microsoft -utilizado por MS-
Access- y que permita a los programadores de Visual Basic conectar directamente a tablas de
Access y a otras bases de datos a travs de ODBC. Esta interfaz proporcionaba a los
programadores una forma muy sencilla de trabajar con la informacin almacenada en las
diferentes bases de datos. Es entonces cuando aparecen los objetos Wor kspace, Dat abase y el
famoso Recor dset que los desarrolladores utilizaban para crear aplicaciones cliente-servidor.
DAO era muy eficiente para bases de datos en local, o pequeos desarrollos, pero para
aplicaciones distribuidas las prestaciones disminuan conforme se aumentaba el nmero de
usuarios o la complejidad de las aplicaciones.
Por este motivo, apareci posteriormente otra tecnologa llamada RDO (Remote Data Objects)
que es una interfaz de acceso a datos orientada a objetos para ODBC. Tambin es fcil de usar
como DAO, pero es limitado ya que no funciona muy bien con el J et o ISAM, y slo puede
acceder a bases de datos relacionales a travs de drivers ODBC existentes. Pero por otro lado,
permite a los desarrolladores acceder a los procedimientos almacenados y a consultas ms
complejas. Adems es mucho ms eficaz para aplicaciones complejas y con mltiples accesos
simultneos. Los objetos ms utilizados en esta tecnologa son Envi r oment , Connect i on y
Resul t set .
Marco Besteiro y Miguel Rodrguez ADO.NET
2/57
Durante un tiempo convivan ambas tecnologas: DAO para aplicaciones sencillas o locales y
RDO para aplicaciones distribuidas. Uno de los problemas que tena la tecnologa RDO es que
el lenguaje SQL con el que se accede a la informacin debe de ser el que entienda el sistema
de gestin de bases de datos correspondiente. Por ejemplo, si se desarrolla contra SQL Server,
se debe utilizar sentencias T-SQL -lenguaje SQL propio para SQL Server- y si se programa
contra Oracle se debe utilizar sentencias PL/SQL -lenguaje SQL propio para Oracle-, y
aunque T-SQL y PL/SQL se basan en SQL estndar, tienen pequeas diferencias que pueden
hacer que una aplicacin cliente-servidor que utilice RDO no funcione en otro sistema de
gestin de bases de datos.
Con DAO no exista este problema y debido a este hecho, a otras circunstancias y sobre todo a
la aparicin de COM, el estndar ODBC evolucion a OLE DB. OLE DB es un conjunto de
interfaces basadas en COM que exponen los datos desde una gran variedad de orgenes de
datos. Posteriormente surgi la tecnologa ADO (ActiveX Data Objects) que se apoya en OLE
DB y que es una interfaz que recoge lo mejor de las dos tecnologas anteriores, incorporando
adems otras mejoras.
Los objetos ms importantes de la tecnologa ADO son el objeto Recor dSet , el objeto
Command y el objeto Connect i on.
Connection
Fields
Recordset
Error
Parameters
Command
Errors
Field
Parameter

Figura 24.1. Diagrama de Objetos de ADO

ADO.NET frente a ADO
En esta seccin se describen ambas tecnologas haciendo hincapi en las diferencias
existentes.
ADO
La tecnologa ADO es una capa COM sobre OLE DB de tal manera que las aplicaciones que
utilicen esta tecnologa de acceso a datos invocan a los objetos de ADO sin tener que conocer
en absoluto el estndar OLE DB. Es una tecnologa que se utiliza de manera sencilla desde
Visual Basic o desde ASP, pero no est pensada para Visual C++y otros lenguajes.
Marco Besteiro y Miguel Rodrguez ADO.NET
3/57
Base de Datos
OLE DB
ADO
Recordset
Cliente ADO
(Visual Basic, ASP,etc.)
ODBC

Figura 24.2. Arquitectura ADO.
El objeto clave dentro de ADO es el Recor dset que tiene como principales ventajas su
potencia y sencillez. Con este objeto se pueden utilizar cursores de cliente y cursores de
servidor. Por otro lado, aunque puede trabajar desconectado de la fuente de datos, no est
pensado para trabajar de ese modo, con lo cual se consiguen implementaciones menos
eficaces de lo que caba esperar. ADO est pensado para trabajar en aplicaciones tipo cliente-
servidor en los que el Recor dset est conectado a una fuente de datos y no para arquitecturas
con varias capas en las que las prestaciones del Recor dset disminuyen.
ADO.NET
La tecnologa ADO.NET -en la versin beta 1 se llamaba ADO+- es un modelo de proveedor
ms sencillo que el par OLEDB / ADO y se integra perfectamente con XML. ADO.NET es la
evolucin de ADO en la nueva plataforma .NET. Tiene la misma filosofa pero se ha
modificado el modelo.
Las principales caractersticas de ADO.NET son:
Trabaja desconectado del origen de datos que se utilice.
Tiene una fuerte integracin con XML y ASP .NET.
El uso de ADO.NET es independiente del lenguaje de programacin que se utilice.
Por otra parte se ha demostrado que los niveles de trasferencia de informacin con ADO.NET
que utiliza XML, son tan buenos como los niveles que alcanza ADO utilizando COM.
Marco Besteiro y Miguel Rodrguez ADO.NET
4/57
Base de Datos
SQL Server
ADO.NET
Aplicacin .NET
Managed Providers
OLE DB ....
DataSet DataReader
WinForms
WebForms
Web Services

Figura 24.3. Arquitectura de ADO.NET
La tecnologa ADO .NET esta basada en un nuevo modelo de componentes en la que las
clases de acceso a datos y las clases contenedores forman parte del marco de trabajo de .NET.
Sobre todo ADO.NET est pensado para interoperar con otros componentes, sistemas, etc.
gracias al uso de XML y a soportar estndares como HTTP, XML o SOAP.
El modelo de ADO.NET est dividido en dos grupos:
Los proveedores de datos o Managed Data Providers.
Los contenedores de datos, que aunque estn vinculados a los orgenes de datos, son
independientes de ellos.
En la siguiente tabla se comparan ambas tecnologas con ms detalle.
Caracterstica ADO ADO.NET
Representacin de
datos residente en
memoria.
Utiliza el objeto Recor dSet ,
cuyo aspecto es como una
simple tabla.
Utiliza el objeto Dat aSet , que
puede contener una o ms tablas
representadas por los objetos
Dat aTabl e.
Relaciones entre
varias tablas.
Requiere la unin de varias
tablas para mostrar finalmente
una simple tabla respuesta
Soporta el objeto
Dat aRel at i on para asociar filas
en un objeto Dat aTabl e con
filas de otro objeto Dat aTabl e.
Recorrido de los La navegacin por las filas Utiliza una forma no secuencial
Marco Besteiro y Miguel Rodrguez ADO.NET
5/57
datos. del Recor dSet se realiza de
forma secuencial.
de navegacin para acceder a
las filas de una tabla. Utiliza las
relaciones para navegar desde
filas de una tabla a las
correspondientes filas de otra
tabla.
Acceso desconectado El objeto Recor dSet posee
esta caracterstica pero el uso
habitual es mediante accesos
conectados, representados por
el objeto Connect i on. La
comunicacin con la base de
datos se realiza mediante
llamadas al proveedor de
datos OLE DB.
Se comunica con la base de
datos mediante llamadas
estndares al objeto
Dat aAdapt er , el cual se
comunica con el proveedor de
datos OLE DB, o directamente
a SQL Server.
Cursores Utiliza tanto cursores de
servidor como cursores del
lado cliente.
Como la arquitectura es
desconectada los cursores no
son aplicables.
Programabilidad Utiliza el objeto Connect i on
para trasmitir los comandos
que tratan la estructura de
datos que subyace de una
fuente de datos
Usa XML. Los datos se
describen a s mismos porque
los nombres de las etiquetas del
cdigo corresponden a
problemas del mundo real
solucionados por el cdigo. Las
estructuras de datos como
tablas, filas y columnas no
aparecen haciendo que el
cdigo sea ms fcil de leer y
escribir.
Compartir datos
desconectados entre
capas y
componentes.
Utiliza COM mar shal l i ng
para trasmitir un Recor dset
desconectado. Soporta
solamente tipos de datos
definidos por el estndar
COM. Requiere conversiones
de tipo que necesitan recursos
del sistema.
Trasmite un Dat aSet mediante
XML y este formato no tiene
restricciones en los tipos de
datos y no se requiere
conversiones de tipo.
Trasmitir datos a
travs de Firewalls.
Problemtico, porque los
firewalls suelen estar
configurados para prevenir
peticiones a nivel de sistema,
como por ejemplo COM
mar shal l i ng.
Soportado, porque los objetos
Dat aSet de ADO.NET utilizan
XML que puede pasar a travs
de un Firewall.
Escalabilidad Los bloqueos de la base de
datos y las conexiones activas
de la base de datos para las
duraciones largas generan un
El acceso desconectado a los
datos de la base de datos sin los
bloqueos de retencin de la base
de datos o las conexiones
Marco Besteiro y Miguel Rodrguez ADO.NET
6/57
problema en caso de recursos
limitados de la base de datos
activas de la base de datos por
perodos muy largos limita el
problema de los recursos
limitados de la base de datos

En resumen: el problema no est en elegir entre ADO.NET y ADO. El problema radica en la
eleccin de .NET como plataforma de desarrollo. Si es as, entonces ADO.NET es la eleccin
correcta.
Namespaces
ADO .NET se basa en los siguientes espacios de nombres de accesos a datos:
Syst em. Dat a, que proporciona las clases de acceso a datos generales.
Syst em. Dat a. Common, que contiene las clases compartidas por los proveedores de datos.
Syst em. Dat a. Ol eDb, que almacena las clases del proveedor de datos OLE DB.
Syst em. Dat a. Sql Cl i ent , que expone las clases del proveedor de datos para SQL Server.

Que es un Managed Provider ?
El Managed Provider o .NET Managed Data Provider o simplemente .NET Data Provider es
el proveedor de datos de la plataforma .NET que permite conectar a un origen de datos con
una aplicacin para recuperar y modificar informacin. Tambin este proveedor sirve de
puente entre el origen de datos y el objeto ms importante de ADO.NET, el Dat aSet que se
ver ms adelante.
Los proveedores de datos en la plataforma .NET ofrecen una arquitectura de acceso a datos
ms simple, con caractersticas mejoradas y exponen directamente su comportamiento
especfico a los consumidores. Adems tienen un conjunto de interfaces mucho ms pequeo
que los proveedores OLE DB, y no requieren de la tecnologa COM.
Los Managed Providers acceden al objeto Dat aSet a travs de la implementacin del
interface I Dat aAdapt er (ver figura 24.4). Por otro lado acceden al origen de datos de forma
conectada a travs de objetos Connect i on, Command o Par amet er , y proporcionan a su vez
acceso a datos en forma desconectada. Los resultados obtenidos del origen de datos, pueden
ser procesados directamente a travs del objeto Dat aReader correspondiente, o depositados en
un objeto Dat aSet para su posterior uso.
Modelo Comn
ADO.NET presenta un modelo comn para los objetos .NET Data Provider de tal forma que
se pueda codificar independientemente del proveedor de datos .NET elegido.
Marco Besteiro y Miguel Rodrguez ADO.NET
7/57
.NET Framework
Orgen de Datos
Base de Datos
API de acceso a Datos de bajo Nivel
Proveedor .NET
IDataReader
IDBCommand
DataSet
Aplicacin .NET
IDataAdapter

Figura 24.4. Arquitectura de los Managed Pr ovi der s
Las interfaces generales, que independientemente del proveedor, se pueden utilizar con los
proveedores de datos en la plataforma .NET son:
I DBConnect i on
Representa la conexin en una nica sesin con un origen de datos determinado
I DBTr ansact i on
Representa una transaccin en local.
I DBCommand
Representa un comando que se ejecuta cuando est conectado a un origen de datos.
I Dat aPar amet er
Permite implementar un parmetro en un comando.
I Dat aReader
Lee un conjunto de datos de solo lectura y forward-only de un origen de datos
I Dat aAdapt er * Se encarga de rellenar y de resolver los conflictos del DataSet con el origen de
datos.
I DBDat aAdapt er
Suministra los mtodos de ejecucin tpicos para operar con bases de datos (insert,
update, select y delete)
* En cualquier caso slo el IDataAdapter es necesario.
Marco Besteiro y Miguel Rodrguez ADO.NET
8/57
El siguiente ejemplo trabaja utilizando el mismo cdigo con ambos proveedores: SQL Server
.NET Data Provider y OLE DB .NET Data Provider, es decir, funciona independientemente
de que el objeto Connect i on (Obj Cnn) represente una conexin a un SQL Server .NET Data
Provider o a un OLE DB .NET Data Provider.
I DbCommand obj Cmd = obj Cnn. Cr eat eCommand( ) ;
obj Cmd. CommandText = " SELECT * FROM Empl oyees" ;
I Dat aReader obj DR = obj Cmd. Execut eReader ( ) ;

whi l e obj DR. Read( )
Consol e. Wr i t eLi ne( " {0}\ t {1}" , obj DR. Get St r i ng( 0) , obj DR. Get St r i ng( 1) ) ;

.NET Data Providers
ADO.NET puede acceder a la informacin de la base de datos solamente a travs de los
servicios de los managed providers. Se recomienda utilizar los managed providers nativos
siempre que se pueda. ADO.NET cuenta con los siguientes proveedores para los diferentes
orgenes de datos:
Managed Provider para SQL Server 7.0 y SQL Server 2000
Managed Provider para proveedores OLE DB
Para utilizar los proveedores de acceso a datos de .NET debe utilizarse el namespace
correspondiente:
Syst em. Dat a. Sql Cl i ent para SQL Server 7.0 o SQL Server 2000
Syst em. Dat a. Ol eDb para proveedores OLE DB
Marco Besteiro y Miguel Rodrguez ADO.NET
9/57
.NET Framework
Orgen de Datos
SQL Server
API Interno de SQL Server
Proveedor .NET
SqlDataReader
SqlCommand
DataSet
Aplicacin .NET
SqlDataAdapter
.NET Framework
Orgen de Datos
Base de Datos
OLE DB Provider para el origen de datos
Proveedor .NET
OleDbDataReader
OleDbCommand
DataSet
Aplicacin .NET
OleDbDataAdapter

Figura 24.5. Managed Providers para SQL Server y para OLE DB
SQL Server .NET Data Provider
Este proveedor de acceso a datos utiliza su propio protocolo para comunicarse con SQL
Server. Accede a los datos sin necesidad de aadir una capa OLE DB o una capa ODBC.
Se recomienda utilizar este proveedor tanto para aplicaciones cliente-servidor como para
aplicaciones con varias capas frente a SQL Server 7.0 o superior o frente a MSDE (Microsoft
Data Engine). Aunque se puede usar el proveedor de datos OLE DB .NET para SQL Server
para acceder al origen de datos, no se recomienda su utilizacin ya que el proveedor SQL
Server .NET utiliza el API interno de SQL Server, haciendo mucho ms eficaz al proveedor.
Para el caso de versiones inferiores a la 7.0 es necesario utilizar el proveedor de datos OLE
DB .NET que requiere la instalacin del MDAC 2.6 o posterior.
OLE DB .NET Data Provider
El OLE DB .NET Data Provider utiliza el OLE DB nativo a travs de COM para acceder a los
datos soportando transacciones manuales y automticas.
Para utilizar el proveedor de datos OLE DB .NET es necesario utilizar tambin el proveedor
OLE DB (2.6 o superior). Los siguientes proveedores son compatibles con ADO.NET.
Driver Proveedor
SQLOLEDB Microsoft OLE DB Provider para SQL Server.
MSDAORA Microsoft OLE DB Provider para Oracle.
Marco Besteiro y Miguel Rodrguez ADO.NET
10/57
Microsoft.J et.OLEDB.4.0 OLE DB Provider para Microsoft J et.


El proveedor de datos OLE DB .NET no soporta OLE DB 2.5 con lo que no funcionarn los
proveedores siguientes: Microsoft OLE DB Provider para Exchange y el Microsoft OLE DB
Provider para Internet Publishing. Tampoco funciona con el proveedor de datos OLE DB para
ODBC (MSDASQL).
Se recomienda este proveedor para aplicaciones de varias capas que utilicen Oracle o SQL
Server 6.5 o inferior. Para aplicaciones cliente-servidor es ms conveniente la utilizacin de
Microsoft Access como origen de datos pero para aplicaciones de varias capas Microsoft no
recomienda utilizar Microsoft Access.
Los componentes de ADO.NET
Los componentes de ADO.NET han sido diseados para acceder y manipular datos. Hay dos
componentes principales en ADO.NET que son Dat aSet y los proveedores de datos .NET que
a su vez incluyen los objetos Connect i on, Command, Dat aReader y Dat aAdapt er . En este
apartado se describir detalladamente cada uno de estos objetos.
La clase Connection
Es la clase encargada de establecer la conexin con el origen de datos y tiene soporte
automtico para pooling de conexiones. Dependiendo del origen de datos que se utilice se
deber utilizar Ol eDbConnect i on o Sql Connect i on. Se entiende por pool de conexiones el
conjunto de conexiones cacheadas en el servidor.
Esta clase implementa la interface I DbConnect i on. La cadena de conexin al origen de
datos se obtiene por medio de la propiedad Connect i onSt r i ng, el estado de la conexin por
medio de la propiedad St at e, para la base de datos se utiliza Dat abase y para determinar el
tiempo mximo de conexin la propiedad Connect i onTi meout .
Los mtodos ms importantes de esta clase son:
Open
Cuando se llama al mtodo Open, se abre un canal fsico
con el origen de datos
Cl ose
Cierra la Conexin, pero sta no se destruye facilitando
el pooling de conexiones. El consumo en memoria es
bajo.
Begi nTr ansact i on
Comienza la transaccin
ChangeDat abase
Cambia de base de datos
Cr eat eCommand
Crea un objeto Command
La siguiente tabla describe los estados en los que se puede encontrar la conexin.
Open
La conexin est abierta y funcionando
Marco Besteiro y Miguel Rodrguez ADO.NET
11/57
Br oken
Una conexin previa ha dejado de funcionar. Debe ser
cerrada y reabierta.
Cl osed
Est cerrada.
Connect i ng
Conectndose, la conexin est siendo abierta.
Execut i ng
Ejecutando un comando
Fet chi ng
Recogiendo la informacin del origen de datos.

El proveedor slo puede cambiar la cadena de conexin cuando est cerrada (Cl osed). Por
otro lado, los desarrolladores deberan utilizar el mtodo Cl ose cuando hayan acabado de
utilizar la conexin, ya que este mtodo cierra la conexin y la devuelve al pool de
conexiones. Sin embargo el mtodo Di spose cierra la conexin y destruye la instancia del
objeto eliminndola del pool de conexiones.
En funcin del proveedor de datos de la plataforma .NET que se utilice, se puede elegir entre
los clases Connect i on siguientes: Ol eDbConnect i on y Sql Connect i on.
Clase OleDbConnection
Esta clase representa una conexin al proveedor de datos OLE DB .NET. Las propiedades
ms importantes que utiliza son:
Connect i onSt r i ng para especificar el origen de datos
ChangeDat abase para cambiar la base de datos para conexiones abiertas.
Connect i onTi meout para obtener el tiempo de espera. Por defecto son 15 segundos.
Si se desea que sea ilimitado ha de asignrsele el valor cero y slo podr cambiarse su
valor a travs de la propiedad Connect i onSt r i ng.
Si el estado de la conexin cambia -propiedad St at e- entonces se produce el evento
St at eChange.
Clase SqlConnection
Esta clase representa una conexin a la base de datos SQL Server 7.0 o superior. Las
propiedades ms importantes son las siguientes:
Si se produce una excepcin en SQL (Sql Except i on) mientras se ejecuta un comando
concreto, la conexin permanece abierta en caso de que el nivel de severidad sea
menor que 19. Con un nivel de severidad mayor que 20, la conexin se cierra y es
necesario reabrirla para continuar.
La propiedad Connect i onSt r i ng especifica el origen de datos.
Un objeto Sql Connect i on lee la informacin de la conexin a travs de la base de
datos y del origen de datos. No necesita leer informacin del proveedor como en el
caso de OLE DB .NET.
Marco Besteiro y Miguel Rodrguez ADO.NET
12/57
La propiedad Connect i onTi meout obtiene el tiempo de espera que por defecto son 15
segundos. Si se desea que sea ilimitado ha de asignrsele el valor cero y solo podr
cambiarse su valor a travs de la propiedad Connect i onSt r i ng.
Cuando se utiliza el mtodo Cl ose si existen transacciones pendientes en ese
momento, las deshace (Rol l Back).
Creacin de una conexin con Visual Studio .NET
En Visual Studio .NET existe la posibilidad de realizar una conexin de forma muy sencilla
utilizando el Explorador de servidores.

Figura 24.6. Explorador de conexiones en Visual Studio .NET
Para crear una conexin, basta con seleccionar con el botn derecho Agregar conexin de la
figura 24.6. Se accede a configurar la conexin dependiendo del proveedor que se utilice. A
continuacin, se realizan dos ejemplos de conexin.
A) Para el caso de una conexin a SQL Server
Para el caso de una conexin a la base de datos Northwind en SQL Server se elige el
proveedor para SQL Server, el servidor, la base de datos y el usuario junto con la contrasea
(Figura 24.7).
Marco Besteiro y Miguel Rodrguez ADO.NET
13/57

Figura 24.7. Propiedades de la conexin a SQL Server.
Una vez rellenados los datos, es posible observar todos los elementos de la base de datos.
Marco Besteiro y Miguel Rodrguez ADO.NET
14/57

Figura 24.8. Conexin a la base de datos Northwind en SQL Server.
Una vez que la conexin est creada basta con seleccionarla y arrastrarla hasta el formulario
donde va a ser utilizada.
B) Para el caso de una conexin a una base de datos Access.
Se selecciona el proveedor de acceso a datos J et 4.0 OLE DB Provider y se elige la base de
datos Neptuno de Access 2000.
Marco Besteiro y Miguel Rodrguez ADO.NET
15/57

Figura 24.9. Propiedades de la conexin a una base de datos de Access
Despus de crear la conexin se puede acceder a los diferentes elementos de la base de datos,
que en este caso se dividen en tablas, vistas y procedimientos almacenados. Las vistas en
Access son tambin denominadas consultas de seleccin, y los procedimientos
almacenados, bien pueden ser consultas con parmetros, o consultas de unin, o consultas de
referencias cruzadas o consultas de accin -I nser t , Updat e, Cr eat e o Del et e- disponibles en
Access.
Marco Besteiro y Miguel Rodrguez ADO.NET
16/57

Figura 24.10. Elementos de la base de datos Neptuno

Transacciones en ADO.NET
Para empezar una transaccin en ADO .NET se llama al mtodo Begi nTr ansact i on que
acepta el parmetro I sol at i onLevel (nivel de aislamiento) y/o el nombre, y devuelve un
objeto transaccin de la clase Ol eDbTr ansact i on o Sql Tr ansact i on dependiendo del
proveedor que se utilice.
El objeto Sql Tr ansact i on soporta savepoi nt s o puntos de almacenamiento de la
transaccin que permiten deshacerla (Rol l Back) ms tarde. Para almacenar un savepoi nt se
utiliza el mtodo Save. Esta funcionalidad es equivalente a la declaracin SAVE
TRANSACTION que se realiza en T-SQL.
Si se quiere deshacer una transaccin ya almacenada, ha de utilizarse el mtodo Rol l back que
puede llevar como parmetro el nombre del punto de almacenamiento previamente guardado.
En caso de querer aceptar la transaccin se utilizar el mtodo Commi t .
A continuacin se realiza un ejemplo con SQL Server:
St r i ng st r Conexi on = SERVER=( l ocal ) ; ui d=sa; pwd=sa; dat abase=Nor t hwi nd;
Sql Connect i on Obj Cnn = new Sql Connect i on( st r Conexi on) ;

Obj Cnn. Open( ) ;
/ / Comi enza l a t r ansacci n
Sql Tr ansact i on Obj Tr an = Obj Cnn. Begi nTr ansact i on( ) ;
Marco Besteiro y Miguel Rodrguez ADO.NET
17/57
t r y
{
/ / Ej ecuci n de comandos

/ / Se ej ecut a el Commi t de l a Tr ansacci n
Obj Tr an. Commi t ( ) ;
}
cat ch ( Except i on ex)
{
/ / La t r ansacci n ha f al l ado
Obj Tr an. Rol l back( ) ;
}
Obj Cnn. Cl ose( ) ;

A continuacin se realiza un ejemplo con OLE DB.
St r i ng st r Conexi on = ( " Pr ovi der = Mi cr osof t . J et . OLEDB. 4. 0; Dat a Sour ce =
Nept uno. MDB" ;
Ol eDbConnect i on Obj CnnOLE= new Ol eDbConnect i on( st r Conexi on) ;

Obj Cnn. Open( ) ;
/ / Comi enza l a t r ansacci n
Ol eDbTr ansact i on Obj Tr an = Obj CnnOLE. Begi nTr ansact i on( ) ;
t r y
{
/ / Ej ecuci n de comandos

/ / Se ej ecut a el Commi t de l a Tr ansacci n
Obj Tr an. Commi t ( ) ;
}
cat ch ( Except i on ex)
{
/ / La t r ansacci n ha f al l ado
Obj Tr an. Rol l back( ) ;
}
Obj CnnOLE. Cl ose( ) ;

La clase Command
Un objeto de la clase Command al igual que un objeto de la clase Connect i on pertenece al
proveedor de acceso a datos de la plataforma .NET, as que a la hora de codificar se puede
utilizar la interfaz I Command comn a todos los proveedores (todos ellos la implementan), o
las clases especficas de alguno de los proveedores que proporciona la plataforma .NET.
Un objeto Command bsicamente formula una peticin y se la enva al origen de datos. Si esa
peticin devuelve datos, el objeto Command se encarga de empaquetarlos y devolverlos como
un objeto Dat aReader , un valor escalar o como los parmetros de salida utilizados en el
propio comando.
Marco Besteiro y Miguel Rodrguez ADO.NET
18/57
Existen dos propiedades muy importantes de la clase Command:
CommandText . Representa una cadena o texto cuya sintaxis es comprendida por el
proveedor de acceso a datos .NET que se utilice.
CommandType. Esta propiedad indica la forma en la que la propiedad CommandText va
a ser interpretada y su valor por defecto es CommandType. Text . Los valores que puede
tomar esta propiedad son:
o CommandType. Text . Indica que la propiedad CommandText es un texto plano.
Por ejemplo:
St r i ng st r SQL = SELECT * FROM Empl oyees;
Sql Command Obj Cmd = new Sql Command( st r SQL, Obj Cnn) ;
/ / La l nea si gui ent e no es necesar i a por que Text es el
/ / val or por def ect o
Obj Cmd. CommandType = CommandType. Text ;

o CommandType. St or edPr ocedur e. Representa que la propiedad CommandText
es el nombre de un procedimiento almacenado.
Por ejemplo:
St r i ng st r SP = Cust Or der sDet ai l ;
Sql Command Obj Cmd = new Sql Command( st r SP, Obj Cnn) ;
Obj Cmd. ComamndType = CommandType. St or edPr ocedur e;

o CommandType. Tabl eDi r ect . Con esta propiedad se indica que el
CommandText es el nombre de una tabla del origen de datos. Esta opcin no
est soportada en el SQL Server .NET Dat a Pr ovi der .
Por ejemplo:
St r i ng st r Tabl a = Empl oyees;
Ol eDbCommand Obj Cmd = new Ol eDbCommand( st r Tabl a, Obj Cnn) ;
Obj Cmd. CommandType = CommandType. Tabl eDi r ect ;

Cuando se est utilizando un objeto Command se necesita que un objeto Connect i on haya sido
abierto. Siempre hay una transaccin asociada a la conexin. Si se resetea la conexin
entonces el objeto transaccin devuelve nul l . En principio, se puede cambiar la conexin sin
problema alguno para conectar con otro usuario o para conectar a otra fuente de datos, pero
hay que tener en cuenta que la transaccin que subyace sea compatible con la conexin.
Los parmetros del objeto Command pertenecen a una coleccin llamada
Ol eDbPar amet er Col l ect i on o Sql Par amet er Col l ect i on dependiendo del proveedor
seleccionado. Estas colecciones estn compuestas por objetos Ol eDbPar amet er o
Sql Par amet er respectivamente.
Marco Besteiro y Miguel Rodrguez ADO.NET
19/57
Para crear un nuevo parmetro existen dos posibilidades, o bien utilizar el operador New de la
clase Par amet er , o bien trabajar con el mtodo Cr eat ePar amet er de la clase Command.
Para ejecutar un comando se necesita que haya una conexin vlida abierta y dependiendo del
comportamiento que se desee dar al objeto Command se utilizar uno de los siguientes
mtodos:
Execut eNonQuer y: No devuelve un conjunto de registros sino que devuelve el nmero
de filas afectadas por la accin.
Execut eReader : Devuelve un conjunto de registros de slo lectura y forward-only.
No se informa del nmero de filas afectadas.
Execut eScal ar : Devuelve slo el valor de la celda (0,0) del conjunto de registros.
El comportamiento que puede tener un objeto Command est recogido en la propiedad
CommandBehavi or que describe los resultados y la forma en la cual la consulta debera afectar
al origen de datos. Se puede utilizar el mtodo Execut eReader para alterar el comportamiento
del objeto Command mediante las siguientes opciones:
Cl oseConnect i on. Cierra la conexin cuando se cierra el objeto Dat aReader
KeyI nf o. Muestra informacin de la clave primaria o primary key y de las columnas
sin realizar bloqueo de las filas.
SchemaOnl y. Muestra informacin solo de las columnas y no bloquea las filas.
Sequent i al Access. El contenido de la columna puede leerse de golpe utilizando el
mtodo Get Byt es del objeto Dat aReader .
Si ngl eResul t . Devuelve un nico conjunto de datos, en caso de existir varios, slo
devolver el primero de ellos.
Si ngl eRow. Se utiliza cuando se espera que la consulta devuelva una nica fila. Los
proveedores de datos estn optimizados con esta opcin para ejecutar este tipo de
consultas.
Como ya se ha descrito anteriormente la clase Command pertenece al proveedor de acceso a
datos .NET, de tal forma que existen las clases Ol eDbCommand y Sql Command para el
proveedor OLE DB .NET y SQL Server .NET respectivamente.
Clase OleDbCommand
Esta clase representa una declaracin OLE DB para ejecutar contra un origen de datos OLE
DB. Esta declaracin puede ser un comando SQL, el nombre de un procedimiento almacenado
concreto, o bien cualquier texto que entienda el proveedor OLE DB.
Tiene diferentes constructores:
a) Command Text . Ejecuta una sentencia comprensible por el proveedor.
Marco Besteiro y Miguel Rodrguez ADO.NET
20/57
b) Command Text + Ol eDbConnect i on. Ejecuta una sentencia bajo una conexin
subyacente.
c) Command Text + Ol eDbConnect i on + Ol eDbTr ansact i on. Ejecuta una sentencia
en una transaccin bajo una conexin subyacente.
Antes de ejecutar el comando se asegura que la conexin est abierta.
Existen otras propiedades como CommandType y CommandTi meout que por defecto vale 30
segundos.
Al ejecutar el comando Ol eDbCommand se pueden utilizar los siguientes mtodos:
Execut eReader , que devuelve un objeto Ol eDbDat aReader despus de ejecutar una
sentencia SQL de seleccin SELECT.
Por ejemplo:
St r i ng st r SQL = SELECT * FROM Empl oyees;
Ol eDbCommand Obj Cmd = new Ol eDbCommand( st r SQL, Obj CnnOLE) ;
Ol eDbDat aReader Obj Reader = Obj Cmd. Execut eReader ( ) ;
whi l e ( Obj Reader . Read( ) )
{
Consol e. Wr i t e( Obj Reader [ 0] . ToSt r i ng( ) ) ;
}
Execut eNonQuer y, se utiliza para ejecutar consultas de accin mediante clusulas
como I NSERT, UPDATE, DELETE, CREATE, SET principalmente. Esta sentencia devuelve
un entero indicando el nmero de filas afectadas por la accin. Lgicamente modifica
el valor de la propiedad Recor dAf f ect ed.
Por ejemplo:
St r i ng st r SQL = UPDATE Empl oyees SET l ast name= I sabel WHERE
Empl oyeeI D=2;
Ol eDbCommand Obj Cmd = new Ol eDbCommand( st r SQL, Obj CnnOLE) ;
Obj Cmd. Execut eNonQuer y( ) ;

Execut eScal ar . Devuelve el nico valor de la primera fila y primera columna del
resultado obtenido de la ejecucin. Se utiliza mucho para obtener valores calculados en
procedimientos almacenados.
Por ejemplo:
St r i ng st r SQL = SELECT COUNT( *) FROM Empl oyees;
Ol eDbCommand Obj Cmd = new Ol eDbCommand( st r SQL, Obj CnnOLE) ;
Obj ect Obj Aux = Obj Cmd. Execut eScal ar ( ) ;

Marco Besteiro y Miguel Rodrguez ADO.NET
21/57
Clase SqlCommand
Representa una sentencia T-SQL o un procedimiento almacenado y tiene los siguientes
constructores:
a) Command Text . Ejecuta una sentencia comprensible por SQL Server
b) Command Text + Sql Connect i on. Ejecuta la sentencia bajo la conexin con SQL
Server subyacente.
c) Command Text + Sql Connect i on + Sql Tr ansact i on. Ejecuta una sentencia en
una transaccin bajo una conexin SQL Server subyacente.
Al ejecutar el comando Sql Command se pueden utilizar los siguientes mtodos
Execut eReader , que devuelve un objeto Sql Dat aReader despus de ejecutar una
sentencia SQL de seleccin SELECT. Se pueden ejecutar procedimientos almacenados
del sistema de SQL Server.
Por ejemplo:
St r i ng st r SQL = SELECT * FROM Empl oyees;
Sql Command Obj Cmd = new Sql Command( st r SQL, Obj Cnn) ;
Sql Dat aReader Obj Reader = Obj Cmd. Execut eReader ( ) ;
whi l e ( Obj Reader . Read( ) )
{
Consol e. Wr i t e( Obj Reader [ 0] . ToSt r i ng( ) ) ;
}

Execut eNonQuer y, se utiliza para ejecutar consultas de accin mediante clusulas
como I NSERT, UPDATE, DELETE, CREATE, SET principalmente. Esta sentencia devuelve
un entero indicando el nmero de filas afectadas por la accin. Lgicamente modifica
el valor de la propiedad Recor dAf f ect ed.
Por ejemplo:
St r i ng st r SQL = UPDATE Empl oyees SET l ast name= Al var o WHERE
Empl oyeeI D=2;
Sql Command Obj Cmd = new Sql Command( st r SQL, Obj Cnn) ;
Obj Cmd. Execut eNonQuer y( ) ;

Execut eScal ar . Devuelve el nico valor de la primera fila y primera columna del
resultado obtenido de la ejecucin. Se usa mucho para obtener valores calculados o
cantidades totales.
Por ejemplo:
St r i ng st r SQL=SELECT COUNT( *) FROM Empl oyees;
Sql Command Obj Cmd=new Sql Command( st r SQL, Obj Cnn) ;
Obj ect Obj Aux = Obj Cmd. Execut eScal ar ( ) ;

Marco Besteiro y Miguel Rodrguez ADO.NET
22/57
Execut eXml Reader . Devuelve un objeto Xml Reader despus de ejecutar el comando
SELECT que explota las caractersticas XML de SQL Server 2000.
St r i ng st r SQL=SELECT * FROM Empl oyees FOR XML AUTO;
Sql Command Obj Cmd=new Sql Command( st r SQL, Obj Cnn) ;
Xml Reader Obj XR = cmd. Execut eXml Reader ( ) ;
whi l e ( Obj XR. Read( ) )
{
Consol e. Wr i t eLi ne( Obj XR. ReadOut er Xml ( ) ) ;
}

Creacin de un objeto Command con Visual Studio .NET
A continuacin se realizarn dos ejemplos. El primero utiliza la clase Sql Command en SQL
Server y en el segundo se trabaja con la clase Ol eDbCommand para Access.
A) Creacin de un objeto SqlCommand para SQL Server
Supnga que se dispone de un formulario al que se ha aadido un objeto Sql Connect i on
llamado sql Connect i on1. El primer paso es aadir un objeto sql Command al formulario
(pestaa Data del cuadro de herramientas) .

Figura 24.11. Cuadro de herramientas de la pestaa Dat a
A continuacin, en la ventana de propiedades, en la propiedad Connect i on se ha de
seleccionar el objeto sql Connect i on deseado -en este caso sql Connect i on1-. El ltimo paso
es indicar la expresin SQL vlida. Si por ejemplo se desea que el comando utilice una
consulta sobre los pedidos de la base de datos Northwind, se puede utilizar la propiedad
CommandText que dispone de un asistente para el diseo de consultas similar al que
proporciona SQL Server
Marco Besteiro y Miguel Rodrguez ADO.NET
23/57

Figura 24.12. Asignacin de la conexin al control sql Command
.

Marco Besteiro y Miguel Rodrguez ADO.NET
24/57
Figura 24.13. Generador de consultas de Visual Studio .NET
y una vez construida la consulta, la sentencia SQL generada es asignada a la propiedad
CommandText del componente Sql Command.
B) Creacin de un objeto OleDbCommand para Access
Se parte de que existe una conexin a la base de datos Access llamada Neptuno.
Posteriormente se arrastra un objeto Ol eDbCommand del cuadro de herramientas al formulario,
y se asigna la conexin al comando mediante la propiedad Connect i on. Si se accede a la
propiedad CommandText se establece la expresin del comando por medio del generador de
consultas, como se indica en la figura 24.13.

Figura 24.14. Propiedades del objeto Ol eDbCommand

Llamadas a Procedimientos Almacenados en ADO.NET
Para ejecutar un procedimiento almacenado se debe utilizar el tipo de comando para
procedimientos almacenados y elegir el mtodo de ejecucin que ms se adecue al resultado
esperado. Si el procedimiento almacenado que se va a ejecutar posee parmetros, se deben
crear antes de ejecutarlo indicando si son de entrada o de salida.
El siguiente procedimiento almacenado de la base NorthWind es utilizado en varios ejemplos.
Su nombre es Cust Or der sDet ai l y requiere un parmetro que corresponde con el
identificador o nmero de pedido.
CREATE PROCEDURE Cust Or der sDet ai l @Or der I D i nt
AS
Marco Besteiro y Miguel Rodrguez ADO.NET
25/57
SELECT Pr oduct Name, Uni t Pr i ce=ROUND( Od. Uni t Pr i ce, 2) ,
Quant i t y, Di scount =CONVERT( i nt , Di scount * 100) ,
Ext endedPr i ce=ROUND( CONVERT( money, Quant i t y*( 1- Di scount ) *Od. Uni t Pr i ce) , 2)
FROM Pr oduct s P, [ Or der Det ai l s] Od
WHERE Od. Pr oduct I D = P. Pr oduct I D and Od. Or der I D = @Or der I D

A continuacin se presenta un ejemplo de llamada al procedimiento almacenado
Cust Or der Det ai l en SQL Server.
Por ejemplo: Supnga que existe una conexin abierta a la base de datos Northwind en SQL
Server llamada Obj Cnn.
/ / Not a: Debe est ar decl ar ado el namespace Syst em. Dat a. Sql Cl i ent ;

Sql Command obj Cmd = new Sql Command( Cust Or der sDet ai l , Obj Cnn) ;
obj Cmd. CommandType = CommandType. St or edPr ocedur e;

Sql Par amet er obj Par =new Sql Par amet er ( @Or der I D, Sql DbType. I nt ) ;
obj Par . Di r ect i on = Par amet er Di r ect i on. I nput ;
obj Par . Val ue = 14;
obj Cmd. Par amet er s. Add( obj Par ) ;
Sql Dat aReader dr = obj Cmd. Execut eReader ( CommandBehavi or . Cl oseConnect i on) ;

Nota: El proveedor de datos SQL Server .NET no soporta el carcter interrogacin para
obtener la informacin de los parmetros, pero s lo hace el proveedor OLE DB .NET.
La clase DataReader
Un objeto de la clase Dat aReader es muy similar a un Recor dset de ADO pero que
nicamente soporta las siguientes caractersticas:
ReadOnl y. Solo lectura.
For war d Onl y. Solo lee hacia delante.
Estas dos caractersticas hacen que un objeto de la clase Dat aReader sea muy rpido ya que
no tiene implementadas las caractersticas de edicin, eliminacin, insercin, navegacin de
registros hacia atrs, etc. que redundan en un peor rendimiento del objeto. Es una eficiente
alternativa para orgenes de datos desconectados, pero es menos escalable que la clase
Dat aset , ya que no permite ser heredado por otra clase.
La clase Dat aReader no tiene constructor y es necesario llamar al mtodo Execut eReader del
objeto Command correspondiente para crear un objeto Dat aReader . Debe ser cerrado
explcitamente.
El mtodo Read se utiliza para leer los registros. Cuando se crea un objeto Dat aReader
siempre se abre y se posiciona en el primer registro, con lo que no hay que hacer una llamada
explicita a ningn mtodo del tipo MoveFi r st . El mtodo Read lee siempre la siguiente fila.
Dat aReader Obj DR = Obj CMD. Execut eReader ( ) ;
Obj DR. Read( ) ;
Marco Besteiro y Miguel Rodrguez ADO.NET
26/57

Para acceder a los valores de las columnas del objeto Dat aReader se puede acceder tanto por
nmero como por nombre.
Por ejemplo:
Dat aReader Obj DR = Obj CMD. Execut eReader ( ) ;
Obj DR. Read( ) ;
Consol e. Wr i t e( Obj DR. Get I nt 32( 0) . ToSt r i ng( ) ) ;
/ / o Consol e. Wr i t e( Obj DR[ Empl oyeeI D] . ToSt r i ng( ) ) ;

Otras propiedades interesantes de la clase Dat aReader son:
La propiedad Recor dsAf f ect ed toma un valor determinado cuando se realizan
acciones como inserciones, actualizaciones o eliminaciones de registros. En caso de
realizar consultas de seleccin, esta propiedad no recoge ningn valor hasta que no se
han ledo todos los registros, y se haya cerrado el objeto Dat aReader correspondiente.
La propiedad Next Resul t sirve para acceder al siguiente conjunto de resultados.
Fi el dCount devuelve el nmero de columnas o campos del conjunto de registros pero
no aporta informacin acerca del nmero de filas devueltas.
Existen multitud de mtodos especficos de lectura como Get St r i ng, Get Bool ean, Get I nt 32,
etc. Otros mtodos interesantes del objeto Dat aReader son Get Fi el dType y Get Val ues que
devuelven una matriz de objetos describiendo los valores de las filas.
En la versin actual del framework .NET se describen dos clases que implementan la interface
I Dat aReader , una para el estndar OLE DB y otra para SQL Server llamadas
Ol eDbDat aReader y Sql Dat aReader respectivamente.
OleDbDataReader
Es la clase que se utiliza en caso de un acceso de datos estndar y es vlida para cualquier
base de datos, incluido SQL Server. Aunque lgicamente para SQL Server se utilizar la clase
Sql Dat aReader .
Cuando se leen datos y la conexin que subyace est ocupada no se puede hacer otras
operaciones sobre el objeto Ol eDbDat aReader excepto cerrarlo. Y una vez que el objeto
Ol eDbDat aReader est cerrado slo se pueden utilizar dos de sus propiedades: I sCl osed() y
Recor dsAf f ect ed
SqlDataReader
La clase Sql Dat aReader debe ser utilizada cuando se accede a una base de datos en SQL
Server. Esta clase es muy similar a la clase Ol eDbDat aReader , ya que tiene las mismas
caractersticas. Existen multitud de mtodos especficos de este proveedor del tipo Get Sql Xxx
que devuelven datos de distintos tipos de datos de SQL. Por ejemplo: Get Sql Bi nar y,
Get Sql St r i ng, etc.
Marco Besteiro y Miguel Rodrguez ADO.NET
27/57
Un ejemplo con Visual Studio .NET:
En este ejemplo se representa, en una lista de un formulario, los empleados de la base de datos
de Northwind en SQL Server. Se crea un proyecto con un formulario, posteriormente se
agrega una etiqueta (l abel 1) y un cuadro de lista (l i st Box1) desde el cuadro de
herramientas. Finalmente se escribe en el evento Load del formulario el siguiente cdigo, cuya
finalidad es mostrar cmo trabaja un objeto Dat aReader para rellenar una lista con datos de
una base de datos.
St r i ng st r Conn = " SERVER=l ocal host ; UI D=sa; DATABASE=Nor t hwi nd; " ;
st r i ng st r Cmd = " SELECT Empl oyeeI D, Last Name, Fi r st Name FROM Empl oyees" ;
st r i ng st r Li st a;

/ / Rel l ena el Dat aReader
Sql Dat aReader Obj DR;
Sql Connect i on Obj Cnn = new Sql Connect i on( st r Conn) ;
Sql Command Obj Cmd = new Sql Command( st r Cmd, Obj Cnn) ;
Obj Cnn. Open( ) ;
Obj DR = Obj Cmd. Execut eReader ( ) ;
l abel 1. Text = " Li st a de Empl eados" ;

/ / Recogi endo por l os r egi st r os.
whi l e( Obj DR. Read( ) )
{
st r Li st a = Obj DR. Get I nt 32( 0) . ToSt r i ng( ) ;
st r Li st a += " - " + Obj DR. Get St r i ng( 1) ;
st r Li st a += " " + Obj DR. Get St r i ng( 2) ;
l i st Box1. I t ems. Add( st r Li st a) ;
}
Obj Cnn. Cl ose( ) ;

El resultado se representa en la siguiente figura:

Figura 24.15. Resultado del ejemplo con Dat aReader
Marco Besteiro y Miguel Rodrguez ADO.NET
28/57

La clase DataAdapter
La clase Dat aAdapt er se encarga de las operaciones entre la capa de datos y la capa
intermedia, donde los datos son transferidos. Se puede decir que sirve como puente entre un
objeto Dat aSet y un origen de datos asociado para recuperar y guardar datos.
Bsicamente permite rellenar (Fi l l ) el objeto Dat aSet para que sus datos coincidan con los
del origen de datos y permite actualizar (Updat e) el origen de datos para que sus datos
coincidan con los del Dat aSet .
DataAdapter
Base de Datos
DataSet
SelectCommand
DeleteCommand
UpdateCommand
InsertCommand
TableMappings

Figura 24.16. Diagrama del objeto Dat aAdapt er
Los constructores de la clase son:
Dat aAdapt er ( Command sel ect Command) . Se utiliza un comando de seleccin
(clusula SELECT) como parmetro.
Dat aAdapt er ( St r i ng sel ect CommandText , St r i ng
sel ect Connect i onSt r i ng) . Se utiliza una sentencia SQL de seleccin con una
cadena de conexin como parmetros.
Dat aAdapt er ( St r i ng sel ect CommandText , Connect i on sel ect Connect i on) .
Se utilizan los parmetros sentencia SQL de seleccin y un objeto de tipo
conexin.
En la interface I Dat aAdapt er se declaran los siguientes mtodos (toda clase que implemente
esta interface est obligada a implementarlos).
Fi l l ( Dat aSet ds) . Rellena un objeto de la clase Dat aset .
Fi l l Schema( Dat aSet ds, SchemaType st ) . Rellena un esquema con un
Dat aSet indicando el tipo de esquema a rellenar.
Updat e( Dat aSet ds) . Actualiza el Dat aSet correspondiente.
Marco Besteiro y Miguel Rodrguez ADO.NET
29/57
Get Fi l l Par amet er s( ) . Recoge el conjunto de parmetros cuando se ejecuta una
consulta de seleccin.
La coleccin Tabl eMappi ngs mantiene el seguimiento del enlace entre un objeto Dat aTabl e
del Dat aSet y un origen de datos.
Un objeto de la clase Dat aAdapt er soporta batch-updates, es decir que puede realizar varias
actualizaciones en un solo proceso. Cuando una aplicacin llama al mtodo Updat e, la clase
examina la propiedad RowSt at e para cada fila en el Dat aSet y ejecuta la clausula I NSERT,
UPDATE o DELETE requerida.
Las principales propiedades de la clase Dat aAdapt er son Sel ect Command, I nser t Command,
Updat eCommand y Del et eCommand, que es donde residen las sentencias SQL para consultar,
insertar, actualizar y eliminar registros respectivamente.
Todos los proveedores de datos de la plataforma .NET soportan una clase que hereda de la
clase DbDat aAdapt er que hereda a su vez de la clase Dat aAdapt er , la cual implementa la
interface I Dat aAdapt er . En muchos casos es suficiente con una clase que implemente el
interface I Dat aAdapt er .
Las clases ms representativas soportadas por los proveedores son Ol eDbDat aAdapt er y
Sql Dat aAdapt er que son muy similares.
Utilizacin del componente DataAdapter en Visual Studio .NET.
En el momento en que se agrega el componente Dat aAdapt er desde el cuadro de
herramientas hasta el formulario, aparece automticamente un asistente para crear y
configurar el componente Dat aAdapt er .
A) Caso de un objeto SqlDataAdapter
Para este ejemplo se va a utilizar un componente Sql Dat aAdapt er que se configurar a partir
del procedimiento almacenado Cust Or der sDet ai l de la base datos NorthWind en SQL
Server.
Marco Besteiro y Miguel Rodrguez ADO.NET
30/57

Figura 24.17. Propiedades del objeto Sql Dat aAdapt er
Una vez generado el componente sql Dat aAdapt er 1, se pueden modificar las propiedades as
como utilizar los tres asistentes o herramientas siguientes.
1) Asistente para configurar el adaptador de datos. Este asistente es el mismo que aparece
cuando se arrastra el componente Dat aAdapt er en el formulario. Por ejemplo, si se selecciona
el procedimiento almacenado Cust Or der sDet ai l de la base datos NorthWind en SQL Server,
se puede rellenar los datos para la seleccin, para agregar nuevos registros, para actualizar y
para borrar registros.
Marco Besteiro y Miguel Rodrguez ADO.NET
31/57

Figura 24.18. Asistente para la configuracin del adaptador de datos (Dat aAdapt er )
2) Asistente para generar el conjunto de datos. Es el asistente que permite generar un objeto
Dat aSet .

Figura 24.19. Generacin del conjunto de datos (Dat aSet )
Marco Besteiro y Miguel Rodrguez ADO.NET
32/57
3) Asistente para visualizar los datos, que se utiliza para disponer de una vista previa de los
datos que recupera el objeto Dat aAdapt er del origen de datos.

Figura 24.20. Asistente para la vista previa de datos
En este ejemplo en particular como el procedimiento almacenado recibe un parmetro, para
obtener el conjunto de datos es necesario rellenarlo. En la figura 24.20 se ha elegido el cdigo
de pedido u Or der I D con el valor 10850.
B) Caso de un objeto OleDbDataAdapter
En este caso se utiliza un componente Ol eDbDat aAdapt er que se configurar a partir de una
consulta de seleccin sobre la tabla Empl eados de la base datos Neptuno en Access.
Marco Besteiro y Miguel Rodrguez ADO.NET
33/57

Figura 24.21. Propiedades del objeto Ol eDbDat aAdapt er .
Se puede observar que tiene las tres mismas herramientas o asistentes que el objeto
Sql Dat aAdapt er .
1) Asistente para configurar el adaptador de datos. Este asistente es el mismo que en el caso
anterior salvo que no se pueden crear procedimientos almacenados.
En dicho asistente se pueden configurar unas opciones avanzadas para el caso de instrucciones
SQL, que es el caso del ejemplo. Dichas opciones avanzadas permiten configurar la
generacin o no de las instrucciones I nser t , Updat e y Del et e. Tambin permiten configurar
si la concurrencia ser optimista y por ltimo si se ejecuta una sentencia SELECT despus de
las instrucciones I nser t y Updat e para recuperar los diferentes valores de la base de datos.
Marco Besteiro y Miguel Rodrguez ADO.NET
34/57

Figura 24.22. Asistente para la configuracin del Dat aAdapt er
2) Asistente para generar el conjunto de datos. Es el asistente que permite generar un objeto
Dat aSet .

Figura 24.23. Generacin del conjunto de datos
Marco Besteiro y Miguel Rodrguez ADO.NET
35/57
3) Asistente para visualizar los datos, que se utiliza para disponer de una vista previa de los
datos que recupera el objeto Dat aAdapt er del origen de datos.

Figura 24.24. Vista previa del objeto Ol eDbDat aAdapt er .

La clase DataSet
La clase Dat aSet es la clase principal de la arquitectura ADO.NET. Un objeto de esta clase es
una representacin en memoria de los datos en forma relacional. Es un cach de datos
extrados de un contenedor de datos genrico. El objeto Dat aSet se rellena con
Dat aAdapt er s, con datos locales, o bien con XML.
Marco Besteiro y Miguel Rodrguez ADO.NET
36/57

Figura 24.25. Arquitectura del objeto Dat aSet
Las colecciones ms importantes son la coleccin Dat aTabl es que contiene las tablas donde
reside la informacin y la coleccin Dat aRel at i ons que contiene las distintas relaciones entre
las tablas del Dat aSet . Se puede contener informacin especfica del usuario a travs de la
coleccin Ext endedPr oper t i es.
Tanto los datos, como el esquema o ambos se pueden representar en formato XML, y para
acceder a la informacin se utilizan los mtodos Get Xml , ReadXml y Wr i t eXml .
Una caracterstica importante de la clase Dat aSet es que permite aceptar o rechazar todos los
cambios realizados en las tablas, ya sean eliminaciones, actualizaciones o creaciones de
nuevos registros. Todos estos cambios se pueden aceptar en un solo paso siendo muy til
cuando se necesiten procesar distintos bloques de datos durante un tiempo en memoria. A
veces puede ser interesante mantener durante toda una sesin un Dat aSet en memoria
consiguiendo realizar un solo acceso a la base de datos para almacenarlo y otro al final de la
sesin para almacenar los cambios.
Creacin de un DataSet mediante controles en Visual Studio .NET
Para crear y rellenar un Dat aSet con Visual Studio .NET se debe realizar los siguientes pasos:
1. Se crea un formulario y se aade un control de tipo Connect i on (Ol eDbConnect i on o
Sql Connect i on) arrastrndolo desde el cuadro de herramientas. Se configura la
conexin para acceder al origen de datos deseado, tal y como se ha descrito
anteriormente.
2. Se aade al formulario un control Dat aAdapt er (Ol eDbDat aAdapt er o
Sql Dat aAdapt er ) y se configura como tambin se ha descrito.
Marco Besteiro y Miguel Rodrguez ADO.NET
37/57
3. Se selecciona el control Dat aAdapt er y se accede a la herramienta o asistente para
generar el conjunto de datos o Dat aSet .

Figura 24.26. Asistente de generacin del Dat aSet
Una vez que el objeto Dat aSet ha sido aadido al formulario, se puede acceder a las
propiedades del conjunto de datos o a ver el esquema del Dat aSet .

Marco Besteiro y Miguel Rodrguez ADO.NET
38/57
Figura 24.27. Propiedades del Dat aSet o conjunto de datos.
Si se desea agregar ms tablas al Dat aSet se pueden crear ms objetos Dat aAdapt er y
agregarlos al Dat aSet existente. La ventaja de aadir las diferentes tablas desde controles
Dat aAdapt er es que se agregan tanto los campos con sus tipos de datos, nombres, etc, y
adems se aaden las restricciones debidas a la clave primaria de las tablas en el origen de
datos.
La clase DataTable
La clase Dat aTabl e representa una tabla en memoria y es donde reside la informacin de los
datos. Un objeto de la clase Dat aTabl e se puede utilizar con o sin un objeto Dat aSet , pero si
se quiere rellenar, entonces debe asociarse al Dat aSet . Con un objeto Dat aTabl e al igual que
con un objeto Dat aSet se tiene la posibilidad de rechazar o aceptar todos los cambios en una
sola vez. Por otra parte las tablas tienen relaciones, restricciones, claves primarias, filas y
columnas que son objetos que se ven a continuacin.
El mtodo Fi l l del Dat aAdapt er rellena un Dat aSet con slo las columnas de la tabla y los
registros. La informacin acerca de las restricciones de la tabla, si se desean, deben ser
aadidas al Dat aSet utilizando la coleccin Const r ai nt s del objeto Dat aTabl e.
Se recomienda que el objeto Dat aSet posea la informacin existente sobre restricciones en el
origen de datos, y para conseguirlo se puede recurrir o bien a llamar al mtodo Fi l l Schema
del objeto Dat aAdapt er , o bien a establecer la propiedad Mi ssi ngSchemaAct i on del objeto
Dat aAdapt er a AddWi t hKey antes de llamar al mtodo Fi l l . Aadir la informacin del
esquema antes de rellenar el objeto Dat aSet asegura que la informacin de la clave primaria
se incluye en el objeto Dat aTabl e.
DataSet
DataTable
DataTable
DataTable
DataColumn
DataColumn
DataColumn
Constraints
DataColumn
DataColumn
DataRow
Relations
XML Schema

Figura 24.28. Estructura principal de los objetos Dat aSet y Dat aTabl e
La clase DataColumn
El conjunto de columnas de un objeto Dat aTabl e corresponde a una coleccin de objetos
Dat aCol umn. Un objeto Dat aCol umn tiene como propiedades importantes la propiedad
Col umnName que indica el nombre de la columna, y la propiedad Dat aType que indica el tipo
de columna. Adems tiene la propiedad Al l owDBNul l para saber si la base de datos permite
Marco Besteiro y Miguel Rodrguez ADO.NET
39/57
nulos para esa columna, la propiedad Aut oI ncr ement que detecta si la columna es o no
autonumrica, la propiedad Def aul t Val ue que establece o lee el valor por defecto de la
columna y la propiedad Expr esi n que establece o recoge la expresin utilizada para filtrar
filas o la expresin de un campo calculado entre columnas o la expresin de un campo suma,
promedio, etc. Las propiedades ReadOnl y y Uni que se utilizan para establecer o recoger si la
columna es de solo lectura y cada valor el nico para todas las filas.
La clase DataRow
Como en el caso de la clase Dat aCol umn, el conjunto de filas de un objeto Dat aTabl e
corresponde a una coleccin de objetos Dat aRow. La propiedad I t em[ n] o I t em[ nombr e] lee
o establece el valor de las columnas. Dos de los mtodos ms importantes del objeto Dat aRow
son el mtodo I sNul l ( n) o I sNul l ( nombr e) que indica si una columna es nula.
Ejemplo de DataSet, DataTable, DataColumn y DataRow
El siguiente cdigo muestra cmo utilizar los objetos Dat aSet , Dat aTabl e, Dat aCol umy
Dat aRow.
Dat aSet obj DS = new Dat aSet ( ) ;
Dat aTabl e obj Tabl a = new Dat aTabl e( " Tabl aLocal " ) ;

/ / Pr epar ando l as col umnas
Dat aCol umn obj Col = new Dat aCol umn( " Ci udad" ) ;
obj Col . Dat aType = Type. Get Type( " Syst em. St r i ng" ) ;
obj Tabl a. Col umns. Add( obj Col ) ;
Dat aCol umn obj Col 2 = new Dat aCol umn( " Pai s" ) ;
obj Col 2. Dat aType = Type. Get Type( " Syst em. St r i ng" ) ;
obj Tabl a. Col umns. Add( obj Col 2) ;

/ / Se aade el Dat aTabl e al Dat aset ( Ant es de Rel l enar )
obj DS. Tabl es. Add( obj Tabl a) ;

/ / Se aaden unas f i l as. . .
Dat aRow obj Fi l a = obj Tabl a. NewRow( ) ;
obj Fi l a[ " Ci udad" ] = " Bi l bao" ;
obj Fi l a[ " Pai s" ] = " Espaa" ;
obj Tabl a. Rows. Add( obj Fi l a) ;

/ / Se vi ncul a al Dat aGr i d
dat aGr i d1. Dat aMember = " Tabl aLocal " ;
dat aGr i d1. Dat aSour ce = obj DS;

Restricciones de datos
Para establecer reglas o restricciones con los objetos en memoria, ADO.NET presenta las
siguientes restricciones, que pueden ser de varios tipos:
For ei gnKeyConst r ai nt . Fuerza un vinculo entre dos Dat aTabl es del Dat aSet
Marco Besteiro y Miguel Rodrguez ADO.NET
40/57
Uni queConst r ai nt . Se asegura que la columna que tenga esta restriccin no pueda tener filas
con el mismo dato en esa columna.
ADO .NET proporciona adems la propiedad Pr i mar yKey del objeto Dat aTabl e que obtiene
o establece un nmero de columnas como claves primarias de la tabla en memoria, pero este
conjunto de columnas que forman la clave primaria en el objeto Dat aTabl e no tiene por que
coincidir con las columnas que forman la clave primaria en la base de datos. El uso de esta
clave ayuda a prevenir errores comunes cuando se actualiza la tabla en memoria y a veces el
uso de esta clave primaria en memoria ahorra la reconciliacin de datos posterior con la base
de datos.
Ejemplo de una aplicacin Maestro-Detalle con Visual Studio .NET
Se pretende realizar una aplicacin .NET que conste de un formulario donde aparezcan los
pedidos en un Dat aGr i d y sus lneas de pedido en otro, y que cada vez que se seleccione un
pedido concreto, aparezcan sus correspondientes lneas en el otro Dat aGr i d. Adems no se
utilizarn los controles de conexin, adaptacin y contenedor de datos incluidos en Visual
Studio .NET.
A) Para una base de datos en SQL Server
Para realizar este ejemplo se utilizan las tablas Or der s y Or der Det ai l s de la base de datos
Northwind en SQL Server.

Figura 24.29. Tablas Or der s y Or der Det ai l s de la base de datos Northwind
Se insertan dos controles Dat agr i d en el formulario: el control dat agr i d1 se situar en la
parte izquierda y contendr la informacin relativa a los pedidos (Or der s) y el control
dat agr i d2 estar en la parte derecha y contendr las lneas correspondientes al pedido
seleccionado (Or der Det ai l s).
Marco Besteiro y Miguel Rodrguez ADO.NET
41/57

Figura 24.30. Formulario Maestro-Detalle
Como se va a trabajar con la base de datos en SQL Server se aadir el namespace
correspondiente:
usi ng Syst em. Dat a. Sql Cl i ent ;
A continuacin se define el objeto Dat aset con el se va a trabajar y que se llama odsPedi dos.
Este objeto se define como pblico en la clase For m1.
publ i c Dat aSet odsPedi dos;
Una vez definido el objeto Dat aset donde va a residir la informacin de los pedidos y de las
lneas de pedido, se procede a cargar el objeto Dat aset en el evento Load del formulario
For m1.
pr i vat e voi d For m1_Load( obj ect sender , Syst em. Event Ar gs e)
{
}

Marco Besteiro y Miguel Rodrguez ADO.NET
42/57
Lo primero que hay que hacer es definir la conexin con el servido. Despus se incorpora la
informacin de la tabla pedidos (Or der s) al Dat aSet y posteriormente se aade al Dat aSet la
informacin de la tabla lneas de pedido.
Una vez que se tiene el Dat aSet con la informacin, se deben establecer las relaciones entre
las tablas que lo forman. Se puede obnservar que las tablas del Dat aSet no tienen porqu
coincidir con las tablas del origen de datos, ni en nmero de campos, ni en las claves, ni en los
nombres de las tablas, campos, etc.
Y por ltimo se vinculan las tablas a los Dat aGr i ds correspondientes.
pr i vat e voi d For m1_Load( obj ect sender , Syst em. Event Ar gs e)
{

st r i ng
sConexi on=" dat abase=nor t hwi nd; ui d=sa; pwd=sa; ser ver =l ocal host ; " ;

Dat aSet odsPedi dos = new Dat aSet ( ) ;

/ / Se r el l ena el Dat aSet con l a t abl a Pedi dos ( Or der s)
st r i ng sSQLPedi dos = " SELECT * FROM Or der s" ;
Sql Dat aAdapt er Obj DA = new Sql Dat aAdapt er ( sSQLPedi dos, sConexi on) ;
Obj DA. Fi l l ( odsPedi dos, " Or der s" ) ;

/ / Se r el l ena el Dat aSet con l as l i neas del Pedi do ( Or der Det ai l s)
st r i ng sSQLLi neas = " SELECT * FROM [ Or der Det ai l s] " ;
Obj DA. Sel ect Command. CommandText = sSQLLi neas;
Obj DA. Fi l l ( odsPedi dos, " Or der Det ai l s" ) ;

/ / Se est abl ece l a r el aci n ent r e l as ent i dades en el Dat aSet
Dat aCol umn Obj Col Pedi dos =
odsPedi dos. Tabl es[ " Or der s" ] . Col umns[ " Or der I D" ] ;
Dat aCol umn Obj Col Li neas =
odsPedi dos. Tabl es[ " Or der Det ai l s" ] . Col umns[ " Or der I D" ] ;
Dat aRel at i on Obj Rel aci on = new
Dat aRel at i on( " r el Pedi dos" , Obj Col Pedi dos, Obj Col Li neas) ;
odsPedi dos. Rel at i ons. Add( Obj Rel aci on) ;

/ / Se vi ncul a a l os Dat aGr i ds l a i nf or maci n
dat aGr i d1. Dat aSour ce = odsPedi dos;
dat aGr i d1. Dat aMember = " Or der s" ;
dat aGr i d2. Dat aSour ce = odsPedi dos;
dat aGr i d2. Dat aMember = " Or der s. r el Pedi dos" ;
}
Y el resultado se presenta en la siguiente figura:
Marco Besteiro y Miguel Rodrguez ADO.NET
43/57

Figura 24.31. Formulario Maestro-Detalle de Pedidos y lneas de pedidos
Este ejemplo tambin se puede realizar utilizando los controles de conexin, adaptacin y
contenedor de datos incluidos en el Visual Studio .NET.
B) Para una base de datos Access
Supnga que se desea realizar un formulario Maestro-Detalle de la base de datos Neptuno en
Access, pero esta vez se utilizarn los controles de Visual Studio.
En primer lugar se agrega la conexin Ol eDbConnect i on1 a la base de datos Neptuno y
despus se despliega la conexin en el explorador de conexiones y se arrastran al formulario
las tablas Pr oduct os y Pr oveedor es. Entonces se observa como se crean dos objetos
Dat aAdapt er .
Se elige uno cualquiera de los dos Dat aAdapt er y se genera el conjunto de datos o Dat aSet
desde las propiedades del mismo. En la ventana del asistente de la generacin del Dat aSet se
elige tambin el otro Dat aAdapt er .
Marco Besteiro y Miguel Rodrguez ADO.NET
44/57

Figura 24.32 Asistente para generar un Dat aSet a partir de dos objetos Dat aAdapt er .
Una vez que el Dat aSet ha sido generado, se procede a crear la relacin entre las tablas
generadas en el Dat aSet -Pr oduct os y Pr oveedor es- que posteriormente rellenarn los
Dat aGr i d del formulario. Para crear la relacin se selecciona el campo IDProveedor de la
tabla Pr oveedor es y se accede al men contextual mediante el botn derecho para crear una
relacin que relaciona un proveedor con varios productos.

Figura 24.33. Relacin de las tablas Pr oveedor es y Pr oduct os en el Dat aSet .
Marco Besteiro y Miguel Rodrguez ADO.NET
45/57
Se accede a la propiedad Dat aSour ce del Dat aGr i d1 que es donde se quiere exponer los
proveedores, y se selecciona el dat aSet 11 como valor y en la propiedad Dat aMember se
selecciona Pr oveedor es.

Figura 24.34. Propiedad Dat aSour ce del Dat aGr i d.
En el caso del Dat aGr i d2 se rellena la propiedad Dat aSour ce con dat aSet 11 y la propiedad
Dat aMember con Pr oveedor es. Pr oveedor esPr oduct os, que de esta forma se marca el
vinculo entre los dos controles Dat aGr i d. Si se rellena la propiedad Dat aMember con el valor
Pr oduct os, en el Dat aGr i d2 apareceran todos los productos, y no los del proveedor
seleccionado en el Dat aGr i d1.
Ahora solo falta rellenar el Dat aSet , que se realizar al cargar el formulario, mediante los dos
objetos Ol eDbDat aAdapt er , uno para cargar la tabla proveedores y otro para cargar la tabla
productos.
pr i vat e voi d For m1_Load( obj ect sender , Syst em. Event Ar gs e)
{
ol eDbDat aAdapt er 1. Fi l l ( dat aSet 11) ;
ol eDbDat aAdapt er 2. Fi l l ( dat aSet 11) ;
}
Marco Besteiro y Miguel Rodrguez ADO.NET
46/57

Figura 24.35. Formulario Maestro-Detalle de Pr oveedor es y Pr oduct os.
Este ejemplo se ha realizado utilizando los controles, herramientas y asistentes que
proporciona Visual Studio .NET, pero tambin se podra haber realizado de forma similar al
ejemplo anterior -en SQL Server-, que no utiliza ningn control de datos .NET, ni tampoco
asistentes.
La clase DataSet y XML
La clase Dat aSet es la nica clase de la plataforma .NET que puede recoger datos de una
fuente en XML y enviarlos en el mismo formato. Para realizar estas acciones un objeto
Dat aSet utiliza el mtodo Get Xml que devuelve una representacin XML del Dat aSet pero
no incluye la informacin del esquema (para ello se deber utilizar el mtodo
Get Xml Schema) .
Los mtodos del Dat aSet para leer son ReadXml que lee tanto los datos como el esquema, y el
mtodo ReadXml Schema que solo se utiliza parta leer la informacin del esquema.
En el siguiente ejemplo se rellena un objeto Dat aSet desde un fichero XML.
St r i ng st r Fi cher o = C: \ XML\ ej empl o. xml
Syst em. I O. St r eamReader Obj SR = new Syst em. I O. St r eamReader ( st r Fi cher o) ;
Dat aSet Obj DS = new Dat aSet ( ) ;
Obj DS. ReadXml ( Obj SR) ;
Obj SR. Cl ose( ) ;

El mtodo Wr i t eXml se utiliza para enviar el contenido del Dat aSet a un objeto
St r eamWr i t er en formato XML ; es ms rpido que escribir lo que devuelve el mtodo
Get Xml y se puede utilizar independientemente de tener la informacin del esquema. En caso
de querer escribir la informacin del esquema se utilizar el mtodo Wr i t eXml Schema.
Marco Besteiro y Miguel Rodrguez ADO.NET
47/57
El objeto Dat aSet tiene las propiedades Namespace que establece u obtiene el namespace
usado cuando se lee o escribe el documento XML, y Pr ef i x que recoge o establece el prefijo
XML que sirve de alias del namespace del Dat aSet .
Para crear un Dat aSet adems de hacerlo con el mtodo Fi l l del Dat aAdapt er , se puede
partir de cdigo XML+XSD. Tambin existen otros objetos aparte del Dat aSet leer
informacin en XML como son Xml Reader , Text Reader o St r eamReader .
Syst em. Xml . Xml Reader ;
Syst em. I O. St r eamReader ;
Syst em. I O. Text Reader
En Visual Studio .NET se puede ver el esquema del objeto Dat aSet , utilizando la opcin
correspondiente.

Figura 24.36. Representacin en XML del Dat aSet de pedidos.
La clase DataView
Un objeto de la clase Dat aVi ew representa una vista ordenada y/o filtrada de un objeto
Dat aTabl e y se utiliza mucho cuando se desea vincular datos con los WebFor ms (Formularios
Web) o los Wi nFor ms (Formularios Windows).
Un objeto Dat aVi ew contiene objetos Dat aRowVi ew que tiene como propiedades importantes
I t em(ndice) para acceder a la fila deseada y Count para recoger el nmero total de filas.
Las principales acciones que se pueden realizar con un objeto Dat aVi ew son la de filtrar y
ordenar. Para filtrar es posible utilizar las propiedades RowFi l t er para obtener o establecer la
expresin para filtrar las filas, o la propiedad RowSt at eFi l t er que recoge el estado del filtro.
Para ordenar se utilizan las propiedades Sor t , que es la expresin de cadena que se utiliza
para ordenar, y Appl yDef aul t Sor t que indica si se utiliza la ordenacin por defecto.
Marco Besteiro y Miguel Rodrguez ADO.NET
48/57
A continuacin se realiza un ejemplo de filtro:
pr i vat e voi d Fi l t r ar Fi l as( )
{
i nt i ;

/ / Se cr ea un Dat aTabl e con una col umna.
Dat aTabl e Obj Tabl a = new Dat aTabl e( " Tabl a" ) ;
Dat aCol umn Obj Col umna = new Dat aCol umn( " Col umna" ) ;
Obj Tabl a. Col umns. Add( Obj Col umna) ;

/ / Se aaden 10 f i l as.
Dat aRow Obj Fi l a;
f or ( i = 0; i < 10 ; i ++)
{
Obj Fi l a = Obj Tabl a. NewRow( ) ;
Obj Fi l a[ " Col umna" ] = " i t em" + i ;
Obj Tabl a. Rows. Add( Obj Fi l a) ;
}
Obj Tabl a. Accept Changes( ) ;

/ / Cr ear un Dat aVi ew con l a Tabl a.
Dat aVi ew Obj Vi st a = new Dat aVi ew( Obj Tabl a) ;

/ / Cambi ar el val or de una f i l a
Obj Tabl a. Rows[ 1] [ " Col umna" ] = " Hel l o" ;

/ / Aadi r una f i l a
Obj Fi l a = Obj Tabl a. NewRow( ) ;
Obj Fi l a[ " Col umna" ] = " Wor l d" ;
Obj Tabl a. Rows. Add( Obj Fi l a) ;

/ / Est abl ece el RowSt at eFi l t er par a ver sol o l as f i l as
/ / aadi das y modi f i cadas.
Obj Vi st a. RowSt at eFi l t er =
Dat aVi ewRowSt at e. Added | Dat aVi ewRowSt at e. Modi f i edCur r ent ;

/ / Muest r a l as f i l as
Most r ar Vi st a( Obj Vi st a, " Reci n modi f i cada y aadi da" ) ;

/ / Est abl ece el f i l t r o par a most r ar el val or or i gi nal
/ / de l as f i l as modi f i cadas
Obj Vi st a. RowSt at eFi l t er =Dat aVi ewRowSt at e. Modi f i edOr i gi nal ;
Most r ar Vi st a( Obj Vi st a, " Val or Or i gi nal " ) ;

/ / Bor r ar t r es f i l as.
Obj Tabl a. Rows[ 1] . Del et e( ) ;
Obj Tabl a. Rows[ 2] . Del et e( ) ;
Obj Tabl a. Rows[ 3] . Del et e( ) ;
Marco Besteiro y Miguel Rodrguez ADO.NET
49/57

/ / Est abl ece el RowSt at eFi l t er par a ver sol o l as f i l as
/ / aadi das y modi f i cadas
Obj Vi st a. RowSt at eFi l t er =Dat aVi ewRowSt at e. Del et ed;
Most r ar Vi st a( Obj Vi st a, " Del et ed" ) ;

/ / Est abl ece el f i l t r o par a most r ar sol o l as en cur so
Obj Vi st a. RowSt at eFi l t er =Dat aVi ewRowSt at e. Cur r ent Rows;
Most r ar Vi st a( Obj Vi st a, " En Cur so" ) ;

/ / Est abl ece el f i l t r o par a most r ar sol o l as f i l as que no cambi an
Obj Vi st a. RowSt at eFi l t er =Dat aVi ewRowSt at e. Unchanged;
Most r ar Vi st a( Obj Vi st a, " No cambi an" ) ;

/ / Est abl ece el f i l t o par a most r ar l as f i l as or i gi nal es.
Obj Vi st a. RowSt at eFi l t er =Dat aVi ewRowSt at e. Or i gi nal Rows ;
Most r ar Vi st a( Obj Vi st a, " Fi l as Or i gi nal es" ) ;
}

pr i vat e voi d Most r ar Vi st a( Dat aVi ew dv, st r i ng l abel )
{
Consol e. Wr i t eLi ne( " \ n" + l abel ) ;
f or ( i nt i = 0; i < dv. Count ; i ++) {
Consol e. Wr i t eLi ne( dv[ i ] [ " Col umna" ] . ToSt r i ng( ) ) ;
}

Adems el objeto Dat aVi ew soporta las operaciones generales de edicin por medio de las
propiedades Al l owNew, Al l owDel et e y Al l owEdi t para establecer las operaciones bsicas y
los mtodos AddNew y Del et e para agregar una fila y eliminarla respectivamente.
Las operaciones de bsqueda del objeto Dat aVi ew vienen reflejadas por el mtodo Fi nd que
devuelve el ndice de la fila encontrada por los criterios de filtrado.
Por ejemplo:
Dat aVi ew Obj DV;
I nt eger i ;
Obj ect val s[ 1] ;
Dat aTabl e Obj Tabl a;

Obj DV = New Dat aVi ew( Obj Tabl a) ;
Obj DV. Sor t = " Cust omer s" ;

/ / Encont r ar el cl i ent e l l amado I sabel Mar t i n.
val s[ 0] = " I sabel " ;
val s[ 1] = " Mar t i n" ;
i = Obj DV. Fi nd( val s) ;
Consol e. Wr i t eLi ne( Obj DV[ i ] ) ;

Marco Besteiro y Miguel Rodrguez ADO.NET
50/57
Se puede personalizar diferentes vistas con un objeto Dat aTabl e y utilizar un objeto
Dat aVi ew para representar una de esas vistas
El control DataView en Visual Studio .NET
Para crear un control Dat aVi ew basta con arrastrarlo al formulario. Una vez asignado al
formulario se establece la propiedad Tabl e donde se selecciona la tabla del Dat aSet deseada.

Figura 24.37. Propiedades del control Dat aVi ew. Seleccin de la Tabla.

La clase DataRelation
Una relacin es un vinculo dinmico establecido entre una o ms columnas del mismo tipo de
dos tablas y el objeto Dat aRel at i on representa una relacin maestro-detalle entre dos tablas.
Una vez que se ha establecido la relacin entre dos tablas cualquier cambio que infrinja la
relacin provocar una excepcin. Las relaciones admiten cambios en cascada desde la tabla
maestro a la tabla detalle aadiendo un objeto For ei gnKeyConst r ai nt a la coleccin de
restricciones del objeto Dat aTabl e. A continuacin se muestra un ejemplo en el que se define
una relacin de actualizacin en cascada.
/ / Supnga que se t i ene un Dat aSet l l amado Obj DS
/ / con l as t abl as Or der s y Or der Det ai l s
Dat aCol umn Obj Col Maest r o = obj DS. Tabl es( Or der s) . Col umns( Or der I D) ;
Dat aCol umn Obj Col Det al l e = obj DS. Tabl es( Or der Det ai l s) . Col umns( Or der I D) ;
For ei gnKeyConst r ai nt Obj FK = new For ei gnKeyConst r ai nt ( FK_OD_Or der I D,
Obj Col Maest r o, Obj Col Det al l e) ;

Marco Besteiro y Miguel Rodrguez ADO.NET
51/57
/ / Se cr ea l a act ual i zaci n en cascada
Obj FK. Updat eRul e = Rul e. Cascade;

/ / Se aade a l a t abl a Or der Det ai l s del Dat aSet l a r est r i cci n
Obj DS. Tabl es( Or der Det ai l s) . Const r ai nt s. Add( Obj FK)

A partir de aqu, estando en una fila de la tabla maestro es posible acceder a las filas de la
tabla detalle directamente utilizando la el mtodo Get Chi l dRows del objeto Dat aRow, que
devuelve un ar r ay de objetos Dat aRow.
Si se utilizan relaciones se debe tener en cuenta que no son transitivas, de tal forma que si la
tabla A est relacionada con la tabla B, y por otro lado la tabla B est relacionada con la tabla
C, no se puede decir que las tablas A y C estn relacionadas.
Creacin de una relacin con Visual Studio .NET.
Para crear una relacin en un Dat aSet desde el diseador de Visual Studio .NET basta con
acceder a un Dat aSet donde existan varias tablas y seleccionar la opcin de agregar relacin.
Una vez realizada esta accin se pueden configurar los elementos tanto primario como
secundario, y las columnas que van a formar parte de la relacin. Adems se pueden
configurar las reglas para actualizar o eliminar en cascada.
Marco Besteiro y Miguel Rodrguez ADO.NET
52/57

Figura 24.38. Edicin de una relacin
La representacin de la relacin se puede observar en la siguiente figura.

Figura 24.39. Representacin grfica del esquema del Dat aSet con Visual Studio
Marco Besteiro y Miguel Rodrguez ADO.NET
53/57
Una vez que la relacin ha sido establecida se puede observar en el ejemplo maestro-detalle
anterior, que al actualizar el valor de la columna Or der I D 10251 por el valor 21,
automticamente las filas relacionas de la tabla Or der Det ai l s cambian a 21, debido a la
configuracin en cascada, para la actualizacin, establecida en la relacin.

Figura 24.40. Actualizacin en cascada en el formulario maestro-detalle
Trabajando con un objeto DataSet
Las vistas con filtro permiten implementar esquemas del tipo maestro-detalle consiguiendo
cargar en el mismo Dat aSet las tablas con la informacin del maestro y del detalle,
posteriormente se establecen dos vistas con filtro una para la tabla maestra y otra para la tabla
detalle. Con la versin anterior de ADO esto no era posible, y la nica forma de traer toda la
informacin era repetir los campos de la tabla maestro tantas veces como detalles tuviese,
mediante una vista, consiguiendo peores prestaciones que con ADO .NET.
El mtodo Sel ect de la clase Dat aTabl e permite obtener un ar r ay o conjunto de filas que
coinciden con un criterio especificado y bajo un orden fijado.
Cada Dat aRow tiene una propiedad RowSt at e que puede ser examinada para determinar su
estado. Los posibles estados de esta propiedad estn representados en la siguiente tabla.
Estado
Descr i pci n
Unchanged
No se han producido cambios desde la ultima llamada a
Accept Changes
Added
La fila ha sido aadida a la tabla pero no se ha llamado a
Marco Besteiro y Miguel Rodrguez ADO.NET
54/57
Accept Changes
Modi f i ed
Algn elemento de la fila ha sido cambiado
Del et ed
La fila ha sido eliminada de la tabla utilizando el mtodo Del et e
Det ached
La fila ha sido eliminada pero no se ha llamado a Accept Changes o la
fila ha sido creada pero no ha sido aadida a la tabla

Una de las formas de aadir nuevas filas a un objeto Dat aTabl e es crear un objeto Dat aRow,
rellenarlo y luego agregarlo al objeto Dat aTabl e.
Por ejemplo:
Dat aRow Obj Fi l a = Obj Tabl a. NewRow( )
Obj Fi l a[ " DNI " ] = 9999999;
Obj Fi l a[ " Nombr e" ] = Al var o;
Obj Fi l a[ " Apel l i dos" ] = Gar ci a Lopez;
Obj Fi l a[ " Emai l " ] = agar ci a@empr esa. es;
Obj Tabl a. Rows. Add( Obj Fi l a) ;

Para borrar filas de un objeto Dat aTabl e basta seleccionar una serie de filas y luego llamar al
mtodo Del et e o Remove.
Del et e marca la fila como borrada pero mantiene el registro original y permite deshacer la
eliminacin.
Remove borra fsicamente la fila de la tabla. Es como llamar al mtodo Del et e y
posteriormente aceptar los cambios mediante Accept Changes.
Las acciones de borrado de filas se realizan en el objeto Dat aTabl e que est en memoria. A la
hora de actualizar con el origen de datos se debe tener en cuenta que una fila borrada con
Remove no es percibida como borrada y por lo tanto no es borrada del origen de datos. Sin
embargo la fila que es borrada con el mtodo Del et e es borrada en el origen de datos.
El hecho de marcar una fila como borrada (Del et e) indica que la fila ser eliminada de la
tabla despus de llamar a Accept Changes. Cuando se realiza esta operacin la propiedad
RowSt at e cambia al estado Del et ed. Si se invoca el mtodo Rej ect Changes entonces la
propiedad RowSt at e volver a su estado inicial.
En el caso de que se borre una fila que justo se haba aadido a la tabla y que haba sido
marcada como New utilizando Del et e, Del et e funciona como Remove.
Cuando se desea reconciliar las tablas en memoria con las tablas en el origen de datos se
utiliza el mtodo Get Changes para crear un segundo Dat aSet en local que contiene slo los
cambios que se van a hacer (filas marcadas). Posteriormente se examina la propiedad
HasEr r or s del Dat aSet para ver si existen errores en alguna de las filas de las tablas del
propio Dat aSet . Si se producen errores, se deber reconciliar antes de actualizar los datos del
Dat aSet (memoria) con el origen de datos. Para recoger los errores se utiliza el mtodo
Get Er r or s que devuelve los objetos Dat aRow que tienen errores. Si se posible reconciliar los
Marco Besteiro y Miguel Rodrguez ADO.NET
55/57
errores entonces se llama al mtodo Mer ge para volver a incorporar los cambios del segundo
Dat aSet al primero.
Para actualizar el origen de datos y refrescar la tabla se llama al mtodo Accept Changes y en
caso de que se desee deshacer la actualizacin se llamar al mtodo Rej ect Changes.
El mtodo Accept Changes se puede aplicar al objeto Dat aSet , al objeto Dat aTabl e o al
objeto Dat aRow, y funciona en cascada, es decir, que si se aplica sobre el Dat aSet , se est
aplicando sobre todas las tablas del Dat aSet , y si se aplica sobre el objeto Dat aTabl e, se est
aplicando sobre todas las filas de esa tabla.
Cuando se llama al mtodo Accept Changes
Los objetos Dat aRow que estn todava en edicin se almacenan
La propiedad RowSt at e de cada fila cambia adecuadamente.
Las filas nuevas y modificadas pasan a ser filas normales y las borradas (Del et ed)
pasan a eliminadas definitivamente.
Cuando se llama al mtodo Rej ect Changes se cancelan las filas que estaban en edicin, se
eliminan los nuevos registros y las filas modificadas o borradas (Del et ed) pasan a su estado
original.
En cuanto a la actualizacin del origen de datos, se recomienda utilizar como primera opcin
comandos SQL y como segunda opcin la actualizacin tipo Batch o masiva que consiste en
un proceso que extrae datos del lado cliente y los actualiza en la base de datos. Este tipo de
actualizacin (Batch) se puede realizar con un conjunto de objetos Dat aRow, con un objeto
Dat aSet o con un objeto Dat aTabl e. Para realizar la actualizacin tipo Batch se ha de utilizar
el mtodo Updat e del objeto Dat aAdapt er que realiza una llamada a los comandos I NSERT,
UPDATE y DELETE para cada fila agregada, actualizada o borrada. Es conveniente utilizar el
mtodo Get Changes para enviar al origen de datos un Dat aSet ms pequeo.
Ejemplo de actualizacin en Visual Studio .NET
Para realizar este ejemplo se ha de crear un proyecto nuevo en Visual Studio .NET, con un
formulario y se ha de aadir una conexin a la base de datos Northwind en SQL Server. Se
agrega, despus, un control Dat aAdapt er al formulario utilizando una sentencia SQL sobre la
tabla de Pedi dos:
SELECT
Or der I D,
Cust omer I D,
Empl oyeeI D,
Or der Dat e,
Requi r edDat e,
Shi ppedDat e,
Shi pVi a
FROM Or der s
Marco Besteiro y Miguel Rodrguez ADO.NET
56/57
Una vez generado con asistente el control Dat aAdapt er , entonces se generan
automticamente las propiedades Del et eCommand, I nser t Command y Updat eCommand.
Posteriormente con el control Dat aAdapt er se genera el control Dat aSet , y se agrega un
control Dat aGr i d y un control But t on al formulario. Ms adelante se vincula el control
Dat aGr i d con la tabla Or der s del Dat aSet y se prepara el evento Load del formulario para
que se rellene el objeto Dat aSet que automticamente rellenar el Gr i d.
pr i vat e voi d For m1_Load( obj ect sender , Syst em. Event Ar gs e)
{
sql Dat aAdapt er Pedi dos. Fi l l ( dat aSet Pedi dos, " Or der s" ) ;
}

Posteriormente se agregan tres filas (Dat aRow) al formulario.

Figura 24.41. Actualizacin tipo Batch de tres filas
En este instante la informacin no est en la base de datos, est en memoria en el Dat aSet , de
tal manera que si se cierra el formulario la informacin se pierde y no se actualiza en la base
de datos.
Para actualizar las tres filas en un nico proceso se puede utilizar un botn como el que se ha
definido en este ejemplo.
pr i vat e voi d but t onAct ual i zar _Cl i ck( obj ect sender , Syst em. Event Ar gs e)
{
i f ( dat aSet Pedi dos. HasChanges( ) )
{
t r y
{
Dat aSet dat aSet Cambi os = dat aSet Pedi dos. Get Changes( ) ;
sql Dat aAdapt er Pedi dos. Updat e( dat aSet Cambi os, " Or der s" ) ;
dat aSet Pedi dos. Accept Changes( ) ;
Marco Besteiro y Miguel Rodrguez ADO.NET
57/57
}
cat ch ( DBConcur r encyExcept i on dbEr r or )
{
/ / Resol ver el conf l i ct o
MessageBox. Show( " Er r or : " + dbEr r or . ToSt r i ng( ) ) ;
}
}
}
En este ejemplo, primero se pregunta si se han realizado cambios, y si esto es as se utiliza un
segundo Dat aSet para tratar solo las filas alteradas. Luego se actualizan en la base de datos
dichas filas.