Acceso a Datos. Integración de Sistemas. Parte II. Diseño e implementación de aplicaciones Web con.net



Documentos relacionados
Acceso a Datos ADO.NET

Acceso a Datos ADO.NET

GALA. ADO Modo Conectado. Modelo de Base de Datos Relacional. m018a Curso Manejo de Datos con Visual Basic 2010, 24 h

Mecanismos de acceso a datos usando ADO.NET

Célula UABC-Live.net. Universidad Autónoma. de Baja California. Facultad de Ciencias Químicas. e Ingeniería.

Programación de Consultas SQL ADO.Net LDP / DUOC-AV

ADO.NET. Arquitectura de ADO.NET

Acceso a Datos con ADO.NET

Programación en Internet. Proceso selectivo de promoción interna para el acceso a escalas del grupo A, subgrupo A1. Ref. PI-02/12

TEMA 6. ARQUITECTURA DE ADO.NET 6.1. INTRODUCCIÓN A ADO.NET

ADO.NET. Contenido. Transición a ADO.NET. Introducción a ADO.NET. Limites de ADO

ADO.NET. En este artículo vamos a ver el protocolo de acceso a datos en la plataforma.net, ADO.NET y su marco de funcionamiento con ASP.NET.

Acceso a Base de Datos

El modelo de objetos ADO.NET. (Datos sin conexión) Proveedor de datos.net. Connection. Command Parameter. DataReader

UNIVERSIDAD DON BOSCO FACULTAD DE ESTUDIOS TECNOLÓGICOS ESCUELA DE COMPUTACIÓN

UNIVERSIDAD DON BOSCO FACULTAD DE ESTUDIOS TECNOLÓGICOS ESCUELA DE COMPUTACIÓN

Programació amb C#.NET

I.- Objetivo. II.- Introducción

Tema: Conexión a Base de Datos.

1. Bases de datos desde VB.Net 1.1 Introducción. Desde Vb Net 2005 se puede acceder a las siguientes bases de datos, utilizando las clases adecuadas.

Arquitectura.NET. César Julio Bustacara M. 2008

GUÍA DE TRABAJO N 11 LENGUAJE C# Programación de Software Articulación SENA Grado 10 Ing. Néstor Raúl Suarez Perpiñan Página 2 de 11

JDBC. Una mini-introducci. introducción

10. JDBC. 10. JDBC Introducción. java.sql

Marcos de Desarrollo. Diseño e implementación de aplicaciones Web con.net

XPERTO EN DISEÑO DE PÁGINAS WEB

Acceso a Datos ADO.NET

GALA CONCEPTO COMMIT, ROOLBACK SAVEPOINTS (SAVE TRANSACTION) No Consultas. Definiciones Transacciones ( L33 )

ADO.NET con Base de datos SQL Server

Administración y programación de Bases de Datos con SQL Server 2005

Tema 2 Modelos de Base de Datos. Profesor Luis Gmo. Zúñiga Mendoza UMCA

Índice de contenidos Iniciación a VB.NET Bases de Datos

Conexión ODBC Visual Basic - MSQL. Cristian Vidal Silva

BASE DE DATOS QUÉ ES UNA BASE DE DATOS?

CURSORES EN SQL SERVER

ACCESO A DATOS CON MICROSOFT ADO.NET

TUTORIAL DATA WAREHOUSE SQL Server: ETL Parte II

Practica 11: Conexión de Java con Bases de datos Access

ADMINISTRACIÓN DE BASE DE DATOS

Índice general. Pág. N. 1. Capítulo Introducción a la Programación Orientada a Objetos. Capítulo 2. FrameWork 4.5 y Clases

I. DATOS INFORMATIVOS. Carrera Especialidad. Curso Código Ciclo. Requisitos Duración Horas Semana : 06 horas Versión : v.0810 II.

Presentación 4: ADO.NET

Tema: Desarrollo de aplicaciones con Visual Studio.net Parte II

Registro y Comunicación Automatizada a Bases de Datos

Marcos de Desarrollo. Diseño e implementación de aplicaciones Web con.net

Programación de Consultas SQL ADO.Net LDP / DUOC-AV

CAPITULO 9. Diseño de una Base de Datos Relacional Distribuida

%& %)& '$!%*+ $, %%%&$ %%

Base de Datos JDBC. Unidad: 1 Laboratorio de Programación. Universidad Nacional de la Patagonia Austral Unidad Académica Río Gallegos

REQUISITOS DEL SISTEMA. Software Servidor. Cliente. Hardware Servidor. Cliente

ÍNDICE CAPÍTULO 1. TIPOS DE ALMACENAMIENTO DE LA INFORMACIÓN... 13

Bases de Datos Relacionales

Microsoft SQL Server 2005

GLOSARIO DE TÉRMINOS

JDBC. Aplicaciones Distribuidas

DESARROLLO.NET 2011 CATÁLOGO FORMATIVO

1

INTRODUCCION. entidades. Modelo lógico de la base de datos. Matricula. carne. codigo_curso. año semestre nota. propiedades

Curso: Desarrollo de aplicaciones para escritorio y acceso de datos con.net FRAMEWORK 4.

BASES DE DATOS AVANZADAS Transacciones en MYSQL

Bases de Datos / Elementos de Bases de Datos Que es un Stored Procedure? Stored Procedures: Ventajas

Oracle 12c DISEÑO Y PROGRAMACIÓN

2- Creación de tablas y manejos de datos.

Repaso. Laboratorio Informix. Stored Procedures. Ejemplo. Creación de stored procedures. Sql en un Procedimiento

Práctica sobre compartición de instancias remotas.

Practica 7 Conexión a su base de datos. Optativa II

Introducción a JDBC - Base de datos con Java

ÍNDICE. Introducción... Capítulo 1. Novedades, mejoras y requisitos para la instalación... 1

m046a Curso Consultando SQL Server 2005/2008 con Transact-SQL, 15 h

Laboratorio Informix. Stored Procedures Triggers

Java y MySQL. Ciclo de ejecución

las necesitan. Estos índices deben de ser administrados y revisados por lo menos cada tres meses para que los índices no sean un problema.

TUTORIAL DESARROLLO DE APLICACIONES PARA EVOLUTION CON MS ACCESS

2407: Programación en Microsoft C#, 2012 Edition

CURSO DE SQL SERVER 2005

Microsoft Visual Basic.NET

MySQL y Sesiones en PHP. Área de Ingeniería Telemática

ADO.NET. Introducción. Requisitos de la plataforma ADO.NET. Desde DAO hasta ADO. Marco Besteiro y Miguel Rodríguez

Arquitectura de sistema de alta disponibilidad

CAPÍTULO 3 DISEÑO DE LA ARQUITECTURA

LABORATORIO DE RC: PRÁCTICA 4: IMPLEMENTACIÓN DE UN CLIENTE DE CORREO

Parte III. Características del proyecto. Web corporativa. Aplicación gestión. Comandas. Gestión cocina.

SGME Documento Adjunto. Manual de introducción al acceso a la base de datos. Andrés Moschini

Structured Query Language. Práctica

Técnicas de Programación

03.04 Unity. Integración de Sistemas. Parte II. Diseño e implementación de aplicaciones Web con.net

Conexión SQL Server y C# (Consola)

APLICACIONES WEB PERL + BASES DE DATOS REQUERIMIENTO RESPUESTA

A continuación se describen cuáles son los elementos principales de las tablas, cómo crear una y cómo modificarla.

Curso Online de Microsoft

PROGRAMA FORMATIVO MICROSOFT VISUAL BASIC. NET

Taller de Programación II J2EE

myappgen Usted Construye la aplicación mientras la ejecuta

Aplicaciones de las vistas Concepto de vista Vistas en SQL Vistas en SQL.

Federico Peinado

Base de datos relacional

CAPITULO 8. Planeamiento, Arquitectura e Implementación

MySQL 5 (versiones 5.1 a 5.6) Guía de referencia del desarrollador

Transcripción:

Acceso a Datos ADO.NET 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

Evolución histórica de acceso a datos Inicialmente, no había interfaces comunes de acceso a datos Cada proveedor proporcionaba un API (u otros mecanismos) Cambiar SGBD tenía un coste muy alto

Evolución histórica de acceso a datos ODBC (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 No incluye soporte para algunos tipos incluidos en SQL:1999 y SQL:2003

Evolución histórica de acceso a datos OLE-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 otros OLE-DB Consumers Se comunican con los proveedores

Evolución histórica de acceso a datos OLE-DB (Object Linking and Embedding Database) Arquitectura OLE-DB Extraí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 Desde lenguajes que utilizan punteros, como C o C++ es posible acceder directamente a las APIs ODBC y OLE-DB Para acceder desde otros lenguajes es necesaria 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: sólo puede hablar con el motor JET Menor rendimiento

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

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 proveedores

Evolución histórica de acceso a datos Data Access Consumers ActiveX Data Objects (ADO) Arquitectura ADO Extraí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

Conceptos básicos de ADO.NET Arquitectura del.net Framework VB C++ C# J#.NET Framework SDK.NET Framework Redistributable.NET Framework Class Library Common Language Specification LINQ ADO.NET Entity Framework WPF WCF WF Card Space ADO.NET WinForms ASP.NET Base Class Library Common Language Runtime Windows COM+ Services

Conceptos básicos de ADO.NET Con la versión del.net Framework, Microsoft introdujo un nuevo modelo 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 de un SGBD Gran rendimiento al ser capaces de utilizar optimizaciones específicas Permite conectarse a casi cualquier BD existente

Conceptos básicos de ADO.NET Data Providers OLE DB.NET Data Provider OLE DB Provider Otra BD ODBC.NET Data Provider ODBC Driver Otra BD Cliente SQL.NET Data Provider SQL SERVER Oracle.NET Data 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.NET OLE DB Acceso vía protocolo OLE DB a cualquier fuente de datos que lo soporte System.Data.OleDb ODBC Acceso vía protocolo ODBC a cualquier fuente de datos que lo soporte System.Data.Odbc SQL Server Oracle Acceso nativo a MS SQL Server 7.0 o superior y MS Access System.Data.SqlClient Acceso nativo a Oracle Server System.Data.OracleClient Otros provistos por terceros MySQL, PostgreSQL, DB2, etc.

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ó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 (forwardonly) para iterar sobre los registros rápidamente DataSet: proporciona mecanismo de almacenamiento para datos desconectados. Nunca 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.

Conceptos básicos de ADO.NET Base de Datos XxxConnection XxxCommand XxxDataAdapter DataSet XxxDataReader

Conceptos básicos de ADO.NET

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 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...

Conceptos básicos de ADO.NET Ejemplo de Creación de Conexiones using System; 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;" + "Initial Catalog=ADOTutorial;User ID=ADOTutorial;" + "Password=ADOTutorial"; // Create the connection... connection = new SqlConnection(); connection.connectionstring = connectionstring;

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); Console.WriteLine("StackTrace: " + e.stacktrace); } finally { // Ensures connection is closed if (connection!= null) connection.close(); }

Conceptos básicos de ADO.NET Namespace System.Data Independencia del proveedor sin Generic Factory Model Extraído de: McClure, W. B. (2005). Professional ADO. NET 2: Programming with SQL Server 2005, Oracle, and MySQL: Wrox.

Conceptos básicos de ADO.NET Namespace System.Data Todos los Data Providers deben implementar una serie de interfaces System.Data.IDbConnection System.Data.IDbCommand System.Data.IDbDataParameter System.Data.IDbTransaction System.Data.IDataReader System.Data.IDataAdapter...

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 Independencia del proveedor con Generic Factory Model Extraído de: McClure, W. B. (2005). Professional ADO. NET 2: Programming with SQL Server 2005, Oracle, and MySQL: Wrox.

Generic Factory Model Namespace System.Data.Common DbConnection 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

DbConnection Propiedades ConnectionString ConnectionTimeOut DataBase State Open Métodos Close void Open() void Close() void ChangeDataBase(dbName); DbCommand CreateCommand()

DbConnection Connection String Dependerá del proveedor de acceso a datos Listas de conection string s disponibles en: http://www.codeproject.com/kb/database/connectionstrings.aspx http://www.carlprothman.net/default.aspx?tabid=81 Ejemplos: SqlServer: "Data Source=localhost\SQLExpress; Initial Catalog=miniportal; User ID=user;Password=password "Data Source=localhost\SQLExpress; Initial Catalog=miniportal; Integrated Security=true" 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";

DbConnection Connection Pooling Pool de Conexiones habilitado automáticamente 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(); DbConnection othernorthwindconnection = new SqlConnection(); othernorthwindconnection.connectionstring = "Integrated Security=SSPI;Initial Catalog=northwind"; // The connection string matches pool A. othernorthwindconnection.open(); Al cerrar una conexión, ésta se devuelve al pool

Proveedores de Acceso a Datos (Data Providers) Independizar código del proveedor de datos Factoría de proveedores : DbProviderFactories Crea instancias de un proveedor de acceso a datos /* Returns an instance of a System.Data.Common.DbProviderFactory * for the specified providername */ DbProviderFactory dbfactory = DbProviderFactories.GetFactory(providerName); Objeto DbProviderFactory.CreateCommand().CreateConnection().CreateParameter()

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... // Open the connection... connection.open(); //... } catch (Exception e) { //... } finally { // Ensures connection is closed if (connection!= null) connection.close(); }

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 salida Name: 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 ---------------------------------------- Name: SqlClient Data Provider Description:.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 <... >

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 Enviar y recibir parámetros Crear una versión compilada

Comandos. DbCommand Propiedades CommandText CommandTimeOut CommandType CommandType.Text CommandType.StoredProc Connection Parameters Transaction

Comandos. DbCommand Si se trabaja con comandos dependientes del Data Provider es posible 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 Único constructor, sin parámetros Inicialización mediante acceso a propiedades // Create the command and set properties... DbCommand command = connection.createcommand(); command.commandtext = "SELECT loginname FROM UserProfile "; command.connection = connection; command.commandtimeout = 15; command.commandtype = CommandType.Text; // Open the connection... connection.open();

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

Parámetros // Create the command and set properties... DbCommand command = connection.createcommand(); command.commandtext = "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 Conectado Base de Datos XxxConnection XxxConnection: maneja la conexión a una BD XxxCommand: ejecuta comandos contra una BD XxxDataReader: Proporciona acceso a datos Read-only, Forward-only (Entorno Conectado) XxxCommand XxxDataAdapter DataSet XxxDataReader

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 ExecuteScalar 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 datos 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

Entorno Conectado. DbDataReader Propiedades de interés: FieldCount: devuelve el número de campos en la fila actual RecordsAffected: número de registros afectados Métodos Read() Avanza el DbDataReader al siguiente registro Inicialmente se sitúa antes del primer registro del resultado Devuelvefalse 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 while (dr.read()) { String loginname = dr.getstring(0); String email = dr.getstring(1); Console.WriteLine("loginName: " + loginname + ", email: " + email); } } // Close the DataReader... dr.close();

Entorno Conectado. ExecuteNonQuery try { //... // 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. ExecuteScalar try { //... // 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 * object). * Additional columns or rows are ignored. */ int numberofusers = (int)command.executescalar(); } Console.WriteLine("numberOfUsers: " + numberofusers);

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 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ón connection.begintransaction(); Es obligatorio asociar los comandos a la transacción Propiedad command.transaction Métodos Commit(); Rollback();

Transacciones Niveles de Aislamiento 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 concurrencia El nivel de aislamiento se fija en el momento de crear la transacción connection.begintransaction( IsolationLevel.Serializable);

Transacciones try { //... // 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;

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... 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; updatecommand.parameters.add(balanceparam); // Execute the updatecommand... int afectedrows = updatecommand.executenonquery(); transaction.commit(); commited = true; } Console.WriteLine("Transaction COMMITED");

Transacciones catch (DbException e) { Console.WriteLine(e.StackTrace); 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 Se 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 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

Entorno Desconectado Base de Datos XxxConnection XxxCommand XxxConnection: maneja la conexión a una BD XxxCommand: ejecuta comandos contra una BD XxxDataAdapter: intercambia datos entre un DataSet y una BD DataSet: copia local de datos relacionales (Entorno Desconectado) XxxDataAdapter DataSet XxxDataReader

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

Entorno Desconectado: DataTable Representación lógica de una tabla de la base de datos Propiedades de interés: Columns: Rows: Colección de tipo ColumnsCollection de objetos DataColumn Colección de tipo RowsCollection de objectos DataRow ParentRelations: RelationsCollection. Relaciones en las que participa la tabla Constraints: DataSet: Colección de tipo ConstraintsCollection 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 DataRow DataRelation

Entorno Desconectado. XxxDataAdapter Bridge entre origen de datos y DataSet Implementa 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 SQL InsertCommand: Obtiene o establece el comando de inserción SelectCommand: Obtiene o establece el comando de selección UpdateCommand: Obtiene o establece el comando de actualización TableMappings: Relaciona la tabla con el DataTable Debe especificarse siempre un comando de selección

Entorno Desconectado Fill DataAdapter DataSet Update Errors Collection SelectCommand InsertCommand UpdateCommand DeleteCommand Command Parameters Connection Data Source

Entorno Desconectado try { //... // 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; // 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) */ 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...

Anexo I CORRESPONDENCIA ENTRE TIPOS C#, SQL ESTÁNDAR Y SQL SERVER

Correspondencia entre tipos C# y SQL estándar Tipo C# bool byte short int long float double decimal String byte[] System.DateTime Tipo SQL estándar BIT TINYINT SMALLINT INTEGER BIGINT REAL DOUBLE NUMERIC VARCHAR, LONGVARCHAR VARBINARY, LONGVARBINARY DATE, TIME - TIMESTAMP

Correspondencia entre tipos C# y SQL Server Tipo C# bool byte short int long float double decimal String byte[] Tipo SQL Server BIT TINYINT SMALLINT INTEGER BIGINT REAL FLOAT NUMERIC, DECIMAL CHAR, VARCHAR, NCHAR, NVARCHAR VARBINARY System.DateTime DATETIME - TIMESTAMP, ROWVERSION

Correspondencia entre tipos C#, SQL estándar y SQL Server Tipo C# Tipo SQL estándar Tipo SQL Server bool byte short int long float BIT TINYINT SMALLINT INTEGER BIGINT 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