Acceso a Datos ADO.
NET
Integracin de Sistemas
Diseo e implementacin con .NET
Introduccin a [Link]
[Link] es el modelo de acceso a datos para las aplicaciones basadas en .NET Se puede utilizar para acceder a sistemas de base de datos relacionales. Ejemplos:
SQL Server, Oracle, etc. Muchas otras fuentes de datos (para las cuales existe un proveedor OLE DB u ODBC)
Soporte intrnseco para XML Programacin Orientada a Componentes
[Link]
Evolucin histrica ODBC (Open DataBase Connectivity)
Interoperatibilidad con amplio rango de SGBD API acceso ampliamente aceptada Usa SQL como lenguaje de acceso a datos
DAO (Data Access Objects)
Interfaz de programacin para bases de datos JET/ISAM (e.g. MS Access)
[Link]
Evolucin histrica RDO (Remote Data Objects)
Estrechamente ligado a ODBC Orientado a aplicaciones cliente/servidor
OLE DB (Object Linking and Embedding for Databases)
No restringrido a acceso a datos relacionales
No limitado a SQL como lenguaje de recuperacin de datos
Tecnologa desarrollada por Microsoft
Construido sobre COM (Component Object Model)
Proporciona una interfaz a bajo nivel en C++
[Link]
Evolucin histrica ADO (ActiveX Data Objects)
Ofrece una interfaz orientada a objetos Proporciona un modelo de programacin para OLE DB accesible desde lenguajes diferentes a C++ Diseado como modelo conectado, altamente acoplado
Indicado para arquitecturas cliente/servidor
No pensado para arquitecturas multicapa en entornos distribuidos Diseo no correctamente factorizado
Demasiadas maneras de hacer lo mismo Algunos objectos acaparan demasiada funcionalidad
[Link]
Qu es [Link]? Coleccin de clases, interfaces, estructuras y enumeraciones que permiten acceder a diversas fuentes de datos (BD, XML, etc.) desde la plataforma .NET
Organizada en namespaces:
[Link] [Link] [Link] [Link] Etc.
Evolucin de ADO
No comparte con ste su jerarqua de clases S comparte su funcionalidad Usa internamente XML
[Link]
Arquitectura Framework .NET
VB
C++
C#
J#
Common Language Specification [Link] Windows Forms
[Link] y XML Base Class Library Common Language Runtime Windows COM+ Services
[Link]
Conceptos Bsicos y Arquitectura Modelo de objetos
Objetos de [Link] Proveedores de acceso a datos .NET
Jerarqua de espacio de nombres (namespace)
Organiza el modelo de objetos Incluye:
[Link] [Link] [Link] [Link] [Link]
[Link]
Proveedores de Acceso a Datos (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
[Link]
Proveedores de Acceso a Datos
Proporcionan un conjunto de clases que implementan una serie de interfaces comunes [Link]
OLE DB
Acceso va protocolo OLE DB a cualquier fuente de datos que lo soporte [Link]
ODBC
Acceso va protocolo ODBC a cualquier fuente de datos que lo soporte [Link]
SQL Server
Acceso nativo a MS SQL Server 7.0 o superior y MS Access [Link]
Oracle
Acceso nativo a Oracle Server [Link]
Otros provistos por terceros
MySQL, PostgreSQL, DB2, etc.
[Link]
Proveedores de Acceso a Datos
public static void ListProviders() { DataTable factoryTable = [Link](); foreach (DataRow dr in [Link]) { [Link]("Name: {0}", dr["Name"]); [Link]("Description: {0}", dr["Description"]); [Link]("InvariantName: {0}", dr["InvariantName"]); [Link]("AssemblyQualifiedName: {0}", dr["AssemblyQualifiedName"]); } } // Sample Output //Name: SqlClient Data Provider //Description: .Net Framework Data Provider for SqlServer //InvariantName: [Link] //AssemblyQualifiedName: [Link], // [Link], Version=[Link], Culture=neutral, // PublicKeyToken=b77a5c561934e089
[Link]
[Link] 2.0 API Independiente
Namespace [Link]
DbCommand DataAdapter DbParameter DbCommandBuilder DbDataAdapter DbConnection DbDataReader
DbParameterCollection DbTransaction DbException
DbProviderFactory DbProviderFactories
[Link]
Arquitectura
[Link]
Arquitectura
Base de Datos XxxConnection: maneja la conexin 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) XxxDataReader: Proporciona acceso a datos Read-only, Forward-only (Entorno Conectado) XxxDataReader
XxxConnection XxxCommand XxxDataAdapter
DataSet
[Link]
Entornos de Acceso a Datos
Conectado:
forward-only, read-only Aplicacin realiza una consulta y lee los datos conforme los va procesando Cursor unidireccional Objeto DataReader
Desconectado
La aplicacin ejecuta la consulta y almacena los resultados de la misma para procesarlos despus Minimiza el tiempo de conexin a la base de datos Objetos lightweight Objetos DataSet y DataAdapter
[Link]
Namespace [Link]
Contiene la base de [Link] Proporciona el modo de trabajo sobre datos
Clases y mtodos para la manipulacin de datos Posibilidad de creacin de vistas Representacin lgica de los datos Utilizacin de XML para visualizar, compartir y almacenar datos
[Link]
Namespace [Link] Acceso Independiente a Datos
[Link] [Link] [Link] [Link] [Link] [Link]
[Link]
DbConnection
Establece una sesin con una fuente de datos Implementada por SqlDbConnection,ODBCConnection, OleDbConnection, etc. Funcionalidad
Abrir y Cerrar conexiones Gestionar Transacciones
Usada conjuntamente con objetos DbCommand y DataAdapter Propiedades adicionales, mtodos y colecciones dependern de la implementacin especfica del proveedor
[Link]
DbConnection
Propiedades
ConnectionString ConnectionTimeOut DataBase State
Open Close
Mtodos
void Open() void Close() void ChangeDataBase(dbName); DbCommand CreateCommand()
[Link]
DbConnection. Connection String
Depender del proveedor de acceso a datos [Link] 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=pwd; DATABASE=db;"
Access OLEDB:
"Provider=MSDASQL; Driver={Microsoft Access Driver (*.mdb)}; Dbq=drive:\path\[Link]; Uid=user; Pwd=pwd";
10
[Link]
Connection Pooling Pool de Conexiones habilitado automticamente
Pool se crea en base a la cadena de conexin Al cerrar una conexin, sta se devuelve al pool
SqlConnection conn = new SqlConnection(); [Link] = "Integrated Security=SSPI;Initial Catalog=northwind"; [Link](); // Pool A is created. SqlConnection conn = new SqlConnection(); [Link] = "Integrated Security=SSPI;Initial Catalog=pubs"; [Link](); // Pool B is created because the connection strings differ. SqlConnection conn = new SqlConnection(); [Link] = "Integrated Security=SSPI;Initial Catalog=northwind"; [Link](); // The connection string matches pool A.
[Link]
Ejemplo Creacin de Conexiones
using [Link]; using [Link]; <<...>> String connectionString = "DataSource=localhost\\SQLExpress;" + "Initial Catalog=miniportal;" + "UserID=user;Password=password"; SqlConnection connection = new SqlConnection(); [Link] = sqlConnectionString; [Link](); <<...>> [Link]();
11
[Link]
Providers Factory Independizar cdigo del proveedor de datos
Factora de proveedores : DbProviderFactories Crea instancias de la implementacin de un proveedor de las clases de origen de datos
Objeto DbProviderFactory
.CreateCommand() .CreateConnection() .CreateParameter()
[Link]
Providers Factory
String providerName = "[Link]"; String connectionString = "Data Source=localhost\\SQLExpress;" + "Initial Catalog=miniportal;" + "User ID=user;Password=password"; DbProviderFactory dbFactory = [Link](providerName); DbConnection connection = [Link](); [Link] = connectionString; DbCommand command = [Link](); [Link] = connection; [Link] = "Select * from users";
12
[Link]
DbCommand
Representa una sentencia que se enva 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 parmetros Crear una versin compilada
Propiedades adicionales, mtodos y colecciones dependern de la implementacin especfica del proveedor
[Link]
DbCommand Propiedades
CommandText CommandTimeOut CommandType
[Link] [Link]
Connection Parameters Transaction
13
[Link]
Comandos
Si se trabaja con comandos dependientes del Data Provider es posible disponer de varios constructores
SqlCommand() SqlCommand(cmdText) SqlCommand(cmdText, connection) SqlCommand(cmdText, connection, transaction)
SqlCommand command = new SqlCommand("SELECT loginName " + "FROM UserProfile ", connection);
[Link]
Comandos
Si se trabaja con comandos genricos (independientes del "Data Provider"), el comando debe crearse a partir de la conexin
nico constructor, sin parmetros Inicializacin mediante acceso a propiedades
// Create the command and set properties ... DbCommand command = [Link](); [Link] = "SELECT loginName " + "FROM UserProfile "; [Link] = connection; [Link] = 15; [Link] = [Link]; [Link]();
14
[Link]
Comandos Parametrizados Comandos poseen coleccin Parameters DbParameter
ParameterName DbType
Enumeracin: String, Int32, Date, Double, etc.
Value Size IsNullable
[Link]
Comandos Parametrizados
DbCommand command = [Link](); [Link] = "SELECT loginName FROM UserProfile " + "WHERE loginName = @loginName"; // Create and populate parameter DbParameter loginNameParam = [Link](); [Link] = "@loginName"; [Link] = [Link]; [Link] = "jsmith"; [Link](loginNameParam);
15
[Link]
Mecanismos de Acceso a Datos
DbCommand ExecuteReader ExecuteNonQuery ExecuteScalar
Entorno Conectado
DbDataAdapter DataSet
Entorno Desconectado
[Link]
Entorno Conectado. DbCommand ExecuteReader
Sentencias que devuelven mltiples 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
16
[Link]
Entorno Conectado. DbDataReader Proporciona acceso secuencial de slo lectura a una fuente de datos Creado a travs de [Link]() Al utilizar un objeto DbDataReader, las operaciones sobre la conexin DbConnection quedan deshabilitadas hasta que se cierre el objeto DbDataReader
[Link]
DbDataReader
Propiedades de inters:
FieldCount: devuelve el nmero de campos en la fila actual RecordsAffected: nmero de registros afectados
Mtodos
Read()
Avanza el DbDataReader al siguiente registro Inicialmente se sita 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 mtodos para el tipado de los datos ledos (GetValue, GetString, etc.)
Boolean b = [Link](fieldNumber);
17
[Link]
DbDataReader
try { << ... >> // Create the command and set properties ... DbCommand command = [Link](); [Link] = "SELECT loginName, email " + "FROM UserProfile" ; [Link] = connection; [Link](); // Open the connection and execute the command ... [Link](); DbDataReader dr = [Link](); while ([Link]()) { String loginName = [Link](0); String email = [Link](1); [Link]("loginName: " + loginName + ", email: " + email); } // Close the DataReader ... [Link](); } catch (Exception e) { << ... >> } finally { // Ensures connection is closed if (connection != null) [Link](); }
[Link]
Entorno Conectado. ExecuteNonQuery
ExecuteNonQuery
<< ... >> // Create the command and set properties ... DbCommand command = [Link](); [Link] = "UPDATE Account " + "SET balance = 1.1 * balance "; [Link] = connection; [Link](); // Open the connection and execute the command ... [Link](); // Executes an SQL statement against the Connection object // of a .NET Framework data provider, and returns the // number of rows affected. int affectedRows = [Link](); [Link]("affectedRows: " + affectedRows); << ... >>
18
[Link]
Entorno Conectado. ExecuteScalar
ExecuteScalar
<< ... >> // Create the command and set properties ... DbCommand command = [Link](); [Link] = "SELECT count(*) " + "FROM UserProfile "; [Link] = connection; [Link](); // Open the connection and execute the command ... [Link](); // Executes the query, and returns the first column of the // first row in the resultset returned by the query. Extra // columns or rows are ignored. Int32 numberOfUsers = (Int32) [Link](); [Link]("numberOfUsers: " + numberOfUsers); << ... >>
[Link]
Transacciones
Transaccin:
Conjunto sentencias SQL que constituyen una unidad lgica de trabajo
Debe ajustarse a las propiedades ACID:
Atomicity:
Las sentencias se ejecutan todas o ninguna
Consistency:
Una vez finalizada, los datos deben ser consistentes
Isolation:
Transacciones se comporten como si cada una fuera la nica transaccin
Durability:
Una vez finalizada, los cambios son permanentes
19
[Link]
Transacciones Se crean a partir de la conexin
[Link]();
Es obligatorio asociar los comandos a la transaccin
Propiedad [Link]
Mtodos
Commit(); Rollback();
[Link]
Transacciones
Niveles de Aislamiento
[Link]: pueden ocurrir dirty reads, non-repeatable reads y phantom reads [Link]: pueden ocurrir non-repeatable reads y phantom reads [Link]: pueden ocurrir phantom reads" [Link]: elimina todos los problemas de concurrencia
El nivel de aislamiento se fija en el momento de crear la transaccin
[Link]( [Link]);
20
[Link]
Transacciones
try { // Get the connection ... << ... >> // Open the connection ... [Link](); // Starts a new transaction ... // transaction = [Link](); //default transaction = [Link]([Link]); // Create the command and set properties ... DbCommand selectCommand = [Link](); [Link] = connection; [Link] = "SELECT balance " + "FROM ACCOUNT " + "WHERE accId = 1"; // Associate the command with the transaction [Link] = transaction; [Link]();
[Link]
Transacciones
// Execute the selectCommand ... dataReader = [Link](); if (![Link]()) { throw new Exception("Error reading from Data Base"); } balance = [Link](0); [Link]("Current balance: " + balance); balance = 1.1 * balance; [Link]("New balance must be: " + balance); // PAUSE: another process could try to change the balance value in BD [Link](); // The DataReader must be closed before executing updateCommand!!! [Link](); // Create the updateCommand and set properties ... DbCommand updateCommand = [Link](); [Link] = connection; [Link] = "UPDATE ACCOUNT " + "SET balance = @balance " + "WHERE (accId = 1)";
21
[Link]
Transacciones
[Link] = transaction; [Link](); DbParameter balanceParam = [Link](); [Link] = "@balance"; [Link] = [Link]; [Link] = balance; [Link](balanceParam); // Execute the updateCommand ... int afectedRows = [Link](); [Link](); commited = true; [Link]("Transaction COMMITED"); } catch (DbException e) { [Link]([Link]); [Link]([Link]); } catch (Exception e) { [Link]([Link]); [Link]([Link]);
[Link]
Transacciones
} finally { if (!commited) { if (transaction != null) { [Link](); } } // Ensures connection is closed if ([Link]([Link])) { [Link](); } } }
22
[Link]
Excepciones
[Link]
Se lanza cuando ocurre algn problema en la capa de acceso a datos Es una clase abstracta que implementa ExternalException Cada "Data Provider" proporcionar una implementacin especfica
Constructores:
DbException() DbException(string message)
message: mensaje a mostrar
DbException(string message, Exception innerException)
innerException: la referencia de la excepcin interna
DbException(string message, int errorCode)
errorCode: cdigo de error para la excepcin
[Link]
Entorno Desconectado
Base de Datos XxxConnection: maneja la conexin 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) XxxDataReader: Proporciona acceso a datos Read-only, Forward-only (Entorno Conectado) XxxDataReader
XxxConnection XxxCommand XxxDataAdapter
DataSet
23
[Link]
Entorno Desconectado: DataSet
Ncleo [Link] bajo entorno desconectado Representacin 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
Sincronizacin datos Acceso Concurrente
[Link]
DataTable
Representacin lgica de una tabla de la base de datos Propiedades de inters:
Columns:
Coleccin de tipo ColumnsCollection de objetos DataColumn
Rows:
Coleccin de tipo RowsCollection de objectos DataRow
ParentRelations:
RelationsCollection. Relaciones en las que participa la tabla
Constraints:
Returns the tables ConstraintsCollection
DataSet:
DataSet en el que est incluida la DataTable
PrimaryKey:
DataColumn que acta como clave primaria de la tabla
24
[Link]
Entorno Desconectado: DataSet
DataSet
DataTable
DataColumn
DataRow
DataRelation
[Link]
Entorno Desconectado. SqlDataAdapter
Bridge entre origen de datos y DataSet Implementa los mtodos abstractos de la clase DataAdapter:
public abstract int Fill( DataSet dataSet ); public abstract int Update( DataSet dataSet );
Propiedades de inters:
DeleteCommand: El comando de borrado, expresado en SQL InsertCommand: Obtiene o establece el comando de insercin SelectCommand: Obtiene o establece el comando de seleccin UpdateCommand: Obtiene o establece el comando de actualizacin TableMappings: Relaciona la tabla con el DataTable
Debe especificarse siempre un comando de seleccin
25
[Link]
Entorno Desconectado
Fill
DataAdapter
SelectCommand InsertCommand UpdateCommand DeleteCommand Update
DataSet
Errors Collection
Command Connection Data Source
Parameters
[Link]
Entorno Desconectado
// Create the DataAdapter SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(); // Establish Select Command (used to populate the DataSet) SqlCommand selectCmd = new SqlCommand("Select * from UserProfile", connection); [Link] = selectCmd; // Create the DataSet DataSet sqlDataSet = new DataSet("UserProfile"); // Fill DataSet [Link](sqlDataSet, "UserProfile"); [Link]();
26
[Link]
Entorno Desconectado
// Access Data // First table in the data set DataTable dataTable = [Link]["UserProfile"]; // First row in the table DataRow dr = [Link][0] [Link]( dr["loginName"] ); // Access Email Column DataColumn emails = [Link]["email"];
27