+ Entity Framework
+ Entity Framework
NET
La tecnología ADO.NET -en la versión beta 1 se llamaba ADO+- es un modelo de proveedor más
sencillo que el par OLEDB / ADO y se integra perfectamente con XML. ADO.NET es la evolución de
ADO en la nueva plataforma .NET.
Las principales características de ADO.NET son:
Trabaja desconectado del origen de datos que se utilice.
Tiene una fuerte integración con XML y ASP .NET.
El uso de ADO.NET es independiente del lenguaje de programación que se utilice.
La tecnología 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.
Arquitectura de ADO.NET
Namespaces
ADO .NET se basa en los siguientes espacios de nombres de accesos a datos:
La clase Connection
Es la clase encargada de establecer la conexión con el origen de datos y tiene soporte automático
para pooling de conexiones. Dependiendo del origen de datos que se utilice se deberá utilizar
OleDbConnection o SqlConnection. Se entiende por pool de conexiones el conjunto de conexiones
“cacheadas” en el servidor.
La siguiente tabla describe los estados en los que se puede encontrar la conexión.
El proveedor sólo puede cambiar la cadena de conexión cuando está cerrada (Closed). Por otro
lado, los desarrolladores deberían utilizar el método Close cuando hayan acabado de utilizar la
conexión, ya que este método cierra la conexión y la devuelve al pool de conexiones. Sin embargo
el método Dispose cierra la conexión y destruye la instancia del objeto eliminándola del pool de
conexiones.
En función del proveedor de datos de la plataforma .NET que se utilice, se puede elegir entre los
clases Connection siguientes: OleDbConnection y SqlConnection.
Clase OleDbConnection
Esta clase representa una conexión al proveedor de datos OLE DB .NET. Las propiedades más
importantes que utiliza son:
ConnectionString para especificar el origen de datos
ChangeDatabase para cambiar la base de datos para conexiones abiertas.
ConnectionTimeout para obtener el tiempo de espera. Por defecto son 15 segundos. Si se
desea que sea ilimitado ha de asignársele el valor cero y sólo podrá cambiarse su valor a
través de la propiedad ConnectionString.
Si el estado de la conexión cambia -propiedad State- entonces se produce el evento
StateChange.
Clase SqlConnection
Esta clase representa una conexión a la base de datos SQL Server 7.0 o superior. Las propiedades
más importantes son las siguientes:
Si se produce una excepción en SQL (SqlException) mientras se ejecuta un comando
concreto, la conexión permanece abierta en caso de que el nivel de severidad sea menor
que 19. Con un nivel de severidad mayor que 20, la conexión se cierra y es necesario
reabrirla para continuar.
La propiedad ConnectionString especifica el origen de datos.
Un objeto SqlConnection lee la información de la conexión a través de la base de datos y
del origen de datos. No necesita leer información del proveedor como en el caso de OLE
DB .NET.
La propiedad ConnectionTimeout obtiene el tiempo de espera que por defecto son 15
segundos. Si se desea que sea ilimitado ha de asignársele el valor cero y solo podrá
cambiarse su valor a través de la propiedad ConnectionString.
Cuando se utiliza el método Close si existen transacciones pendientes en ese momento,
las deshace (RollBack).
Transacciones en ADO.NET
Para empezar una transacción en ADO .NET se llama al método BeginTransaction que acepta el
parámetro IsolationLevel (nivel de aislamiento) y/o el nombre, y devuelve un objeto transacción de
la clase OleDbTransaction o SqlTransaction dependiendo del proveedor que se utilice.
ObjCnn.Open();
// Comienza la transacción SqlTransaction ObjTran = ObjCnn.BeginTransaction();
try
{
// Ejecución de comandos
// Se ejecuta el Commit de la Transacción
ObjTran.Commit();
}
ObjCnn.Open();
// Comienza la transacción
OleDbTransaction ObjTran = ObjCnnOLE.BeginTransaction();
try
{
// Ejecución de comandos
// Se ejecuta el Commit de la Transacción
ObjTran.Commit();
}
catch (Exception ex)
{
// La transacción ha fallado
ObjTran.Rollback();
}
ObjCnnOLE.Close();
La clase Command
Un objeto de la clase Command al igual que un objeto de la clase Connection pertenece al
proveedor de acceso a datos de la plataforma .NET, así que a la hora de codificar se puede utilizar
la interfaz ICommand común a todos los proveedores (todos ellos la implementan), o las clases
específicas de alguno de los proveedores que proporciona la plataforma .NET.
Cuando se está utilizando un objeto Command se necesita que un objeto Connection haya sido
abierto. Siempre hay una transacción asociada a la conexión. Si se “resetea” la conexión entonces
el objeto transacción devuelve null. En principio, se puede cambiar la conexión sin problema
alguno para conectar con otro usuario o para conectar a otra fuente de datos, pero hay que tener
en cuenta que la transacción que subyace sea compatible con la conexión.
Para ejecutar un comando se necesita que haya una conexión válida abierta y dependiendo del
comportamiento que se desee dar al objeto Command se utilizará uno de los siguientes métodos:
ExecuteNonQuery: No devuelve un conjunto de registros sino que devuelve el número de
filas afectadas por la acción.
ExecuteReader: Devuelve un conjunto de registros de sólo lectura y “forward-only”. No se
informa del número de filas afectadas.
ExecuteScalar: Devuelve sólo el valor de la celda (0,0) del conjunto de registros.
Ejemplo
using (SqlConnection connection = new SqlConnection(connectionString))
{
// Create the Command and Parameter objects.
SqlCommand command = new SqlCommand(queryString, connection);
// command.Parameters.AddWithValue("@pricePoint", paramValue);
Es un ORM del conjunto de tecnologías de ADO.NET la que nos permite utilziar Orientación a
Objetos para almacenar información (Creas objetos de la clase y se guarda directamente en tablas
de BD sin escribir ningún query de SQL).
Ejemplo en clase:
Var contexto = new xxxxEntities();
Var alumnos = contexto.Alumnos.Where(a=>a.nombre.Startwith(“a”)).ToList())
Ejemplo:
using System;
using System.Collections.Generic;
using System.Data.Entity;
namespace Models
{
public class TiendaContext : DbContext
{
public DbSet<Cliente> Clientes { get; set; }
public DbSet<Producto> Productos { get; set; }
public DbSet<Pedido> Pedidos { get; set; }
public DbSet<LineaPedido> LineasPedido { get; set; }
}