You are on page 1of 49

Prctica 3 Acceso a datos con ADO .

NET
Comercio Electrnico
Universidad de Oviedo

Introduccin a ADO .NET

ADO .NET es la parte de la plataforma .NET que se encarga del acceso a datos
No es exclusivo de aplicaciones Web, pero est pensado teniendo muy en cuenta ese uso Internamente, usa XML para transmitir los datos
As, cualquier aplicacin que sea capaz de leer un fichero XML podra trabajar con los datos obtenidos a travs de ADO .NET

Normalmente, lo usaremos para trabajar con bases de datos relacionales

Comercio Electrnico (EUITIO). Curso 2007-2008

Bases de datos relacionales


Permiten organizar la informacin en tablas que se relacionan entre s Cada tabla tendr una serie de registros (las filas) Y cada registro estar formado por campos (las columnas)

Empleado
IDEmpleado 1 2 3 Nombre Ana Jorge Luca PrimerApellido Gonzlez Fernndez Palacios SegundoApellido Gil Garca Salvador Antiguedad 01/03/2001 10/09/1998 01/05/2003
3

Comercio Electrnico (EUITIO). Curso 2007-2008

Elementos involucrados

Conexin a la base de datos


En primer lugar, es necesario conectarnos a la base de datos, mediante un objeto de tipo Connection

A continuacin, se ejecuta la sentencia SQL


SQL es un lenguaje para el acceso a bases de datos relacionales
Puede ser una consulta (SELECT), una insercin (INSERT), actualizacin (UPDATE) o borrado (DELETE)

En el caso de que sea una consulta, devolver unos resultados que trasformaremos a HTML
4

Comercio Electrnico (EUITIO). Curso 2007-2008

Panormica de ADO .NET

Comercio Electrnico (EUITIO). Curso 2007-2008

Espacios de nombres

Dnde estn las clases necesarias para trabajar con ADO .NET?
De forma general, en el espacio de nombres System.Data Luego, depende del tipo de base de datos que vayamos a utilizar
Espacio de nombres
System.Data.SqlClient System.Data.OleDb System.Data.Odbc System.Data.OracleClient

Base de datos Microsoft SQL Server OLE DB ODBC Oracle


6

Comercio Electrnico (EUITIO). Curso 2007-2008

Espacios de nombres

Cada uno de ellos tiene dentro las mismas clases bsicas


Esto permite optimizar la implementacin para una base de datos concreta (por ejemplo, SQL Server u Oracle)

OLE DB y ODBC permiten acceder a cualquier base de datos


No estn particularizadas para ninguna

Nosotros emplearemos OLE DB


Y, por sencillez, emplearemos como base de datos Microsoft Access

Comercio Electrnico (EUITIO). Curso 2007-2008

Establecimiento de la conexin

Usaremos la clase OleDbConnection Le pasamos una cadena de conexin con los parmetros necesarios
OleDbConnection conexion = new OleDbConnection( "Provider=Microsoft.JET.OLEDB.4.0;Data Source=" + Server.MapPath(@App_Data\libreria.mdb"));

En el caso de Microsoft Access, el proveedor es siempre el que se indica arriba Data Source indica la ubicacin fsica de la base de datos
Si la direccin es relativa (no absoluta) a la pgina .aspx actual, hay que hacer uso de Server.MapPath

Comercio Electrnico (EUITIO). Curso 2007-2008

Abrir la conexin
Para establecer (abrir) la conexin, no basta con lo anterior Es necesario llamar al mtodo Open

Si no se puede establecer la conexin, se lanzar una excepcin


conexin.Open();

Comercio Electrnico (EUITIO). Curso 2007-2008

Ejercicio

Crear una base de datos en Access que slo tenga una tabla
Por ejemplo, una tabla Libro que contenga:
El cdigo del libro (la clave primaria de la tabla) El ttulo El precio

Crear un WebForm (una pgina .aspx) que trate de establecer una conexin
Lo normal es hacerlo en el evento Load de la pgina Si no sale nada, es que la conexin se abri correctamente

Comercio Electrnico (EUITIO). Curso 2007-2008

10

Ejecucin de una consulta


Veamos ahora cmo podemos realizar una consulta sobre esa conexin que hemos abierto Habr que hacer una consulta SQL Y obtener los resultados de dicha consulta

Comercio Electrnico (EUITIO). Curso 2007-2008

11

Sentencia SELECT de SQL


Obtendr los datos pedidos que cumplan las condiciones especificadas El formato general es
SELECT campo1, campo2, campo3... FROM tabla1, tabla2... WHERE condicin

Ejemplos:
SELECT * FROM Libro SELECT Titulo FROM Libro WHERE Precio < 20 AND Autor = Pedro Salinas

Comercio Electrnico (EUITIO). Curso 2007-2008

12

Resultados

ADO .NET proporciona dos tipos de objetos para acceder a los resultados de una consulta:
DataReader DataSet

Comercio Electrnico (EUITIO). Curso 2007-2008

13

DataReader

Un objeto de este tipo est siempre conectado a la base de datos, hasta que lo cerramos
Es decir, mantiene una conexin abierta mientras trabajemos con l

Slo permite leer los registros devueltos, secuencialmente


De uno en uno, y siempre hacia delante, por medio de su operacin Read

Comercio Electrnico (EUITIO). Curso 2007-2008

14

DataSet
Es una representacin en memoria de la base de datos completa (mltiples tablas, esquema, relaciones y restricciones) Adems, es desconectado

Una vez que hace la consulta, cierra la conexin con la BD

Contiene una coleccin de objetos DataTable, los cuales a su vez tienen una coleccin de DataRow
DataSet
*
tablas

DataTable

*
filas

DataRow

Comercio Electrnico (EUITIO). Curso 2007-2008

15

DataSet

Se puede acceder a los elementos de esas dos colecciones como se hara con cualquier otra coleccin en C#
Con un bucle foreach Mediante un ndice O con la clave primaria (para ir a las filas) o el nombre del campo (para ir a un campo de una fila concreta)

Gracias a su naturaleza desconectada, un DataSet se puede enviar por la red como un flujo XML

Comercio Electrnico (EUITIO). Curso 2007-2008

16

DataSet o DataReader?

Dada la naturaleza de las aplicaciones Web (donde lo habitual es hacer una consulta, transformar esos datos a HTML y cerrar la conexin), el uso de un DataReader puede ser ms apropiado, por eficiencia (rapidez)
A pesar de la mayor flexibilidad del DataSet Este ltimo est ms indicado para aplicaciones cliente/servidor tpicas, donde se estn intercambiando datos continuamente

Comercio Electrnico (EUITIO). Curso 2007-2008

17

DataSet
Veamos un ejemplo de cmo sera una consulta empleando un DataSet (y qu otras clases son necesarias entonces).

Adaptador

Decamos que el DataSet no sabe nada acerca del origen de los datos
Se comunica con ellos a travs de un DataAdapter

Comercio Electrnico (EUITIO). Curso 2007-2008

19

DataAdapter

Tiene estas cuatro propiedades:


SelectCommand UpdateCommand InsertCommand DeleteCommand

En el caso del OleDbDataAdapter, son de tipo


OleDbCommand

Comercio Electrnico (EUITIO). Curso 2007-2008

20

OleDbCommand

Creamos un objeto de este tipo con la sentencia SQL que queramos ejecutar:
String consultaSql = "SELECT * FROM Libro";
OleDbCommand consulta = new OleDbCommand(consultaSql, conexion);

Y se lo asignamos a la propiedad correspondiente del adaptador:


OleDbDataAdapter adaptador = new OleDbDataAdapter(); adaptador.SelectCommand = consulta;

Comercio Electrnico (EUITIO). Curso 2007-2008

21

Ejecutar la consulta

Una vez hecho lo anterior, slo falta ejecutar la consulta


Es decir, llenar el DataSet con los datos obtenidos Se hace con el mtodo Fill del adaptador, al que le pasamos como parmetro el DataSet
DataSet resultados = new DataSet(); adaptador.Fill(resultados, "Libro");

Comercio Electrnico (EUITIO). Curso 2007-2008

22

Procesar los resultados


Recorremos las colecciones antes mencionadas, generando la salida HTML deseada Por ejemplo:

foreach (DataRow fila in resultados.Tables["Libro"].Rows)

{
... fila["Titulo"]... }

Comercio Electrnico (EUITIO). Curso 2007-2008

23

Ejemplo: Listado1.aspx
Va aadiendo a una etiqueta (Label) el ttulo de cada libro de la tabla, junto con su precio Ntese que no estamos abriendo la conexin

Por qu?
Porque lo hace el propio DataSet (la abre para realizar la consulta y la cierra inmediatamente a continuacin)

Comercio Electrnico (EUITIO). Curso 2007-2008

24

DataReader
Veamos ahora el mismo ejemplo pero empleando un DataReader en vez de un DataSet.

DataReader

Muchas veces, en las aplicaciones Web, no merece la pena pagar por la flexibilidad que ofrece DataSet
Es ms difcil de usar y tiene peor rendimiento que el DataReader

Al igual que el DataSet, el DataReader tambin se usa en conjuncin con las clases Command
String consultaSql = "SELECT * FROM Libro"; OleDbCommand consulta = new OleDbCommand(consultaSql, conexion); OleDbDataReader resultados = consulta.ExecuteReader();

Comercio Electrnico (EUITIO). Curso 2007-2008

26

Procesar los resultados

Hay que ir leyendo uno a uno los registros devueltos con el mtodo Read de DataReader
while (resultados.Read())
{ ... resultados["Titulo"]...

Comercio Electrnico (EUITIO). Curso 2007-2008

27

Ejemplo: Listado2.aspx

Lo mismo de antes slo que ahora empleando un


DataReader

Ahora s hay que abrir (y cerrar) la conexin

Comercio Electrnico (EUITIO). Curso 2007-2008

28

Ejercicio

Modificar el ejemplo anterior para que ahora se muestren slo los libros con un precio menor que el indicado por el usuario
Habr que incluir un campo de texto para que el usuario introduzca el precio mximo Y un botn para realizar la consulta
Que ahora se har al pulsar el botn, no al cargar la pgina

Comercio Electrnico (EUITIO). Curso 2007-2008

29

Controles enlazados a datos


Aunque con lo anterior podra bastarnos para mostrar pginas dinmicas sencillas, como los listados anteriores, ASP .NET proporciona unos controles especficos para mostrar datos, ms sofisticados. Veremos unas nociones sobre ellos.

Introduccin

En enlazado de datos (data binding) consiste en asociar un origen de datos a un control


ste se rellenar dinmicamente con los datos de aqul Los datos normalmente se asocian a una propiedad determinada del control

Los controles enlazados (data bound controls) constituyen una de las caractersticas ms potentes de ASP .NET para el desarrollo de aplicaciones Web

Comercio Electrnico (EUITIO). Curso 2007-2008

31

Posibles orgenes de datos


Es importante hacer notar que slo las clases de ADO .NET para acceso a bases de datos pueden ser orgenes de datos Un control de este tipo se puede enlazar a:

Colecciones normales de .NET


Arrays, diccionarios, listas enlazadas, tablas hash, pilas, colas

Estructuras de datos definidas por el usuario


Que implementen la interfaz ICollection

Clases orientadas a bases de datos, como DataTable o


DataSet

Comercio Electrnico (EUITIO). Curso 2007-2008

32

Sintaxis
Una expresin de enlazado a datos es cualquier texto encerrado entre <%# y %> Un ejemplo muy tonto:

Label1.Text = <%# Hola, mundo %>;

(Ntese el uso de los distintos tipos de comillas)

Lo mismo, pero en el cdigo HTML de la pgina:


<asp:label runat=server Text=<%# dropdown.SelectedItem.Text %> />

Comercio Electrnico (EUITIO). Curso 2007-2008

33

Casos ms complejos (y tiles)


Lo normal es que usemos esta caracterstica para enlazar un control de lista o iterativo a uno o varios campos (columnas) de datos Controles de lista:

DropDownList, CheckBoxList, RadioButtomList y ListBox

Controles iterativos:
Repeater, DataList y DataGrid

Comercio Electrnico (EUITIO). Curso 2007-2008

34

DataGrid
Aunque este control sigue funcionando, en ASP .NET 2.0 es sustituido por otro ms potente, el GridView. Lo sigo comentando simplemente por si alguien sigue trabajando con ASP 1.0 (Visual Studio 2003, en vez del 2005).

DataGrid
Un control muy potente para mostrar datos enlazados en formato tabular Tiene muchsimas capacidades de formateado, ordenamiento por columnas, manejo de eventos, etctera Veremos un ejemplo muy sencillo simplemente para mostrar cmo se enlazan datos a un control

Comercio Electrnico (EUITIO). Curso 2007-2008

36

Ejemplo: Listado3a.aspx

Para enlazar el DataGrid con los resultados de ejecutar la consulta, basta con poner las siguientes dos lneas:
Datos.DataSource = resultados; Datos.DataBind();

Comercio Electrnico (EUITIO). Curso 2007-2008

37

GridView
Aprovecharemos este control para ver una caracterstica avanzada de ASP .NET 2.0: la posibilidad de extraer la cadena de conexin a la base de datos al fichero de configuracin (Web.config u otro).

Cadena de conexin

En el Web.config pondramos algo como esto:


<connectionStrings> <add name="Libreria" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=&quot;|DataDirectory|\Libreria.mdb&quot;" providerName="System.Data.OleDb" /> </connectionStrings>

Donde |DataDirectory| apunta a nuestro directorio App_Data


De esta manera, funcionar tanto en local, como en el servidor o en cualquier otra mquina

Comercio Electrnico (EUITIO). Curso 2007-2008

39

Acceder a la cadena de conexin

Desde el cdigo (C#):


string connectionString = ConfigurationManager.ConnectionStrings [Libreria"].ConnectionString;

Comercio Electrnico (EUITIO). Curso 2007-2008

40

Acceder a la cadena de conexin

Tambin podemos crear un origen de datos en la pgina .aspx:


<asp:SqlDataSource ID="Libreria" runat="server" ConnectionString="<%$ ConnectionStrings:Libreria %>"
ProviderName="<%$ ConnectionStrings:Libreria.ProviderName %>" SelectCommand="SELECT [CodigoLibro], [Titulo], [Precio] FROM [Libro] " />

En ese caso:
<asp:GridView ID="ListadoLibros" runat="server" DataSourceID="Libreria" AutoGenerateColumns="True">

</asp:GridView>

Comercio Electrnico (EUITIO). Curso 2007-2008

41

Ejemplo: Listado3b.aspx

Veamos cmo aadir un control GridView sin escribir una sola lnea de cdigo C#

Comercio Electrnico (EUITIO). Curso 2007-2008

42

Repeater

Repeater

Este control nos da total libertad de formateado HTML


Somos nosotros los encargados de decirle cmo se tiene que mostrar, mediante una serie de plantillas predefinidas Es til cuando no nos sirve el formato tabular del GridView, donde se muestra siempre una fila por registro devuelto

Comercio Electrnico (EUITIO). Curso 2007-2008

44

Plantillas

HeaderTemplate
Se visualiza una nica vez, antes de cualquier otra fila No puede contener datos enlazados

ItemTemplate
La ms habitual Determina el formato de salida de cada fila del origen de datos

AlternatingItemTemplate
Lo mismo para las filas alternas (por si queremos darles otro formato)

SeparatorTemplate
Lo que queremos que aparezca entre cada fila No puede tener datos enlazados

FooterTemplate
Una nica vez, al final de la tabla Tampoco puede contener datos enlazados

Comercio Electrnico (EUITIO). Curso 2007-2008

45

Acceder a los datos enlazados

La forma habitual es, en la pgina .aspx:


<%# Eval(Titulo) %>

En ASP .NET 1.0 la sintaxis era mucho ms farragosa (mediante el mtodo esttico DataBinder.Eval):
<%# DataBinder.Eval(Container.DataItem, Titulo) %>;

Comercio Electrnico (EUITIO). Curso 2007-2008

46

Ejemplo: Listado4.aspx

Lo de siempre pero con un Repeater

Comercio Electrnico (EUITIO). Curso 2007-2008

47

Ejercicio

Modificar el ejemplo anterior para que el ttulo de cada libro sea un enlace a otra pgina .aspx de la forma:
MostrarLibro.aspx?Codigo=<cdigo del libro>

sese un control HyperLink


Y el mtodo string.Concat para concatenar la parte fija del URL del enlace con el cdigo de cada libro

Comercio Electrnico (EUITIO). Curso 2007-2008

48

Ms informacin

What's New in ASP.NET Data Access


http://msdn2.microsoft.com/en-us/library/06t2w7da(VS.80).aspx

Comercio Electrnico (EUITIO). Curso 2007-2008

49

You might also like