Acceso a Datos ADO -...

36
Integración de Sistemas Curso 2008 - 2009 1 Acceso a Datos ADO.NET Integración de Sistemas Integración de Sistemas Parte II. Diseño e implementación de aplicaciones Web con .NET Indice Evolución histórica del acceso a datos Conceptos básicos de ADO.NET Generic Factory Model Entorno conectado Entorno desconectado Anexo I. Correspondencia entre tipos C#, SQL estándar y SQL Server

Transcript of Acceso a Datos ADO -...

Page 1: Acceso a Datos ADO - sabia.tic.udc.essabia.tic.udc.es/.../docs/transparencias/2009-03-23-ado.net.pdf · Curso 2008 - 2009 1 Acceso a Datos ADO.NET Integración de SistemasIntegración

Integración de Sistemas

Curso 2008 - 2009 1

Acceso a DatosADO.NET

Integración de SistemasIntegración de SistemasParte II. Diseño e implementación de aplicaciones Web con .NET

Indice

Evolución histórica del acceso a datos

Conceptos básicos de ADO.NET

Generic Factory Model

Entorno conectado

Entorno desconectado

Anexo I. Correspondencia entre tipos C#, SQL estándar y SQL Server

Page 2: Acceso a Datos ADO - sabia.tic.udc.essabia.tic.udc.es/.../docs/transparencias/2009-03-23-ado.net.pdf · Curso 2008 - 2009 1 Acceso a Datos ADO.NET Integración de SistemasIntegración

Integración de Sistemas

Curso 2008 - 2009 2

Evolución histórica de acceso a datos

Inicialmente, no había interfaces comunes de acceso a d tdatos

Cada proveedor proporcionaba un API (u otros mecanismos)

Cambiar SGBD tenía un coste muy alto

Evolución histórica de acceso a datosODBC (Open DataBase Connectivity)

Estándar de acceso a BD desarrollado por Microsoft

Proporciona interfaz única para acceder a varios SGBD

Modelo de drivers para acceder datos

Cualquier proveedor puede escribir un driver ODBC

⇒ Es posible escribir aplicación independiente del SGBD

Soportado por la mayoría de los SGBD

N i l t l ti i l id SQL 1999No incluye soporte para algunos tipos incluidos en SQL:1999 y SQL:2003

Page 3: Acceso a Datos ADO - sabia.tic.udc.essabia.tic.udc.es/.../docs/transparencias/2009-03-23-ado.net.pdf · Curso 2008 - 2009 1 Acceso a Datos ADO.NET Integración de SistemasIntegración

Integración de Sistemas

Curso 2008 - 2009 3

Evolución histórica de acceso a datosOLE-DB (Object Linking and Embedding Database)

Desarrollado por Microsoft para mejorar ODBC

Proporciona un API más limpia y acceso a datos más eficiente que ODBC

OLE-DB Providers

Proporcionan acceso a un SGBD

Inicialmente: ODBC

Posteriormente se añadiron otrosPosteriormente se añadiron otros

OLE-DB Consumers

Se comunican con los “proveedores”

Evolución histórica de acceso a datosOLE-DB (Object Linking and Embedding Database)

Arquitectura OLE-DBExtraído de: McClure, W. B. (2005). Professional ADO. NET 2:

Programming with SQL Server 2005, Oracle, and MySQL: Wrox.

Page 4: Acceso a Datos ADO - sabia.tic.udc.essabia.tic.udc.es/.../docs/transparencias/2009-03-23-ado.net.pdf · Curso 2008 - 2009 1 Acceso a Datos ADO.NET Integración de SistemasIntegración

Integración de Sistemas

Curso 2008 - 2009 4

Evolución histórica de acceso a datos Data Access Consumers

Desde lenguajes que utilizan punteros, como C o C++ es posible acceder directamente a las APIs ODBC y OLE DBacceder directamente a las APIs ODBC y OLE-DB

Para acceder desde otros lenguajes es ecesaria una nueva capa

⇒ Aparecen: DAO, RDO, ADO y ADO.NET

Evolución histórica de acceso a datos Data Access Consumers

Data Access Objects (DAO)

Estaba basado en el motor JET, que había sido diseñado para Access

DAO 1.0 soportaba ODBC y comunicación directa con Access (sin ODBC)

DAO 2.0 se amplió para soportar OLE-DB

Problema: solo puede hablar con el motor JET

⇒Menor rendimiento

Page 5: Acceso a Datos ADO - sabia.tic.udc.essabia.tic.udc.es/.../docs/transparencias/2009-03-23-ado.net.pdf · Curso 2008 - 2009 1 Acceso a Datos ADO.NET Integración de SistemasIntegración

Integración de Sistemas

Curso 2008 - 2009 5

Evolución histórica de acceso a datos Data Access Consumers

Remote Data Objects (RDO)

Solución de Microsoft al bajo rendimiento de DAO

Para comunicarse con BD distintas de Access, RDO no usa el motor JET como DAO. Se comunica con el nivel ODBC directamente

Puede usar cursores del lado del cliente para navegar los registros, en contraposición a la necesidad de DAO de usar cursores del lado de servidor

⇒Mejor rendimiento⇒Mejor rendimiento

Evolución histórica de acceso a datos Data Access Consumers

ActiveX Data Objects (ADO)

Propuesto como sustituto de DAO y RDO

Se pretendía que sirviese para acceder a cualquier tipo de datos (desde BD a e-mail, ficheros de texto plano y hojas de cálculo)

Soporta comunicación con fuentes de datos a través de ODBC y OLE-DB

Introdujo el modelo de proveedores (provider model), que permitió a los vendedores de software crear sus propios proveedoreslos vendedores de software crear sus propios proveedores

Page 6: Acceso a Datos ADO - sabia.tic.udc.essabia.tic.udc.es/.../docs/transparencias/2009-03-23-ado.net.pdf · Curso 2008 - 2009 1 Acceso a Datos ADO.NET Integración de SistemasIntegración

Integración de Sistemas

Curso 2008 - 2009 6

Evolución histórica de acceso a datos Data Access Consumers

ActiveX Data Objects (ADO)

Arquitectura ADOExtraído de: McClure, W. B. (2005). Professional ADO. NET 2:

Programming with SQL Server 2005, Oracle, and MySQL: Wrox.

Evolución histórica de acceso a datos Data Access Consumers

ActiveX Data Objects (ADO)

Características

Modelo más limpio que sus predecesores

Batch updating

Disconnected Data Access

Multiple Recordsets

Inconvenientes

El trabajo en modo desconectado era engorroso

No tenía pool de conexiones

Diseño no correctamente factorizado

Page 7: Acceso a Datos ADO - sabia.tic.udc.essabia.tic.udc.es/.../docs/transparencias/2009-03-23-ado.net.pdf · Curso 2008 - 2009 1 Acceso a Datos ADO.NET Integración de SistemasIntegración

Integración de Sistemas

Curso 2008 - 2009 7

Conceptos básicos de ADO.NETArquitectura del .NET Framework

VB C++ C# J#

ADO NET

Common Language Specification

VB C++ C# J# …

ram

ewor

k rib

utab

le

T Fr

amew

ork

SD

K

T Fr

amew

ork

ass

Libr

ary

WinForms ASP NET

WPF WCF

LINQ

WF Card Space

ADO.NET Entity Framework

Windows COM+ Services

Common Language Runtime

Base Class Library

ADO.NET

.NET

Fr

Red

istr

.NE

T

.NET Cla WinForms ASP.NET

Conceptos básicos de ADO.NET

Con la versión del .NET Framework, Microsoft introdujo un nuevo modelo de acceso a datos llamado ADO NETmodelo de acceso a datos, llamado ADO.NET

ADO.NET no es ActiveX

Es un modelo completamente nuevo (comparte funcionalidad pero no la jerarquía de clases)

Soporta comunicación con fuentes de datos a través de ODBC y OLE-DB

Además, ofrece la opción de usar proveedores de datos específicos deAdemás, ofrece la opción de usar proveedores de datos específicos de un SGBD

Gran rendimiento al ser capaces de utilizar optimizaciones específicas

⇒Permite conectarse a casi cualquier BD existente

Page 8: Acceso a Datos ADO - sabia.tic.udc.essabia.tic.udc.es/.../docs/transparencias/2009-03-23-ado.net.pdf · Curso 2008 - 2009 1 Acceso a Datos ADO.NET Integración de SistemasIntegración

Integración de Sistemas

Curso 2008 - 2009 8

Conceptos básicos de ADO.NET Data Providers

OLE DB Provider Otra BD

OLE DB .NET Data Provider

ClienteSQL .NET

Data Provider

ODBC Driver

SQL SERVER

Otra BDODBC .NET

Data Provider

Oracle .NETData Provider Oracle SERVER

Proveedores de acceso a datos (data providers) en ADO.NET

Conceptos básicos de ADO.NET Data Providers

Proveedores de acceso a datos en ADO.NETOLE DB

Acceso vía protocolo OLE DB a cualquier fuente de datos que lo soporteSystem.Data.OleDb

ODBC Acceso vía protocolo ODBC a cualquier fuente de datos que lo soporteSystem.Data.Odbc

SQL ServerAcceso nativo a MS SQL Server 7.0 o superior y MS AccessSystem Data SqlClientSystem.Data.SqlClient

OracleAcceso nativo a Oracle ServerSystem.Data.OracleClient

Otros provistos por terceros MySQL, PostgreSQL, DB2, etc.

Page 9: Acceso a Datos ADO - sabia.tic.udc.essabia.tic.udc.es/.../docs/transparencias/2009-03-23-ado.net.pdf · Curso 2008 - 2009 1 Acceso a Datos ADO.NET Integración de SistemasIntegración

Integración de Sistemas

Curso 2008 - 2009 9

Conceptos básicos de ADO.NET

Novedades

Acceso a datos desconectado real

Pool de conexiones

Conceptos básicos de ADO.NET

Connection: responsable de establecer y mantener la conexión a la fuente de datos, junto con cualquier información específica de la conexióndatos, junto con cualquier información específica de la conexión

Command: almacena la consulta que va a ser enviada a la fuente de datos y cualquier parámetro aplicable

DataReader: proporciona capacidad de lectura rápida, hacia adelante (forward-only) para iterar sobre los registros rápidamente

DataSet: proporciona mecanismo de almacenamiento para datos desconectados.

N i i f t d d t i l f t d l d t dNunca se comunica con ninguna fuente de datos e ignora la fuente de los datos usada para rellenarlo (populate)

DataAdapter: es lo que relaciona el DataSet y la fuente de datos. Es responsable de:

Recuperar los datos desde el objeto Command y rellenar el DataSet con los datos recuperados

Persistir los cambios realizados en el DataSet en la fuente de datos.

Page 10: Acceso a Datos ADO - sabia.tic.udc.essabia.tic.udc.es/.../docs/transparencias/2009-03-23-ado.net.pdf · Curso 2008 - 2009 1 Acceso a Datos ADO.NET Integración de SistemasIntegración

Integración de Sistemas

Curso 2008 - 2009 10

Conceptos básicos de ADO.NET

Base de DatosBase de Datos

XxxConnection

XxxCommand

DataSet XxxDataReader

XxxDataAdapter

Conceptos básicos de ADO.NET

Page 11: Acceso a Datos ADO - sabia.tic.udc.essabia.tic.udc.es/.../docs/transparencias/2009-03-23-ado.net.pdf · Curso 2008 - 2009 1 Acceso a Datos ADO.NET Integración de SistemasIntegración

Integración de Sistemas

Curso 2008 - 2009 11

Conceptos básicos de ADO.NET Entornos de Acceso a Datos

Conectado:

forward-only

Aplicación realiza una consulta y lee los datos conforme los va procesando

Cursor unidireccional

Objeto DataReader

Desconectado

La aplicación ejecuta la consulta y almacena los resultados de la misma para l d éprocesarlos después

Minimiza el tiempo de conexión a la base de datos

Objetos lightweight

Objetos DataSet y DataAdapter

Conceptos básicos de ADO.NET Namespace System.Data

Organiza el modelo de objetos

Incluye:System.Data

System.Data.OleDb

System.Data.Odbc

System.Data.SqlClient

...

Page 12: Acceso a Datos ADO - sabia.tic.udc.essabia.tic.udc.es/.../docs/transparencias/2009-03-23-ado.net.pdf · Curso 2008 - 2009 1 Acceso a Datos ADO.NET Integración de SistemasIntegración

Integración de Sistemas

Curso 2008 - 2009 12

Conceptos básicos de ADO.NET Namespace System.Data

Todos los Data Providers deben implementar una serie de interfacesinterfaces

System.Data.IDbConnection

System.Data.IDbCommand

System.Data.IDbDataParameter

System.Data.IDbTransaction

System.Data.IDataReader

System.Data.IDataAdapter

...

Conceptos básicos de ADO.NET Ejemplo de Creación de Conexiones

using System;using System Data SqlClient;using System.Data.SqlClient;namespace Es.UDC.DotNet.ADODotNetTutorial{

class SqlDataBaseConnection{

public static void Main(string[] args){

SqlConnection connection = null;try{

// The connection string should be read from a configuration// file...String connectionString = "Data Source=localhost\\SQLExpress;" +String connectionString Data Source localhost\\SQLExpress; +

"Initial Catalog=ADOTutorial;User ID=ADOTutorial;" + "Password=ADOTutorial";

// Create the connection ...connection = new SqlConnection();connection.ConnectionString = connectionString;

Page 13: Acceso a Datos ADO - sabia.tic.udc.essabia.tic.udc.es/.../docs/transparencias/2009-03-23-ado.net.pdf · Curso 2008 - 2009 1 Acceso a Datos ADO.NET Integración de SistemasIntegración

Integración de Sistemas

Curso 2008 - 2009 13

Conceptos básicos de ADO.NET Ejemplo de Creación de Conexiones

// Create the command and set properties ...SqlCommand command = new SqlCommand();command.CommandText = "SELECT * FROM Account";command.Connection = connection;// Open the connection ...connection.Open();// Execute the command ...SqlDataReader sqlDataReader = command.ExecuteReader();// Close the SqlDataReader ...sqlDataReader.Close();Console.WriteLine("DataBaseConnection is OK");

}catch (Exception e){

Console.WriteLine("Message: " + e.Message);C l W it Li ("St kT " + St kT )Console.WriteLine("StackTrace: " + e.StackTrace);

}finally{

// Ensures connection is closedif (connection != null) connection.Close();

}}

}}

Conceptos básicos de ADO.NET Namespace System.Data

Idependencia del proveedor sin Generic Factory ModelExtraído de: McClure, W. B. (2005). Professional ADO. NET 2:

Programming with SQL Server 2005, Oracle, and MySQL: Wrox.

Page 14: Acceso a Datos ADO - sabia.tic.udc.essabia.tic.udc.es/.../docs/transparencias/2009-03-23-ado.net.pdf · Curso 2008 - 2009 1 Acceso a Datos ADO.NET Integración de SistemasIntegración

Integración de Sistemas

Curso 2008 - 2009 14

ADO.NET 2.0

100% compatible con cualquier código escrito en ADO.NET 1.0 ;-)

Mejora la serialización XML y el pool de conexiones

insert permite añadir varias filas en una única instrucción

Reducción de código necesario para efectuar tareas comunes

Posibilidad de escribir código de acceso a BD independiente del proveedor⇒ Generic Factory Model⇒ Generic Factory Model

Generic Factory Model

Idependencia del proveedor con Generic Factory ModelExtraído de: McClure, W. B. (2005). Professional ADO. NET 2:

Programming with SQL Server 2005, Oracle, and MySQL: Wrox.

Page 15: Acceso a Datos ADO - sabia.tic.udc.essabia.tic.udc.es/.../docs/transparencias/2009-03-23-ado.net.pdf · Curso 2008 - 2009 1 Acceso a Datos ADO.NET Integración de SistemasIntegración

Integración de Sistemas

Curso 2008 - 2009 15

Generic Factory Model

Namespace System.Data.CommonDbConnection

DbCommand

DbParameter

DbDataReader

DbDataAdapter

DbProviderFactories

DbProviderFactory

DbException

...

DbConnection

Establece una sesión con una fuente de datos

Implementada por SqlConnection,OdbcConnection, OleDbConnection, etc.

Funcionalidad

Abrir y Cerrar conexiones

Gestionar Transacciones

Page 16: Acceso a Datos ADO - sabia.tic.udc.essabia.tic.udc.es/.../docs/transparencias/2009-03-23-ado.net.pdf · Curso 2008 - 2009 1 Acceso a Datos ADO.NET Integración de SistemasIntegración

Integración de Sistemas

Curso 2008 - 2009 16

DbConnection

PropiedadesConnectionString

ConnectionTimeOut

DataBase

State

Open

Close

Métodosvoid Open()

void Close()

void ChangeDataBase(dbName);

DbCommand CreateCommand()

Dependerá del proveedor de acceso a datos

Li t d ti t i ’ di ibl

DbConnectionConnection String

Listas de conection string’s disponibles en:http://www.codeproject.com/database/connectionstrings.asp

http://www.carlprothman.net/Default.aspx?tabid=81

Ejemplos:SqlServer:

"Data Source=localhost\SQLExpress; Initial Catalog=miniportal;User ID=user;Password=password"

MySQL ODBC Driver:

"DRIVER={MySQL ODBC 3.51 Driver}; SERVER=localhost; PORT=3306;UID=user; PWD=password; DATABASE=db;"

Access OLEDB:

"Provider=MSDASQL; Driver={Microsoft Access Driver (*.mdb)}; Dbq=drive:\path\file.mdb; Uid=user; Pwd=password";

Page 17: Acceso a Datos ADO - sabia.tic.udc.essabia.tic.udc.es/.../docs/transparencias/2009-03-23-ado.net.pdf · Curso 2008 - 2009 1 Acceso a Datos ADO.NET Integración de SistemasIntegración

Integración de Sistemas

Curso 2008 - 2009 17

DbConnectionConnection Pooling

Pool de Conexiones habilitado automáticamentePool se crea en base a la cadena de conexión Ejemplo:Pool se crea en base a la cadena de conexión. Ejemplo:DbConnection northwindConnection = new SqlConnection();northwindConnection.ConnectionString =

"Integrated Security=SSPI;Initial Catalog=northwind";// Pool A is created.northwindConnection.Open();

DbConnection pubsConnection = new SqlConnection();pubsConnection.ConnectionString =

"Integrated Security=SSPI;Initial Catalog=pubs";// Pool B is created because the connection strings differ.pubsConnection.Open();

Al cerrar una conexión, ésta se devuelve al pool

DbConnection otherNorthwindConnection = new SqlConnection();otherNorthwindConnection.ConnectionString =

"Integrated Security=SSPI;Initial Catalog=northwind";// The connection string matches pool A.otherNorthwindConnection.Open();

Proveedores de Acceso a Datos (Data Providers)

Independizar código del proveedor de datosFactoría de proveedores : DbProviderFactories

Crea instancias de un proveedor de acceso a datos

Objeto DbProviderFactory

/* Returns an instance of a System.Data.Common.DbProviderFactory* for the specified providerName*/DbProviderFactory dbFactory =

DbProviderFactories.GetFactory(providerName);

Objeto DbProviderFactory

.CreateCommand()

.CreateConnection()

.CreateParameter()

Page 18: Acceso a Datos ADO - sabia.tic.udc.essabia.tic.udc.es/.../docs/transparencias/2009-03-23-ado.net.pdf · Curso 2008 - 2009 1 Acceso a Datos ADO.NET Integración de SistemasIntegración

Integración de Sistemas

Curso 2008 - 2009 18

Proveedores de Acceso a Datos (Data Providers)

public static void Main(String[] args) { DbConnection connection = null; try { /* The providerName is the invariant name of a provider * It could be obtained from a configuration file ... */ String providerName = "System.Data.SqlClient"; // The connection string should be read from a configuration file... String connectionString = "Data Source=localhost\\SQLExpress;" + "Initial Catalog=test;User ID=testUser;Password=password"; /* Returns an instance of a System.Data.Common.DbProviderFactory * for the specified providerName */ DbProviderFactory dbFactory = DbProviderFactories.GetFactory(providerName); // Create the connection ... connection = dbFactory.CreateConnection(); connection.ConnectionString = connectionString;

Proveedores de Acceso a Datos (Data Providers)

// Create the command and set properties ...p p // Open the connection ... connection.Open(); // ... } catch (Exception e) { // ... } finally

{ { // Ensures connection is closed if (connection != null) connection.Close(); } } 

Page 19: Acceso a Datos ADO - sabia.tic.udc.essabia.tic.udc.es/.../docs/transparencias/2009-03-23-ado.net.pdf · Curso 2008 - 2009 1 Acceso a Datos ADO.NET Integración de SistemasIntegración

Integración de Sistemas

Curso 2008 - 2009 19

Proveedores de Acceso a Datos (Data Providers)

public static void Main(string[] args) { try { DataTable factoryTable = DbProviderFactories.GetFactoryClasses(); // Lists DataTable information... foreach (DataRow dr in factoryTable.Rows) { Console.WriteLine("Name: {0}", dr["Name"]); Console.WriteLine("Description: {0}", dr["Description"]); Console.WriteLine("InvariantName: {0}", dr["InvariantName"]); Console.WriteLine("AssemblyQualifiedName: {0}", dr["AssemblyQualifiedName"]); Console.WriteLine("----------------------------------------");

} } } catch (Exception e) { Console.WriteLine("Message: " + e.Message); Console.WriteLine("StackTrace: " + e.StackTrace); } Console.ReadLine(); } 

Proveedores de Acceso a Datos (Data Providers)

Ejemplo de salidaName: Odbc Data Provider Description: .Net Framework Data Provider for Odbc InvariantName: System.Data.Odbc AssemblyQualifiedName: System.Data.Odbc.OdbcFactory, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ---------------------------------------- Name: OleDb Data Provider Description: .Net Framework Data Provider for OleDb InvariantName: System.Data.OleDb AssemblyQualifiedName: System.Data.OleDb.OleDbFactory, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ----------------------------------------

S lCli idName: SqlClient Data ProviderDescription: .Net Framework Data Provider for SqlServer InvariantName: System.Data.SqlClient AssemblyQualifiedName: System.Data.SqlClient.SqlClientFactory, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 < ... >

Page 20: Acceso a Datos ADO - sabia.tic.udc.essabia.tic.udc.es/.../docs/transparencias/2009-03-23-ado.net.pdf · Curso 2008 - 2009 1 Acceso a Datos ADO.NET Integración de SistemasIntegración

Integración de Sistemas

Curso 2008 - 2009 20

Comandos. DbCommand

Representa una sentencia que se envía a una fuente de datos

Generalmente, pero no necesariamente SQL

Implementada por SqlCommand, OleDbCommand, etc.

Funcionalidad

Definir la sentencia a ejecutar

Ejecutar la sentencia

E i ibi á tEnviar y recibir parámetros

Crear una versión compilada

Comandos. DbCommand

PropiedadesCommandText

CommandTimeOut

CommandType

CommandType.Text

CommandType.StoredProc

Connection

Parameters

Transaction

Page 21: Acceso a Datos ADO - sabia.tic.udc.essabia.tic.udc.es/.../docs/transparencias/2009-03-23-ado.net.pdf · Curso 2008 - 2009 1 Acceso a Datos ADO.NET Integración de SistemasIntegración

Integración de Sistemas

Curso 2008 - 2009 21

Comandos. DbCommand

Si se trabaja con comandos dependientes del Data Provider es posible disponer de varios constructoresposible disponer de varios constructores

SqlCommand()

SqlCommand(cmdText)

e.g:SqlCommand command = new SqlCommand("SELECT loginName " +

"FROM UserProfile ", connection);

SqlCommand(cmdText, connection)

SqlCommand(cmdText, connection, transaction)

Comandos. DbCommand

Si se trabaja con comandos genéricos (independientes del Data Provider), el comando debe crearse a partir de la conexión), p

Único constructor, sin parámetrosInicialización mediante acceso a propiedades// Create the command and set properties ... DbCommand command = connection.CreateCommand(); command.CommandText = "SELECT loginName FROM UserProfile "; command.Connection = connection;

d C dTi t 15command.CommandTimeout = 15; command.CommandType = CommandType.Text; // Open the connection ... connection.Open(); 

Page 22: Acceso a Datos ADO - sabia.tic.udc.essabia.tic.udc.es/.../docs/transparencias/2009-03-23-ado.net.pdf · Curso 2008 - 2009 1 Acceso a Datos ADO.NET Integración de SistemasIntegración

Integración de Sistemas

Curso 2008 - 2009 22

Comandos Command.Prepare()

Debería usarse cuando un comando se ejecuta múltiples veces

Origina una sobrecarga inicial debida a la creación de un procedimiento almacenado en el SGBD para la ejecución del comando

Se rentabiliza en las siguientes ejecuciones del comando

La ejecución de Command.Prepare() necesita una conexión abierta y disponible

Requiere especificar el tamaño de los parámetros empleados en el comando, mediante la propiedad DbParameter.Size

Parámetros

Comandos poseen colección Parameters

DbParameter

ParameterName

DbType

Enumeración: String, Int32, Date, Double, etc.

Value

Size

IsNullable

Page 23: Acceso a Datos ADO - sabia.tic.udc.essabia.tic.udc.es/.../docs/transparencias/2009-03-23-ado.net.pdf · Curso 2008 - 2009 1 Acceso a Datos ADO.NET Integración de SistemasIntegración

Integración de Sistemas

Curso 2008 - 2009 23

Parámetros// Create the command and set properties ... DbCommand command = connection.CreateCommand(); command.CommandText =

"SELECT loginName FROM UserProfile " + "SELECT loginName FROM UserProfile " + "WHERE loginName = @loginName "; // Create and populate parameter DbParameter loginNameParam = command.CreateParameter(); loginNameParam.ParameterName = "@loginName"; loginNameParam.DbType = DbType.String; loginNameParam.Value = "loginTest"; /* If command.Prepare() is used then paramSize must be greater * than 0 */ loginNameParam.Size = 30; command.Parameters.Add(loginNameParam); // Open the connection ... connection.Open(); /* Prepare the command to have better performance. The provider * will use the prepared (compiled) version of the command for * any subsequent executions. * Notice that Prepare() requires and open and available * connection. */ command.Prepare();

Entorno ConectadoXxxConnection: maneja la conexión a una BDX C d j tBase de Datos XxxCommand: ejecuta comandos contra una BDXxxDataReader: Proporciona acceso a datos Read-only, Forward-only (Entorno Conectado)

Base de Datos

XxxConnection

XxxCommand

DataSet XxxDataReader

XxxDataAdapter

Page 24: Acceso a Datos ADO - sabia.tic.udc.essabia.tic.udc.es/.../docs/transparencias/2009-03-23-ado.net.pdf · Curso 2008 - 2009 1 Acceso a Datos ADO.NET Integración de SistemasIntegración

Integración de Sistemas

Curso 2008 - 2009 24

Entorno Conectado. DbCommand

ExecuteReader

Sentencias que devuelven múltiples filas de resultados (DbDataReader)

ExecuteNonQuery

Sentencias UPDATE, DELETE, etc. que no devuelven ninguna fila como resultado

E t S lExecuteScalar

Sentencias SQL que devuelven una fila con un único valor como resultado

Entorno Conectado. DbDataReader

Proporciona acceso secuencial de sólo lectura a una fuente de datosdatos

Creado a través de command.ExecuteReader()

Al utilizar un objeto DbDataReader, las operaciones sobre la conexión DbConnection quedan deshabilitadas hasta que se cierre el objeto DbDataReader

Page 25: Acceso a Datos ADO - sabia.tic.udc.essabia.tic.udc.es/.../docs/transparencias/2009-03-23-ado.net.pdf · Curso 2008 - 2009 1 Acceso a Datos ADO.NET Integración de SistemasIntegración

Integración de Sistemas

Curso 2008 - 2009 25

Entorno Conectado. DbDataReader

Propiedades de interés:FieldCount: devuelve el número de campos en la fila actualFieldCount: devuelve el número de campos en la fila actualRecordsAffected: número de registros afectados

MétodosRead()

Avanza el DbDataReader al siguiente registro

Inicialmente se sitúa antes del primer registro del resultado

Devuelve false si ha llegado al final, true en caso contrario

Close()Cierra el objecto DbDataReader

GetValues()Obtiene la fila actual

Proporciona métodos para el tipado de los datos leídos (GetValue,GetString, etc.)

Boolean b = myDataReader.GetBoolean(fieldNumber);

Entorno Conectado. ExecuteReader()try { // ... // Create the command and set properties ... DbCommand command = connection.CreateCommand(); command.CommandText = "SELECT loginName, email " + "FROM UserProfile"; command.Connection = connection; // Open the connection and execute the command ... connection.Open(); DbDataReader dr = command.ExecuteReader(); // Data access

hil (d R d()) while (dr.Read()) { String loginName = dr.GetString(0); String email = dr.GetString(1); Console.WriteLine("loginName: " + loginName + ", email: " + email); } // Close the DataReader ... dr.Close(); }

Page 26: Acceso a Datos ADO - sabia.tic.udc.essabia.tic.udc.es/.../docs/transparencias/2009-03-23-ado.net.pdf · Curso 2008 - 2009 1 Acceso a Datos ADO.NET Integración de SistemasIntegración

Integración de Sistemas

Curso 2008 - 2009 26

Entorno Conectado. ExecuteNonQuerytry { // ...

// Create the command and set properties ... // Create the command and set properties ... // SQL Update Command modifies data but it does not return any data DbCommand command = connection.CreateCommand(); command.CommandText = "UPDATE Account " + "SET balance = 1.1 * balance "; command.Connection = connection; // Open the connection and execute the command ... connection.Open(); /* Executes a SQL statement against the Connection object * of a .NET Framework data provider, and returns the number * of rows affected. */ int affectedRows = command.ExecuteNonQuery(); Console.WriteLine("affectedRows: " + affectedRows); } 

Entorno Conectado. ExecuteScalartry { // ...

// Create the command and set properties ... // Create the command and set properties ... DbCommand command = connection.CreateCommand(); command.CommandText = "SELECT count(*) " + "FROM UserProfile "; command.Connection = connection; // Open the connection and execute the command ... connection.Open(); /* Executes the query, and returns the first column of the * first row in the resultset returned by the query (as an y q y * object). * Additional columns or rows are ignored. */ int numberOfUsers = (int)command.ExecuteScalar(); Console.WriteLine("numberOfUsers: " + numberOfUsers); } 

Page 27: Acceso a Datos ADO - sabia.tic.udc.essabia.tic.udc.es/.../docs/transparencias/2009-03-23-ado.net.pdf · Curso 2008 - 2009 1 Acceso a Datos ADO.NET Integración de SistemasIntegración

Integración de Sistemas

Curso 2008 - 2009 27

Transacciones

Transacción:

Conjunto sentencias que constituyen una unidad lógica de trabajo

Deben cumplir las propiedades ACID:

Atomicity:

Las sentencias se ejecutan todas o ninguna

Consistency:

Una vez finalizada los datos deben ser consistentesUna vez finalizada, los datos deben ser consistentes

Isolation:

Transacciones se comportan como si cada una fuera la única transacción

Durability:

Una vez finalizada, los cambios son permanentes

Transacciones

Se crean a partir de la conexiónconnection.BeginTransaction();

Es obligatorio asociar los comandos a la transacciónPropiedad command.Transaction

Métodosi ()Commit();

Rollback();

Page 28: Acceso a Datos ADO - sabia.tic.udc.essabia.tic.udc.es/.../docs/transparencias/2009-03-23-ado.net.pdf · Curso 2008 - 2009 1 Acceso a Datos ADO.NET Integración de SistemasIntegración

Integración de Sistemas

Curso 2008 - 2009 28

Transacciones

Niveles de Aislamientod i “di t d ”IsolationLevel.ReadUncommitted: pueden ocurrir “dirty reads”,

“non-repeatable reads” y “phantom reads”

IsolationLevel.ReadCommitted: pueden ocurrir “non-repeatable reads” y “phantom reads

IsolationLevel.RepeatableRead: pueden ocurrir “phantom reads"

IsolationLevel.Serializable: elimina todos los problemas de concurrenciaconcurrencia

El nivel de aislamiento se fija en el momento de crear la transacciónconnection.BeginTransaction(

IsolationLevel.Serializable);

Transaccionestry { // ... // Open the connection ... connection.Open(); // Starts a new transaction ... // transaction = connection.BeginTransaction(); //default transaction = connection. BeginTransaction(IsolationLevel.Serializable); // Create the command and set properties ... DbCommand selectCommand = connection.CreateCommand(); selectCommand.Connection = connection; selectCommand.CommandText = "SELECT balance " + "FROM ACCOUNT " + "WHERE accId = 1"; // Associate the command with the transaction selectCommand.Transaction = transaction;

Page 29: Acceso a Datos ADO - sabia.tic.udc.essabia.tic.udc.es/.../docs/transparencias/2009-03-23-ado.net.pdf · Curso 2008 - 2009 1 Acceso a Datos ADO.NET Integración de SistemasIntegración

Integración de Sistemas

Curso 2008 - 2009 29

Transacciones // Execute the selectCommand ... dataReader = selectCommand.ExecuteReader(); if (!dataReader.Read()) { throw new Exception("Error in DataBase access!"); } balance = dataReader.GetDouble(0); Console.WriteLine("Actual balance: " + balance); balance = 1.1 * balance; Console.WriteLine("New balance must be: " + balance); /* PAUSE: another process should change the balance * TIP : use sql server management studio to launch a query * which change the balance. Notice that in this case SQL Server * performs a row-level block, so you can modify the balance * of other account. */ Console.ReadLine();  

Transacciones // DataReader must be closed before the updateCommand execution dataReader.Close();

// Create the updateCommand and set properties // Create the updateCommand and set properties ... DbCommand updateCommand = connection.CreateCommand(); updateCommand.Connection = connection; updateCommand.CommandText = "UPDATE ACCOUNT " + "SET balance = @balance " + "WHERE (accId = 1)"; updateCommand.Transaction = transaction; DbParameter balanceParam = updateCommand.CreateParameter(); balanceParam.ParameterName = "@balance"; balanceParam.DbType = DbType.Decimal; balanceParam.Value = balance;

d t C d P t Add(b l P ) updateCommand.Parameters.Add(balanceParam); // Execute the updateCommand ... int afectedRows = updateCommand.ExecuteNonQuery(); transaction.Commit(); commited = true; Console.WriteLine("Transaction COMMITED"); }  

Page 30: Acceso a Datos ADO - sabia.tic.udc.essabia.tic.udc.es/.../docs/transparencias/2009-03-23-ado.net.pdf · Curso 2008 - 2009 1 Acceso a Datos ADO.NET Integración de SistemasIntegración

Integración de Sistemas

Curso 2008 - 2009 30

Transaccionescatch (DbException e) { Console.WriteLine(e.StackTrace);

C l W it Li ( M ) Console.WriteLine(e.Message);} catch (Exception e) { Console.WriteLine(e.StackTrace); Console.WriteLine(e.Message); } finally { if (!commited) { if (transaction != null)

{ { transaction.Rollback(); } } // Ensures connection is closed if (connection != null) { connection.Close(); } } 

Excepciones

System.Data.Common.DbException

S l d l ú bl l d d tSe lanza cuando ocurre algún problema en la capa de acceso a datos

Es una clase abstracta que implementa ExternalException

Cada "Data Provider" proporcionará una implementación específica

Constructores:DbException()

DbException(string message)

message: mensaje a mostrarmessage: mensaje a mostrar

DbException(string message, Exception innerException)

innerException: la referencia de la excepción interna

DbException(string message, int errorCode)

errorCode: código de error para la excepción

Page 31: Acceso a Datos ADO - sabia.tic.udc.essabia.tic.udc.es/.../docs/transparencias/2009-03-23-ado.net.pdf · Curso 2008 - 2009 1 Acceso a Datos ADO.NET Integración de SistemasIntegración

Integración de Sistemas

Curso 2008 - 2009 31

Entorno DesconectadoXxxConnection: maneja la conexión a una BDX C d j tBase de Datos XxxCommand: ejecuta comandos contra una BDXxxDataAdapter: intercambia datos entre un DataSet y una BDDataSet: copia local de datos relacionales (Entorno Desconectado)

Base de Datos

XxxConnection

XxxCommand

DataSet XxxDataReader

XxxDataAdapter

Entorno Desconectado: DataSet

Núcleo ADO.NET bajo entorno desconectado

Representación en memoria del contenido de la base de datos

Operaciones sobre los datos se realizan sobre el DataSet, no sobre el origen de datos

Almacena

Tablas (DataTable)

Relaciones ente tablas (DataRelation)

Independiente del proveedor de datos

Problemas

Sincronización datos

Acceso concurrente

Page 32: Acceso a Datos ADO - sabia.tic.udc.essabia.tic.udc.es/.../docs/transparencias/2009-03-23-ado.net.pdf · Curso 2008 - 2009 1 Acceso a Datos ADO.NET Integración de SistemasIntegración

Integración de Sistemas

Curso 2008 - 2009 32

Entorno Desconectado: DataTable

Representación lógica de una tabla de la base de datos

P i d d d i t éPropiedades de interés:Columns:

Colección de tipo ColumnsCollection de objetos DataColumn

Rows:

Colección de tipo RowsCollection de objectos DataRow

ParentRelations:

RelationsCollection. Relaciones en las que participa la tabla

iConstraints:

Colección de tipo ConstraintsCollection

DataSet:

DataSet en el que está incluida la DataTable

PrimaryKey:

DataColumn que actúa como clave primaria de la tabla

Entorno Desconectado: DataSet

DataSet

DataTable

DataColumn

DataRelation

DataRow

Page 33: Acceso a Datos ADO - sabia.tic.udc.essabia.tic.udc.es/.../docs/transparencias/2009-03-23-ado.net.pdf · Curso 2008 - 2009 1 Acceso a Datos ADO.NET Integración de SistemasIntegración

Integración de Sistemas

Curso 2008 - 2009 33

Entorno Desconectado. XxxDataAdapter

Bridge entre origen de datos y DataSet

I l l é d b d l lImplementa los métodos abstractos de la clase DataAdapter:public abstract int Fill( DataSet dataSet );

public abstract int Update( DataSet dataSet );

Propiedades de interés:DeleteCommand: El comando de borrado, expresado en SQLInsertCommand: Obtiene o establece el comando de inserciónSelectCommand: Obtiene o establece el comando de selecciónSelectCommand: Obtiene o establece el comando de selecciónUpdateCommand: Obtiene o establece el comando de actualizaciónTableMappings: Relaciona la tabla con el DataTable

Debe especificarse siempre un comando de selección

Entorno Desconectado

DataAdapter DataSetFill

Update

Command

Errors Collection

Parameters

Update

Sele

ctC

omm

and

Inse

rtC

omm

and

Upd

ateC

omm

and

Del

eteC

omm

and

Connection

Data Source

Page 34: Acceso a Datos ADO - sabia.tic.udc.essabia.tic.udc.es/.../docs/transparencias/2009-03-23-ado.net.pdf · Curso 2008 - 2009 1 Acceso a Datos ADO.NET Integración de SistemasIntegración

Integración de Sistemas

Curso 2008 - 2009 34

Entorno Desconectadotry { // ... // Create the connection ... connection = dbFactory.CreateConnection(); connection.ConnectionString = connectionString; DbCommand selectCommand = connection.CreateCommand(); selectCommand.CommandText = "SELECT * " + "FROM UserProfile"; // Create and configure the DataAdapter... DbDataAdapter dataAdapter = dbFactory.CreateDataAdapter();

dataAdapter.SelectCommand = selectCommand; dataAdapter.SelectCommand selectCommand; // Create the DataSet (it will store a copy of database values) ... DataSet dataSet = new DataSet("UserProfileDS"); // Fill DataSet dataAdapter.Fill(dataSet, "Users"); // ... now connection with database is automatically closed.

Entorno Desconectado /* Changes are applied only within dataset (database does not * change, so the next execution will return the same initial

* value) * value) */ DataRow firstRow = dataSet.Tables["Users"].Rows[0]; Console.WriteLine("LoginName read from database: " + firstRow["loginName"]); firstRow["loginName"] = "newLoginName"; foreach (DataRow dr in dataSet.Tables["Users"].Rows) { Console.WriteLine("LoginName changed in DataSet: " + dr["loginName"]); } } // catch ... // finally ...  

Page 35: Acceso a Datos ADO - sabia.tic.udc.essabia.tic.udc.es/.../docs/transparencias/2009-03-23-ado.net.pdf · Curso 2008 - 2009 1 Acceso a Datos ADO.NET Integración de SistemasIntegración

Integración de Sistemas

Curso 2008 - 2009 35

CORRESPONDENCIA ENTRE TIPOSAnexo ICORRESPONDENCIA ENTRE TIPOS C#, SQL ESTÁNDAR Y SQL SERVER

Correspondencia entre tipos C# y SQL estándar

Tipo C# Tipo SQL estándarbool BIT

byte TINYINT

short SMALLINT

int INTEGER

long BIGINT

float REAL

double DOUBLE

decimal NUMERIC

String VARCHAR, LONGVARCHAR

byte[] VARBINARY, LONGVARBINARY

System.DateTime DATE, TIME

- TIMESTAMP

Page 36: Acceso a Datos ADO - sabia.tic.udc.essabia.tic.udc.es/.../docs/transparencias/2009-03-23-ado.net.pdf · Curso 2008 - 2009 1 Acceso a Datos ADO.NET Integración de SistemasIntegración

Integración de Sistemas

Curso 2008 - 2009 36

Correspondencia entre tipos C# y SQL Server

Tipo C# Tipo SQL Serverbool BIT

byte TINYINT

short SMALLINT

int INTEGER

long BIGINT

float REAL

double FLOAT

decimal NUMERIC, DECIMAL

String CHAR, VARCHAR, NCHAR, NVARCHAR

byte[] VARBINARY

System.DateTime DATETIME

- TIMESTAMP, ROWVERSION

Correspondencia entre tipos C#, SQL estándar y SQL Server

Tipo C# Tipo SQL estándar Tipo SQL Serverbool BIT

byte TINYINT

short SMALLINT

int INTEGER

long BIGINT

float REAL

double DOUBLE FLOAT

decimal NUMERIC NUMERIC, DECIMAL

String VARCHAR, LONGVARCHAR CHAR, VARCHAR, NCHAR, NVARCHAR

byte[] VARBINARY, LONGVARBINARY VARBINARY

System.DateTime DATE, TIME DATETIME

- TIMESTAMP TIMESTAMP, ROWVERSION