Objetivo: Desarrollar aplicaciones visuales y orientadas a eventos que permitan el almacenamiento de datos de manera persistente a través de formularios dinámicos con interacción a bases de datos.
RD Unidad 2: Transmisión de datos. El mundo del TCP/IP y direccionamiento iPv4
POE Unidad 3: Aplicaciones visuales orientadas a eventos con acceso a base de datos
1. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 1
29/04/2022
Aplicaciones visuales
orientadas a eventos con
acceso a base de datos
Unidad 3
Material docente compilado por el profesor Ph.D. Franklin Parrales Bravo
para uso de los cursos de Programación Orientada a Eventos
2. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 2
29/04/2022
Objetivo general de la Unidad 3
Desarrollar aplicaciones visuales y orientadas a
eventos que permitan el almacenamiento de datos
de manera persistente a través de formularios
dinámicos con interacción a bases de datos.
3. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 3
29/04/2022
Contenido
• Conceptos básicos y Conexión a base de
datos.
• Objetos comunes para trabajo con base de
datos: connection, command, parameter,
datareader, dataadapter.
• Formularios dinámicos con interacción a
base de datos.
• Creación de consultas y generación de
documentos con formato portable.
• Leer y escribir datos XML
4. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 4
29/04/2022
SQL
• Lenguaje estándar para acceder a una base de datos
relacional, estandarizado por el American National
Standards Institute (ANSI): SQL-92.
– En gran parte, los distintos DBMS utilizan todos el mismo
SQL, si bien cada vendedor le ha añadido sus propias
extensiones.
• El lenguaje SQL se divide en:
– DDL (Data Definition Language), utilizado para crear y
modificar la estructura de la base de datos (p.ej. CREATE
TABLE).
– DML (Data Manipulation Language), empleado para
manipular los datos almacenados en la base de datos
(p.ej. consultas con la sentencia SELECT).
– DCL (Data Control Language), para establecer permisos
de acceso (GRANT, REVOKE, DENY) y gestionar
transacciones (COMMIT y ROLLBACK).
5. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 5
29/04/2022
¿Qué es SQL?
• Sintaxis de instrucciones SQL habituales
– Para especificar exactamente qué registros deseamos
recuperar, utilizar
• SELECT Campo FROM Tabla
– Para limitar la selección de registros, utilizar
• SELECT * FROM Tabla WHERE Campo = "String"
– Para devolver registros en orden ascendente, utilizar
• SELECT * FROM Tabla ORDER BY Campo ASC
• Ejemplo
Definición: SQL es un lenguaje estándar de mercado que
ha evolucionado hasta convertirse en el medio de mayor
aceptación para realizar consultas y modificar datos en
una base de datos
SELECT Nombre FROM Empleados
6. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 6
29/04/2022
Consultas SQL
• Permiten consultar datos de las tablas.
• Típicamente consisten de 3 partes:
– SELECT [Nombres de los campos]
– FROM [Nombre de la(s) tabla(s)]
– WHERE [Condición(es) de filtrado de datos]
7. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 7
29/04/2022
Estructura de la sentencia SELECT
- Nombres de las tablas / vistas
- Condiciones (filtros) de selección de filas
- Nombre de las columnas
- Condiciones de selección de grupo
- Nombres de columnas
SELECT A1, …, An
FROM T1, …, Tn
WHERE P
GROUP BY Ai1, …, Ain
HAVING Q
ORDER BY Aj1, …, Ajn
-Describe la salida deseada con:
•Nombres de columnas
•Expresiones aritméticas
•Literales
•Funciones escalares
•Funciones de columna
8. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 8
29/04/2022
Ejemplos Select
SUM
A00
C01
Ahora sólo quiero ver los departamentos
cuya masa salarial sea superior a 50000
SELECT WORKDEPT, SUM(SALARY) AS SUM
FROM EMPLOYEE
WHERE WORKDEPT IN ('A00', 'B01', 'C01')
GROUP BY WORKDEPT
HAVING SUM(SALARY) > 50000
ORDER BY WORKDEPT
128500.00
90470.00
WORKDEPT
SELECT WORKDEPT, SUM(SALARY) AS SUM
FROM EMPLOYEE
WHERE WORKDEPT IN ('A00', 'B01', 'C01')
GROUP BY WORKDEPT
ORDER BY WORKDEPT
SUM
A00
B01
C01
128500.00
41250.00
90470.00
WORKDEPT
9. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 9
29/04/2022
Ejemplos Select
CLERK
PRES
SALESREP
ANALYST
29250.00000000
52750.00000000
46500.00000000
26110.00000000
JOB AVG
WORKDEPT
A00
A00
A00
C01
Necesito, agrupado por departmento, los
trabajadores que no sean managers,
designer, y fieldrep, con una media de
salario mayor que 25000€.
SELECT WORKDEPT, JOB,
AVG(SALARY) AS AVG
FROM EMPLOYEE
WHERE JOB NOT IN ('MANAGER', 'DESIGNER', 'FIELDREP')
GROUP BY WORKDEPT, JOB
HAVING AVG(SALARY) > 25000
ORDER BY WORKDEPT, JOB
10. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 10
29/04/2022
Interfaces de acceso a bases de datos
Evolución histórica de los "estándares" propuestos por Microsoft:
• ODBC (Open Database Connectivity): API estándar ampliamente
utilizado, disponible para múltiples DBMSs, utiliza SQL para
acceder a los datos.
• DAO (Data Access Objects): Interfaz para programar con bases de
datos JET/ISAM, utiliza automatización OLE y ActiveX.
• RDO (Remote Data Objects): Fuertemente acoplado a ODBC,
orientado al desarrollo de aplicaciones cliente/servidor.
• OLE DB: Construido sobre COM, permite acceder a bases de datos
tanto relacionales como no relacionales (no está restringido a SQL).
Se puede emplear con controladores ODBC y proporciona un
interfaz a bajo nivel en C++.
• ADO (ActiveX Data Objects): Ofrece un interfaz orientado a
objetos y proporciona un modelo de programación para OLE DB
accesible desde lenguajes distintos a C++ (p.ej. Visual Basic).
11. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 11
29/04/2022
Interfaces de acceso a bases de datos
ADO se diseñó para su uso en arquitecturas cliente/servidor con bases
de datos relacionales (no jerárquicas, como es el caso de XML).
Su diseño no está demasiado bien factorizado (ya que existen muchas
formas de hacer las cosas y algunos objetos acaparan demasiadas
funciones) y ADO no estaba pensado para arquitecturas multicapa en
entornos distribuidos.
12. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 12
29/04/2022
ADO
• Aplicaciones cliente/servidor
– Conexión permanente
• Desarrollo rápido
– Modelo de objetos versátil
• Conjunto de datos muy funcional
– Tipo y ubicación de cursor
– Actualización automática de BD
web distribuidas
datos desconectados
Trabajo extra
implícito
Funcionalidad de acceso a datos separada
Genérico
Personalizable
13. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 13
29/04/2022
ADO .NET
• Es una colección de clases, interfaces, estructuras y tipos
enumerados que permiten acceder a los datos almacenados
en una base de datos desde la plataforma .NET.
• Si bien se puede considerar una versión mejorada de ADO,
no comparte con éste su jerarquía de clases (aunque sí su
funcionalidad).
• ADO .NET combina las capas ADO y OLE DB en una única
capa de proveedores (managed providers). Cada proveedor
contiene un conjunto de clases que implementan interfaces
comunes para permitir el acceso uniforme a distintas fuentes
de datos.
• Ejemplos:
– ADO Managed Provider (da acceso a cualquier fuente de datos OLE DB),
– SQL Server Managed Provider (específico para el DBMS de Microsoft),
– Exchange Managed Provider (datos almacenados con Microsoft
Exchange)...
14. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 14
29/04/2022
ADO .NET
• ADO .NET usa XML. De hecho, los conjuntos de datos se almacenan
internamente en XML, en vez de almacenarse en binario como sucedía en
ADO.
• Al estar los datos almacenados en XML, se simplifica el acceso a los datos
a través de HTTP (algo que ocasiona problemas en ADO si los datos tienen
que pasar cortafuegos).
• Por otro lado, se simplifica la comunicación entre aplicaciones al ser XML
un formato estándar (p.ej. comunicación con applets Java).
15. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 15
29/04/2022
ADO .NET
• Con ADO .NET se puede acceder a los datos de dos formas
distintas:
– Acceso conectado: Acceso sólo de lectura con cursores
unidireccionales ("firehose cursors"). La aplicación realiza una
consulta y lee los datos conforme los va procesando con la
ayuda de un objeto DataReader.
– Acceso desconectado: La aplicación ejecuta la consulta y
almacena los resultados de la misma para procesarlos después
accediendo a un objeto de tipo DataSet. De esta forma, se
minimiza el tiempo que permanece abierta la conexión con la
base de datos.
• Al proporcionar conjuntos de datos de forma desconectada,
se utilizan mejor los recursos de los servidores y se pueden
construir sistemas más escalables que con ADO (que
mantenía abierta la conexión con la base de datos la mayor
parte del tiempo). Este enfoque resulta más adecuado en
sistemas distribuidos como Internet.
16. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 16
29/04/2022
Proveedores de datos
• Conjunto de objetos creados y optimizados para
acceso a un orígen de datos específico
• Interfaces
– System.Data
• Clases comunes
– System.Data.Common
• Bases de datos
– SQL Server: System.Data.SqlClient
– Oracle: System.Data.Oracle
• Tecnologías estándar:
– OLE-DB: System.Data.OleDb
– ODBC: System.Data.Odbc
17. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 17
29/04/2022
Client
SQL .NET
Data Provider
OLE DB .NET
Data Provider
ODBC .NET
Data Provider
OLE DB
Provider
ODBC
Driver
SQL SERVER
Other DB
Other DB
.NET Data Providers
18. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 18
29/04/2022
Proveedores de acceso a datos
Conjunto de clases que implementan una serie de interfaces comunes 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
Acceso nativo aMS SQL Server 7.0 ó superior y MS Access
System.Data.SqlClient
Oracle
Acceso nativo a Oracle Server
System.Data.OracleClient
Otros provistos por terceros
MySQL, PostgreeSQL, DB2, etc.
19. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 19
29/04/2022
Proveedores de acceso a datos
20. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 20
29/04/2022
Contenido
• Conceptos básicos y Conexión a base de
datos.
• Objetos comunes para trabajo con base de
datos: connection, command, parameter,
datareader, dataadapter.
• Formularios dinámicos con interacción a
base de datos.
• Creación de consultas y generación de
documentos con formato portable.
• Leer y escribir datos XML
21. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 21
29/04/2022
ADO.Net object model
• ADO.Net proporciona Managed Data Access. Esto significa que
las clases de ADO.Net se ajustan a los estándares de .Net
framework, son de tipo seguro y utilizan los tipos primitivos y los
objetos base proporcionados por el framework.
• La función de un Managed Data Access es análoga a la del
proveedor OLE DB en ADO. Ellos se encargan de
– Abrir una conexión a la data source (usando el objeto de connection)
– Obtener un flujo de datos de la data source (datos de solo lectura
proporcionados por el objeto DataReader, actualizables
proporcionados por el objeto DataAdapter)
– Sincronizar los cambios a través del DataAdapter
– Levantar errores
• El objeto DataSet se mantiene en la memoria, del lado del servidor
y está desconectado, pero proporciona el mismo nivel de
información que la fuente de datos original, es decir, los datos y el
esquema. También puede serializar (escribir en disco) utilizando
documentos de datos XML.
22. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 22
29/04/2022
¿Qué es el modelo de objetos
ADO.NET?
DataSet
Database
.NET Data Provider
Connection
Transaction
Command
Parameters
DataReader
DataAdapter
SelectCommand
InsertCommand
UpdateCommand
DeleteCommand
DataTableCollection
DataTable
DataRowCollection
DataColumnCollection
ConstraintCollection
DataRelationCollection
XML
23. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 23
29/04/2022
Conceptos y arquitectura
• El modelo de Objetos de ADO.NET
– Objetos DataSet
– Proveedores administrados
• Namespaces relacionados con ADO.NET
– System.Data
– System.Data.OleDb
– System.Data.Internal
– System.Data.Sql
– System.Data.SqlTypes
24. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 24
29/04/2022
Proveedores administrados
System.Data
.OleDb
.Sql
OleDbCommand
OleDbConnection
OleDbDataReader
OleDbDataSetCommand
SqlCommand
SqlConnection
SqlDataReader
SqlDataSetCommand
• Dos proveedores base:
– OLEDB: Namespace System.Data.OleDb
– SQL Server: Namespace System.Data.Sql
• Dependen de
System.Data.InternalDataCollectionBase para varias clases heredadas
25. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 25
29/04/2022
System.Data 1/2
• Contiene las bases de ADO.NET
• Namespace centrado en Datos
• Provee los mecanismos para trabajar con y
sobre los datos
– Clases y métodos para manipular los datos
– Habilidad para crear vistas de los datos
– Formas para representar lógicamente los datos
– Permite la utilización de XML para ver, compartir
y almacenar datos
26. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 26
29/04/2022
System.Data 2/2
Persistencia en memoria de la tabla de la base de datos
System.Data
DataTable
DataRow
DataRelation
DataColumn
DataSetView
DataSet
Contiene las clases “principales” de ADO.NET
Persistencia en memoria de los datos
Permite manipular una fila en un DataTable
Permite definir columnas en un DataTable
Puede relacionar 2 DataTables entre sí
Presenta una vista del DataSet
27. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 27
29/04/2022
ADO.Net object model
DataAdapter
Command
DataSet
Errors Collection
Connection Parameters
Data Source
Fill
Update
SelectCommand
InsertCommand
UpdateCommand
DeleteCommand
28. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 28
29/04/2022
Componentes de ADO.NET
• Connection (conexión)
• Command (órdenes)
• DataReader (lector de datos)
• DataAdapter (adaptador de datos)
29. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 29
29/04/2022
Rows
DataSet
.Net Data Provider
Client
Connection Command
database
DataAdapter
DataReader
Data Provider Functionality
30. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 30
29/04/2022
¿Qué es un entorno conectado?
• Un entorno conectado es aquel en que los
usuarios están conectados continuamente a
una fuente de datos
• Ventajas:
– El entorno es más fácil de mantener
– La concurrencia se controla más fácilmente
– Es más probable que los datos estén más
actualizados que en otros escenarios
• Inconvenientes:
– Debe existir una conexión de red constante
– Escalabilidad limitada
31. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 31
29/04/2022
Datos conectados
32. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 32
29/04/2022
Objetos del modelo conectado
• Connection (conexión)
– Representa una conexión a la BD
– Permite abrir y cerrar la conexión a la BD
• Command (comando)
– Representa una vía para representar sentencias
SQL a la BD
– Ejemplo: Select, Insert, Delete, Update
• DataReader (lector de datos)
– Almacén temporal de datos, de sólo lectura y
sólo hacia adelante
33. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 33
29/04/2022
ADO.NET – Accediendo a datos Conectado
En un escenario conectado, los
recursos se mantienen en el
servidor hasta que la conexión
se cierra
• 1) Abrir Conexión
• 2) Ejecutar Comando
• 3) Procesar Filas en
DataReader
• 4) Cerrar Reader
• 5) Cerrar Conexión
34. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 34
29/04/2022
Modelo conectado
35. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 35
29/04/2022
¿Qué es un entorno desconectado?
• Un entorno desconectado es aquel en el que los datos
pueden modificarse de forma independiente y los
cambios se escriben posteriormente en la base de
datos
• Ventajas:
– Las conexiones se utilizan durante el menor tiempo
posible, permitiendo que menos conexiones den servicio a
más usuarios
– Un entorno desconectado mejora la escalabilidad y el
rendimiento de las aplicaciones
• Inconvenientes:
– Los datos no siempre están actualizados
– Pueden producirse conflictos de cambios que deben
solucionarse
36. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 36
29/04/2022
Datos desconectados
37. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 37
29/04/2022
Objetos del modelo desconectado
• DataAdapter (adaptador de datos)
– Conecta el programa con la BD, realiza consultas,
llena los DataSet y sincroniza los cambios en la BD
– Es un mediador entre el DataSet y la BD
• DataSet (conjunto de datos)
– Es una estructura para almacenar datos
– Es una “copia en memoria local” de una porción de la
BD
– Se encuentra en la memoria del cliente
– Compatible con las BD relacionales (almacena datos
en forma de tablas)
38. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 38
29/04/2022
En un escenario desconectado, los
recursos no se mantienen en el servidor
mientras los datos se procesan
• 1) Abrir Conexión
• 2) Llenar DataSet mediante
DataAdapter
• 3) Cerrar Conexión
• 4) Procesar DataSet
• 5) Abrir Conexión
• 6) Actualizar fuente de datos mediante
DataAdapter
• 7) Cerrar Conexión
ADO.NET – Accediendo a datos Desconectado
39. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 39
29/04/2022
Modelo desconectado
40. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 40
29/04/2022
ADO.NET
• No depende de conexiones continuamente
activas, esto es, las aplicaciones se conectan
a la BD sólo durante el tiempo necesario
para consultar o actualizar datos.
• Las interacciones con la BD se realizan
mediante órdenes para acceso a los datos.
• Los datos requeridos normalmente se
almacenan en memoria caché en conjunto de
datos, lo que permite trabajar sin conexión
sobre una copia temporal de los datos.
41. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 41
29/04/2022
XML
• En ADO.NET, el formato de transferencia
es XML.
• La representación de datos XML no utiliza
información binaria, sino se basa en texto.
• Muchos servidores bloquean la
información binaria.
• Cuando se manejan datos en formato de
texto, se pueden enviar mediante
cualquier protocolo, como HTTP.
42. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 42
29/04/2022
ADO.NET y XML
• ADO.NET está estrechamente integrado con XML
Ejemplo de uso de XML en una aplicación ADO.NET desconectada
Servicios Web XML
DataSet
Solicitar datos
1
Consulta SQL
2
Resultados
3
XML
4
XML actualizado
5
SQL actualiza
6
Fuente de datos
Cliente
DataSet
43. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 43
29/04/2022
Cómo funciona la programación de bases
de datos
Conectar a una base de datos
Solicitar datos específicos
Devolver datos
Transmitir actualizaciones
Mostrar y
modificar
datos
Base de datos
Cerrar la conexión
En muchas aplicaciones, la conexión se cierra después de
que el usuario accede a los datos y vuelve a abrirse cuando
el usuario reenvía actualizaciones o realiza más peticiones
Tareas habituales en la programáción de bases de datos
44. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 44
29/04/2022
Base de Datos
XxxConnection
XxxCommand
DataSet
XxxDataReader
XxxDataAdapter
Maneja la conección a una base de
datos
Ejecuta comandos contra una base
de datos
Copia local de datos relacionales
(Entorno desconectado)
Provee acceso a datos
read-only, Forward-only
(Entorno conectado)
Intercambia datos entre un dataset
y una base de datos
Arquitectura
“Xxx”: esto se debe a que los nombres de esas clases varían según
el proveedor específico que se esté utilizando. Ej: “SqlConnection”
para Sql Server, “OracleConnection” para Oracle
45. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 45
29/04/2022
Base de datos
Objetos comunes de ADO.NET
Connection
Command
DataSet DataReader
DataAdapter
Gestiona la conexión a
una base de datos
Ejecuta un comando de consulta
en la base de datos
Almacena datos en un caché
distinto de la base de datos
Proporciona acceso eficaz a un
flujo de datos de sólo lectura
Intercambia datos entre el
conjunto de datos y la base de datos
46. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 46
29/04/2022
Base de datos
Objetos comunes de ADO.NET
Connection
Command
DataSet DataReader
DataAdapter
Gestiona la conexión a
una base de datos
Ejecuta un comando de consulta
en la base de datos
Almacena datos en un caché
distinto de la base de datos
Proporciona acceso eficaz a un
flujo de datos de sólo lectura
Intercambia datos entre el
conjunto de datos y la base de datos
47. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 47
29/04/2022
Objetos de ADO.NET
Aplicación
• Vínculo con la BD
• Pooling automático
• Inicia transacciones
• Tipos
– IDbConnection
– SqlConnection
– OleDbConnection
conexión
Conexión
48. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 48
29/04/2022
El objeto Connection
• Para conectarse a una BD, ADO.NET proporciona el
objeto Connection.
• Métodos más usados:
– Open().- Abre la conexión. Requiere una cadena de
tipo string que describa:
• El tipo de la BD
• La ubicación
• Autenticación (si requiere)
– Close().- Cierra la conexión previamente abierta.
49. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 49
29/04/2022
Crear la conexión
• Uso de SqlConnection
• Establecer los parámetros de la cadena de
conexión
⚫ Timeout de conexión
⚫ Fuente de datos
⚫ Catálogo inicial
⚫ Seguridad integrada
⚫ Contraseña
⚫ Persistir información seguridad
⚫ Proveedor
⚫ ID de usuario
string strConn = "data source=localhost; " +
"initial catalog=northwind; integrated security=true";
SqlConnection conn = new SqlConnection(strConn);
50. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 50
29/04/2022
Connection
Ejemplo:
using System.Data.OleDb;
OledbConnection Conexión = new OleDbConnection(CadenaConexión);
Tipo de base de datos Objeto Connection
SQL Server SqlConnection
OLE DB OleDbConnection
ODBC OdbcConnection
Oracle OracleConnection
51. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 51
29/04/2022
Crear una BD en Microsoft Access
• Crear la BDAlumnos.accdben Microsoft Access y la tabla
TablaAlumnoscon los siguientes campos:
• Insértele algunos registros
Campo Tipo
Clave Texto(9)
Nombre Texto
Semestre Número (entero)
Promedio Número (real con 2
decimales)
52. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 52
29/04/2022
Ejemplo de una conexión con una BD
de Microsoft Access
using System.Data.OleDb; // Para uso de la base de datos en
Access
private OleDbConnection Conexion;//Declaración de la conexión
// Declaración de la cadena de conexión
string CadenaConexion =
@"Provider=Microsoft.ACE.OLEDB.12.0;
Data Source=C:DATOSBDAlumnos.accdb";
Conexion = new OleDbConnection(CadenaConexion);
53. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 53
29/04/2022
Connection Pooling
• ADO.Net pools connections.
Cuando tu cierras una conexión, se libera nuevamente
un cupo del pool.
SqlConnection conn = new SqlConnection();
conn.ConnectionString =
"Integrated Security=SSPI;Initial Catalog=northwind";
conn.Open(); // Pool A is created.
SqlConnection conn = new SqlConnection();
conn.ConnectionString =
"Integrated Security=SSPI;Initial Catalog=pubs";
conn.Open();
// Pool B is created because the connection strings differ.
SqlConnection conn = new SqlConnection();
conn.ConnectionString =
"Integrated Security=SSPI;Initial Catalog=northwind";
conn.Open(); // The connection string matches pool A.
54. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 54
29/04/2022
Base de datos
Objetos comunes de ADO.NET
Connection
Command
DataSet DataReader
DataAdapter
Gestiona la conexión a
una base de datos
Ejecuta un comando de consulta
en la base de datos
Almacena datos en un caché
distinto de la base de datos
Proporciona acceso eficaz a un
flujo de datos de sólo lectura
Intercambia datos entre el
conjunto de datos y la base de datos
55. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 55
29/04/2022
Aplicación
Objetos de ADO.NET
conexión
comando
• Envío de sentencias
Transact-SQL
– Parámetros
• Puede devolver
– Número de filas afectadas
– Un valor escalar
– Un lector de datos
• Tipos
– IDbCommand
– SqlCommand
– OleDbCommand
Comando
56. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 56
29/04/2022
El objeto Comand
Después de establecer la conexión con la BD, se usa el
objeto Command para ejecutar sentencias SQL y devolver
los resultados.
OleDbCommand.- Datos compatibles con OleDb
OdbcCommand.- Datos compatibles con Odbc
SqlCommand.- Datos compatibles con SQL Server
OracleCommand.- Datos compatibles con Oracle
Ejemplo:
OleDbCommand Comando = new OleDbCommand(“SELECT
NoCtrl, Nombre FROM TablaAlumnos WHERE
Semestre=8”,Conexión);
57. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 57
29/04/2022
Ejemplo de uso del objeto Command
// Declaración de la consulta
string Consulta = "SELECT * FROM TablaAlumnos";
// Declaración del comando de consulta en la
conexión con la BD
Comando = new OleDbCommand(Consulta, Conexion);
58. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 58
29/04/2022
Base de datos
Objetos comunes de ADO.NET
Connection
Command
DataSet DataReader
DataAdapter
Gestiona la conexión a
una base de datos
Ejecuta un comando de consulta
en la base de datos
Almacena datos en un caché
distinto de la base de datos
Proporciona acceso eficaz a un
flujo de datos de sólo lectura
Intercambia datos entre el
conjunto de datos y la base de datos
59. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 59
29/04/2022
datos
datos
datos
Objetos de ADO.NET
conexión
Aplicación
lector
comando
• Lectura secuencial de datos
– Por fila
– Por bytes
• Sólo lectura
• Máximo rendimiento
– Única funcionalidad
– Foward-only
• Puede manejar varios
conjuntos de resultados
• Tipos
– IDataReader
– SqlDataReader
– OleDbDataReader
Lector de datos
60. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 60
29/04/2022
El objeto DataReader
• Los Data Readers administran el flujo(stream) de
resultados de una declaración SELECT o un
procedimiento almacenado(Stored Procedure)
• Los Data Readers son de solo lectura
• Los Data Readers solo avanzan a través de los
datos – no pueden ir hacia atrás.
• No se puede realizar ninguna otra operación de
base de datos mientras un Data Reader está abierto
(open)
• Se usa solamente para leer datos de una BD.
– OleDbDataReader.- Datos compatibles con OleDb
– SqlDataReader.- Datos compatibles con SQL Server
61. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 61
29/04/2022
Crear un DataReader
◼ Para utilizar un DataReader:
1. Crear y abrir la conexión a la base de datos
2. Crear un objeto Command
3. Crear un DataReader desde el objeto Command
4. Invocar el método ExecuteReader
5. Utilizar el objeto DataReader
6. Cerrar el objeto DataReader
7. Cerrar el objeto Connection
◼ Utilizar el controlador de errores Try…Catch…Finally
1
2
3
4
5
6
7
62. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 62
29/04/2022
Leer datos de un DataReader
◼ Invocar Read para cada registro
⚫ Devuelve false cuando no hay más registros
◼ Acceso a campos
⚫ Parámetro es la posición ordinal o nombre del campo
⚫ Las funciones Get ofrecen un mejor rendimiento
◼ Cerrar el DataReader
◼ Cerrar la conexión
while (myReader.Read())
{
str += myReader[1];
str += myReader["field"];
str += myReader.GetDateTime(2);
}
63. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 63
29/04/2022
Usando un DataReader con una sentencia
SELECT
string queryString =
"SELECT FirstName, LastName FROM dbo.Employees";
//Create the command objects
SqlCommand com = new SqlCommand(queryString, conn);
//Call the command's ExecuteReader method
SqlDataReader dr = com.ExecuteReader();
//Loop through the datareader to output the employee names
while (dr.Read())
{
listBox1.Items.Add(dr.GetString(0) + " " +
dr.GetString(1));
}
64. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 64
29/04/2022
Otro ejemplo de uso del DataReader
// Abrir la BD
Conexion.Open();
// Ejecutar el comando
OleDbDataReader Lector = Comando.ExecuteReader();
while (Lector.Read())
{
Console.WriteLine(Lector.GetString(0) + " " +
Lector.GetString(1)+" "+Lector.GetValue(2).ToString());
}
// Cerrar la lectura
Lector.Close();
Lector = null;
65. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 65
29/04/2022
class BaseDatosAlumnos
{
private OleDbConnection Conexion; // Declaración de la conexión con la BD
private OleDbCommand Comando; // Declaración del comando con sentencias SQL
private OleDbDataReader Lector; // Declaración del lector de datos
public void LeerDeBaseDeDatos()
{
// Declaración de la cadena de conexión
string CadenaConexion = @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:DATOSBDAlumnos.accdb";
Conexion = new OleDbConnection(CadenaConexion); // Crear la conexión con la BD
string Consulta = "SELECT * FROM TablaAlumnos"; // Declaración de la consulta
Comando = new OleDbCommand(Consulta, Conexion); // Declaración del comando de consulta en la conexión con la
BD
Conexion.Open(); // Abrir la BD
Lector = Comando.ExecuteReader(); // Ejecutar el comando lector de datos
while (Lector.Read())
{
Console.WriteLine(Lector.GetString(0) + " " + Lector.GetString(1)+" "+Lector.GetValue(2).ToString());
}
Lector.Close(); // Cerrar el lector de datos
Lector = null;
}
public void CerrarConexion()
{
// Verifica si está activa la lectura
if (Lector != null) Lector.Close();
// Verifica si está abierta la conexión con la BD
if (Conexion != null) Conexion.Close();
}
}
66. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 66
29/04/2022
¿Qué es un procedimiento almacenado
(Stored Procedure)?
• Procedimientos comunes de datos que pueden
ser invocados por múltiples aplicaciones Web
• Acceso programático a una base de datos
– Devolver registros
– Devolver un valor
– Realizar acción
Cliente
SQL Server
Formulario
Web Form
Procedimiento
almacenado
Servidor Web
Base datos
67. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 67
29/04/2022
¿Por qué utilizar procedimientos
almacenados?
• Programación modular
• Distribución del trabajo
• Seguridad de la base de datos
• Ejecución más rápida
• Reduce el tráfico de red
• Proporciona flexibilidad
68. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 68
29/04/2022
Usando un DataReader para llamar a
un Stored Procedure
//Create the command object and set its properties
SqlCommand com = new SqlCommand();
com.Connection = conn;
com.CommandText = "CustOrderHist";
com.CommandType = CommandType.StoredProcedure;
//Create the parameter object and add it to the command's
collection
SqlParameter param =
new SqlParameter("@CustomerID", SqlDbType.NVarChar, 5);
param.Value = txtID.Text;
com.Parameters.Add(param);
69. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 69
29/04/2022
Base de datos
Objetos comunes de ADO.NET
Connection
Command
DataSet DataReader
DataAdapter
Gestiona la conexión a
una base de datos
Ejecuta un comando de consulta
en la base de datos
Almacena datos en un caché
distinto de la base de datos
Proporciona acceso eficaz a un
flujo de datos de sólo lectura
Intercambia datos entre el
conjunto de datos y la base de datos
70. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 70
29/04/2022
Aplicación
cambios
datos
Objetos de ADO.NET
conexión
• Orquestador del acceso a
datos
• Creado para trabajar con un
DataSet
• Contiene un comando de
selección y un lector de
datos
• Contiene 3 comandos para
persistir cambios en la BD
• Tipos
– DbDataAdapter
– IDbDataAdapter
– SqlDataAdapter
– OleDbDataAdapter
Adaptador de datos
select
delete
update
insert
lector
data adapter
data
set
71. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 71
29/04/2022
Adaptador de datos
72. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 72
29/04/2022
El adaptador de datos
Conjunto de objetos usado para intercambiar datos
entre una BD y un conjunto de datos (DataSet).
Lee datos de una BD y los coloca en un DataSet
para manipularlos.
Escribe en la BD los datos modificados del DataSet
OleDbDataAdapter.- Datos compatibles con OleDb
OdbcDataAdapter.- Datos compatibles con Odbc
SqlDataAdapter.- Datos compatibles con SQL Server
OracleDataAdapter.- Datos compatibles con Oracle
Se crea un adaptador por cada tabla existente en la BD
Base
de
Datos
DataSet
DataAdapter
73. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 73
29/04/2022
Cómo crear el adaptador de datos
Fuente de datos
DataAdapter
DataTable
DataTable
DataSet
DataAdapter
Leer
Actualizar
Actualizar
Leer
74. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 74
29/04/2022
◼ Almacenar la consulta en un DataAdapter
◼ El constructor DataAdapter establece la propiedad
SelectCommand
◼ Establecer las propiedades InsertCommand,
UpdateCommand y DeleteCommand si fuera necesario
Cómo crear el adaptador de datos
SqlDataAdapter da = new SqlDataAdapter
("select * from Authors",conn);
da.SelectCommand.CommandText;
da.SelectCommand.Connection;
75. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 75
29/04/2022
Base de datos
Objetos comunes de ADO.NET
Connection
Command
DataSet DataReader
DataAdapter
Gestiona la conexión a
una base de datos
Ejecuta un comando de consulta
en la base de datos
Almacena datos en un caché
distinto de la base de datos
Proporciona acceso eficaz a un
flujo de datos de sólo lectura
Intercambia datos entre el
conjunto de datos y la base de datos
76. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 76
29/04/2022
Aplicación
data
table
Objetos de ADO.NET
data
table
data
table
• Contenedor de datos
• Cualquier orígen de datos
– Independiente de este
• Contiene objetos tabla
– Contienen objetos fila y columna
• Integridad de los datos
– Restricciones
• Tipos
– System.Data.DataSet
– System.Data.DataTable
– System.Data.DataView
Conjunto de datos
XML ...
unique foreign key
data set
77. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 77
29/04/2022
¿Qué es la clase DataSet?
DataSet
Constraints
Table
Column
Constraint
Rows
Row
Relations
Relation
Object Collection
Tables
Columns
• DataSets consta de una o
más tablas y relaciones
– Cargado desde uno o más
data adapters
– Creado por tí mismo
– Cargado desde XML
– Cargado desde otros
DataSets
• Las tablas contienen
columnas, restricciones y
filas
– Todas son collections!
78. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 78
29/04/2022
Uso de DataSets frente a DataReaders
Soportado por las herramientas
de Visual Studio .NET
Acceso más lento
Sólo hacia delante
Vinculado a un único control
Basado en una instrucción SQL
de una base de datos
Sólo lectura
Codificación manual
Acceso más rápido
Búsqueda de datos hacia
delante y hacia atrás
Vinculado a múltiples controles
Incluye múltiples tablas de
distintas bases de datos
Acceso lectura/escritura a
datos
DataReader
DataSet
Desconectado Conectado
79. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 79
29/04/2022
System.Data y DataSet
DataSet Tables
DataTable
Relations
DataRelation
DataRelation
DataRow(s)
DataColumn
Constraint(s)
DataTable
DataTable
DataView
80. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 80
29/04/2022
System.Data - DataSet 1/3
• Un repositorio en memoria de datos desde un origen
• Forma común de representar y manipular datos
– Contenedor universal
– No sólo para base de datos
• Representación lógica o física de los datos; depende de:
– La consulta / Conjunto de resultados
– Donde existen DataTables y Relations
• Diseñado para estar desconectado del origen
– Conectar, ejecutar la consulta, desconectar
• Se utiliza XML para leer y almacenar, tanto los datos
como el Esquema
81. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 81
29/04/2022
System.Data - DataSet 2/3
• Se usan colecciones para agregar Tablas
y relaciones
• Propiedades importantes:
– Tables:
Devuelve la colección de objetos DataTable
– Relations:
Devuelve la colección de DataRelations
– Relacionadas con XML
82. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 82
29/04/2022
System.Data - DataTable
• Puede ser vinculado a una tabla física de una base
• Y relacionarla con otras a través de DataRelations
• Bloqueo concurrente optimista
• Propiedades importantes:
– Columns: Devuelve la colección de DataColumns como
ColumnsCollection
– Rows: Devuelve objetos DataRow como una
RowsCollection
– ParentRelations: Devuelve una RelationsCollection
– Constraints: Devuelve la ConstraintsCollection de la tabla
– DataSet: Devuelve el conjunto de datos de la DataTable
– PrimaryKey: Obtiene los DataColumns que conforman la
clave primaria de la tabla
83. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 83
29/04/2022
DataRow
objects
Cómo acceder a los datos en un objeto
DataSet
DataColumn
objects
DataTable
objects
DataColumn
objects
84. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 84
29/04/2022
Crear un DataSet
◼ Crear y poblar un DataSet con DataTables
⚫ El método Fill ejecuta el SelectCommand
◼ Acceder a DataTable
DataSet ds = new DataSet();
da.Fill(ds, "Authors");
ds.Tables["Authors"].Rows.Count;
string str="";
foreach(DataRow r in
ds.Tables["Authors"].Rows)
{
str += r[2];
str += r["au_lname"];
}
85. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 85
29/04/2022
Almacenar múltiples tablas en un DataSet
◼ Agregar la primera tabla
◼ Agregar la(s) siguiente(s) tabla(s)
SqlDataAdapter daCustomers =
new SqlDataAdapter("select * from Customers", conn1)
daCustomers.Fill(ds, "Customers")
Orders
Customers
SqlDataAdapter daOrders =
new SqlDataAdapter("select * from Orders", conn2)
daOrders.Fill(ds, "Orders")
conn2
conn1
DataSet
86. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 86
29/04/2022
Creando un DataTable y agregando Columnas
DataTable workTable = new DataTable("Customers");
DataColumn workCol = workTable.Columns.Add("CustID", typeof(Int32));
workCol.AllowDBNull = false;
workCol.Unique = true;
workTable.Columns.Add("CustLName", typeof(String));
workTable.Columns.Add("CustFName", typeof(String));
workTable.Columns.Add("Purchases", typeof(Double));
◼ En el ejemplo, observe que las propiedades de la columna CustID están
configuradas para no permitir valores nulos y restringir los valores para
que sean únicos.
◼ Sin embargo, si define la columna CustID como la columna de clave
principal de la tabla, la propiedad AllowDBNull se establecerá
automáticamente en false y la propiedad Unique se establecerá
automáticamente en true.
87. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 87
29/04/2022
Creando un DataTable con varios objetos DataColumn
private void MakeTable() {
// Create a DataTable.
DataTable table = new DataTable("Product");
// Create a DataColumn and set various properties.
DataColumn column = new DataColumn();
column.DataType =
System.Type.GetType("System.Decimal");
column.AllowDBNull = false;
column.Caption = "Price";
column.ColumnName = "Price";
column.DefaultValue = 25;
// Add the column to the table.
table.Columns.Add(column);
// Add 10 rows and set values.
DataRow row; for(int i = 0; i < 10; i++) {
row = table.NewRow();
row["Price"] = i + 1;
// Be sure to add the new row to the
// DataRowCollection.
table.Rows.Add(row);
}
}
88. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 88
29/04/2022
Crear una DataTable y agregarla al DataSet
DataSet ds = new DataSet();
// Crear el objeto “Clientes”.
DataTable dt= new DataTable( “Clientes” );
// Crear y agregar columnas
// 1. Explícitamente
DataColumn dc = new DataColumn( “ID”, Int16 );
dt.Columns.Add( dc );
// 2. Implícitamente.
dt.Columns.Add( “Nombre”, String );
dt.Columns.Add( “Apellido”, String );
// Agregar el objeto DataTabla al DataSet
ds.Tables.Add( dt );
89. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 90
29/04/2022
System.Data - DataRelation 1/2
• Utilizada para crear relaciones lógicas
– Entre dos (2) objetos DataTable
– Requiere un objeto DataColumn de cada DataTable
– El tipo de datos (DataType) de ambas DataColumns debe ser
el mismo
• No es posible relacionar un Int32 con un String
– Se le asigna un nombre (¡por el desarrollador!)
• DataRelation dr=new DataRelation _
(“miRelacion”,...)
• Permite navegación por relaciones
• RelationsCollection contiene todas las DataRelations
– Se accede a través de la propiedad Relations del DataSet
90. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 91
29/04/2022
System.Data - DataRelation 2/2
• Como crear un DataRelation:
– Obtener los objetos DataColumn a relacionar
– Crear y nombrar un DataRelation usando las columnas
– Agregar la relación al DataSet
// Obtener las columnas a utilizar...
DataColumn colPadre, colHija;
colPadre= DataSet.Tables["Clientes"].Columns["ID"];
colHija = DataSet.Tables[“Pedidos“].Columns["IDCliente"];
// Crear el DataRelation llamado “CliPedidos”...
DataRelation dr;
dr = new DataRelation(“CliPedidos", colPadre,
colHija);
// Agregar la relación al DataSet...
ds.Relations.Add( dr );
91. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 92
29/04/2022
Crear relaciones
• Identificar la columna primaria
• Identificar la columna secundaria
• Crear DataRelation
DataRelation dr = new
("name", parentCol,
childCol)
ds.DataRelations.Add(dr)
DataColumn parentCol=
ds.Tables["Customers"].Columns["CustomerID"]
DataColumn childCol =
ds.Tables["Orders"].Columns["CustomerID"]
Tabla Orders
Tabla Customers
DataSet
parentCol
childCol
DataRelation
92. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 93
29/04/2022
Crear relaciones
• Otra forma de hacerlo
DataSet customerOrders = new DataSet("CustomerOrders");
//...
//Código de creación de tablas Customers y Orders
//...
customerOrders.Relations.Add("CustOrders",
customerOrders.Tables["Customers"].Columns["CustID"],
customerOrders.Tables["Orders"].Columns["CustID"]);
Tabla Orders
Tabla Customers
DataSet
parentCol
childCol
DataRelation
93. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 94
29/04/2022
Navegar programáticamente entre tablas utilizando
relaciones
Customers Orders
GetChildRows
GetParentRow
DataSet
ds.Tables[index].Rows[index].GetChildRows("relation");
ds.Tables[index].Rows[index].GetParentRow("relation");
94. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 95
29/04/2022
System.Data - DataView
• Crea múltiples vistas de los objetos DataTable
• Vinculable a controles
• Propiedades importantes:
– Item: Obtiene una fila de una tabla determinada
– Table: Obtiene o asigna el objeto DataTable
– Sort: Obtiene o asigna la/s columna/s y el
ordenamiento
– RowFilter: Obtiene o asigna la expresión para filtrar la
vista
– RowStateFilter: Indica o asigna el estado del filtro
• None, Unchanged, New, Deleted, ModifiedCurrent, y otros
95. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 96
29/04/2022
System.Data - DataView
DataView vista1 = new DataView( miTabla );
DataView vista2 = new DataView( miTabla );
// La vista ordenada por Apellido
vista1.Sort = “Apellido ASC”;
// Filtrar para ver sólo los modificados
vista2.RowStateFilter= DataViewRowState.ModifiedOriginal;
// Vincular a un control de usuario...
DataGrid myGrid = new DataGrid();
myGrid.SetDataBinding( view1, “Clientes”);
//...
• Creando objetos DataView
96. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 97
29/04/2022
Utilizar un DataView
◼ Un DataView puede personalizarse para presentar un
subconjunto de datos de un DataTable
◼ La propiedad DefaultView devuelve el DataView
predeterminado de la tabla
◼ Establecer una vista distinta de un DataSet
DataView dv = new DataView(ds.Tables["Authors"]);
dv.RowFilter = "state = 'CA'";
DataView dv = ds.Tables["Authors"].DefaultView;
97. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 98
29/04/2022
Navegar visualmente entre tablas
utilizando relaciones
Customers Orders
CreateChildView
DataRowView
DataView
DataSet
DataView tableView;
DataRowView currentRowView;
tableView = new DataView(ds.Tables["Customers"]);
currentRowView = tableView[dgCustomers.SelectedIndex];
dgChild.DataSource = currentRowView.CreateChildView("CustOrders");
98. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 99
29/04/2022
Cómo actualizar una BD en ADO.NET
DataSet
Cliente
DataAdapter
Base de datos
Servidor
Datos
Leer
Actualizar
DeleteCommand
UpdateCommand
InsertCommand
Datos
DataTable
99. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 100
29/04/2022
Cómo crear un registro en la BD
• Crear un nuevo registro que coincida con el esquema de
la tabla
• Agregar el nuevo registro al DataSet
• Actualizar la base de datos
DataRow miRegistro = dataTable.NewRow();
sqlDataAdapter1.Update(dataSet);
dataTable.Rows.Add(miRegistro);
miRegistro[“NoCtrl”] = txtNoCtrl.Text;
if(radioButton1.Checked)
miRegistro[“Sexo”]=radioButton1.Text;
else
miRegistro[“Sexo”]=radioButton2.Text;
100. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 101
29/04/2022
Cómo borrar un registro de la BD
• Borrar el registro del dataset
• Actualizar la BD
• Aceptar los cambios en el dataset
dataTable.Rows[0].Delete();
dataAdapter.Update(dataSet);
dataSet.AcceptChanges();
101. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 102
29/04/2022
Pasos para insertar datos en la BD
(modo conectado)
103. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 104
29/04/2022
static void Agregar(){
// Declaración de la conexión
OleDbConnection miConexion=null;
try{
// Declaración y creación de un objeto local
Alumno miAlumno = new Alumno();
Console.Clear();
Console.WriteLine("AGREGAR ALUMNO A LA BASE DE DATOS");
// Captura de datos del alumno
Console.Write("nClave? ");
miAlumno.Clave = Console.ReadLine();
Console.Write("Nombre? ");
miAlumno.Nombre = Console.ReadLine();
Console.Write("Semestre? ");
miAlumno.Semestre = int.Parse(Console.ReadLine());
Console.Write("Promedio? ");
miAlumno.Promedio = double.Parse(Console.ReadLine());
// Nombre de la cadena de conexión
string strCadenaConexion = @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:DATOSBDAlumnos.accdb";
// Establece la conexión a la base de datos
miConexion = new OleDbConnection(strCadenaConexion);
// Abre la conexión a la BD
miConexion.Open();
// Linea del comando para insertar el alumno
string strInsertar = "INSERT INTO TablaAlumnos VALUES (@clave, @nombre, @semestre, @promedio)";
// Establece el comando para insertar los datos del alumno
OleDbCommand miComando = new OleDbCommand(strInsertar, miConexion);
miComando.Parameters.AddWithValue("@clave", miAlumno.Clave);
miComando.Parameters.AddWithValue("@nombre", miAlumno.Nombre);
miComando.Parameters.AddWithValue("@semestre", miAlumno.Semestre);
miComando.Parameters.AddWithValue("@promedio", miAlumno.Promedio);
// Ejecuta el comando
miComando.ExecuteNonQuery();
Console.WriteLine("Alumno agregado a la base de datos");
}
catch(Exception miExcepcion){
Console.WriteLine(miExcepcion.Message);
Console.ReadKey();
}finally{
// Cierra la conexión a la BD
if (miConexion != null)
miConexion.Close();
}
}
104. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 105
29/04/2022
static void Reporte()
{
Alumno miAlumno = new Alumno(); // Declaración y creación de un objeto local
OleDbConnection miConexion = null; // Declaración de la conexión
// Nombre de la cadena de conexión
string strCadenaConexion = @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:DATOSBDAlumnos.accdb";
OleDbDataReader Lector=null; // Declaración del lector de datos
Console.Clear();
try
{
miConexion = new OleDbConnection(strCadenaConexion); // Crear la conexión con la BD
string strConsulta = "SELECT * FROM TablaAlumnos"; // Declaración de la consulta
OleDbCommand miComando = new OleDbCommand(strConsulta, miConexion); // Declaración del comando de consulta en la conexión
con la BD
miConexion.Open(); // Abrir la conexión a la BD
Lector = miComando.ExecuteReader(); // Ejecutar el comando lector de datos
while (Lector.Read())
{
// Obtiene los datos
miAlumno.Clave = Lector.GetString(0); miAlumno.Nombre = Lector.GetString(1);
miAlumno.Semestre = int.Parse(Lector.GetValue(2).ToString()); miAlumno.Promedio =
double.Parse(Lector.GetValue(3).ToString());
Console.WriteLine(miAlumno.Clave + "t" + miAlumno.Nombre + "t" + miAlumno.Semestre + "t" + miAlumno.Promedio);
}
}
catch(Exception miExcepcion)
{
Console.WriteLine("n"+miExcepcion.Message);
}
finally
{
if (Lector != null) // Cierra el lector de datos
Lector.Close();
if (miConexion != null) // Cierra la conexión a la BD
miConexion.Close();
Console.ReadKey();
}
}
105. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 106
29/04/2022
Videos BD en C#
Conectar C# y una base de datos tutorial
(http://www.youtube.com/watch?v=VPh99o6schM)
Conectando C# con Access
(http://www.youtube.com/watch?v=NWHD7dnT1nw)
Conexión Access-Visual Studio C#
(http://www.youtube.com/watch?v=ClN9YShhTDE)
C# and Microsoft Access Database - Part 1
(http://www.youtube.com/watch?v=solrzatPmPA)
C# and Microsoft Access Database - Part 2
(http://www.youtube.com/watch?v=cCz8tV7c43Q)
106. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 107
29/04/2022
Contenido
• Conceptos básicos y Conexión a base de
datos.
• Objetos comunes para trabajo con base de
datos: connection, command, parameter,
datareader, dataadapter.
• Formularios dinámicos con interacción a
base de datos.
• Creación de consultas y generación de
documentos con formato portable.
• Leer y escribir datos XML
107. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 108
29/04/2022
GUI/DB Application Model
Database
DataSet
object
DB Connection
DB Adapter
DB SQL Query
Win Form
DataGrid
control
108. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 109
29/04/2022
Architecture Layers
Database
DB Engine
DBMS UI
DB Driver
DB API
Application
Data Objects
App UI
SQLserver,
Access
Database
SQLserver, Jet
ODBC, OleDB,
JDBC
ADO,
JDBC
WinForms,
Swing
DB Admin
App User
OS
Application
Internet, local
…
…
…
109. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 110
29/04/2022
C# DataBase Controls
DataSet class
-tables
-columns
-rows
DataGrid control
-scroll, sort, edit,
…
Model
View
Controller
110. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 111
29/04/2022
Creación de una aplicación de dos capas
• Crear la capa de datos
–Crear un nuevo proyecto de biblioteca de clases
–Cree una clase para representar una entidad comercial, digamos
clientes
–Agregue métodos que accedan a la base de datos, usando
ADO.Net
–Agregue propiedades que expongan atributos, por ejemplo:
nombre, teléfono …
• Crear la capa de presentación
–Crear un nuevo Windows Application project
–Agregue una referencia al proyecto de datos anterior
–Crear un objeto de la clase
–Use las propiedades del objeto para completar los controles en un
formulario
–Utilice los métodos del objeto para acceder a la base de datos
111. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 112
29/04/2022
Colecciones
• Enlace de un ComboBox a datos provenientes de
un ArrayList:
– Código C#
System.Collections.ArrayList Paises =
new System.Collections.ArrayList();
Paises.Add("Argentina");
Paises.Add("Brasil");
Paises.Add("Uruguay");
comboBox1.DataSource = Paises;
112. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 113
29/04/2022
Objeto BindingSource
• El objeto BindingSource permite el enlace de
controles a datos provenientes de fuentes de datos
(DataSource) de tres tipos
– DataBase: Crea internamente un dataset.
– WebService: Crea una referencia web a un servicio que
es el que proporciona los datos
– Object: Utiliza una clase de negocios como fuente de
datos creando automáticamente una colección de
elementos de esa clase.
• Usándolo junto a un control DataBindingNavigator y
un DataGridView conforman un formulario de ABM
sin escribir código alguno.
113. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 114
29/04/2022
ADO.NET
• Además de utilizar el objeto BindingSource, es
posible enlazar datos utilizando ADO.NET de
manera directa.
– Ejemplo en C#
using( SqlConnection cn = new SqlConnection("....") )
{
cn.Open();
SqlDataAdapter da = new SqlDataAdapter("Select *
from Employee", cn);
DataTable dt = new DataTable();
da.Fill(dt);
this.dataGridView1.DataSource = dt;
}
114. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 115
29/04/2022
Cómo vincular (Bind) un DataSet a un
DataGrid
DataGrid dataGrid1 = new DataGrid();
sqlDataAdapter1.Fill(dataSet1, "Customers");
sqlDataAdapter2.Fill(dataSet1, "Orders");
dataGrid1.DataSource = dataSet1;
To bind programmatically
115. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 116
29/04/2022
C# DataBase Access (ADO.net)
• OleDB, ODBC, SQLdb, …
• Steps to get data:
1. dbConnection: connect to DB
2. dbCommand: SQL query text
3. dbAdapter: executes query
4. DataSet: resulting data
• Steps to display data:
• Bind to UI control, e.g. DataGrid
• or Manual data processing
DB
Alternative: DataReader,
retrieve data incrementally
116. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 117
29/04/2022
C# DB Example
• Get data:
Using System.Data.OleDb; // “Jet” = MS Access DB driver
con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=c:/mydb.mdb”);
cmd = new OleDbCommand("SELECT * FROM mytable”, con); // SQL query
adpt = new OleDbDataAdapter(cmd);
data = new DataSet( );
adpt.Fill(data); // execute the query and put result in ‘data’
• Display data:
dataGrid1.DataSource = data.Tables[0]; // show the table in the grid control
MessageBox.Show(data.Tables[0].Rows[0][5].ToString( )); // or process manually, this is
row 0 col 5
117. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 118
29/04/2022
DataSet vs. DataReader
DataSet:
• Like 2D array: a[r][c]
• Full dataset read from DB at
query execution time
• Dataset cached locally in mem
• Can disconnect from DB
• Implemented using
DataReader (Adapter)
• + random data access
• - Limited scalability
• - initial read very slow
DataReader: (standard)
• 1 row at a time
• No local memory storage
• Fetch each row from DB on
demand
• “cursor” = current row
• Must stay connected to DB
• + scalability
• - each row slow
• - random access difficult
118. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 119
29/04/2022
Object Model
DataSet:
• Tables[n]
– Rows[r]
• columns[c]
– Value, type, …
– Columns info [c]
• Name, type, …
DataReader: (standard)
• Columns[c] (current row)
– Value, type, …
• Columns info [c]
– Name, type, …
• Cursor:
– moveNext, MovePrev,
moveTo
– EOF
119. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 120
29/04/2022
Cursors
• Forward only vs. forward/back vs. random
access
• Read only vs. writeable
• …
120. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 121
29/04/2022
Connections
• Connection strings:
• Tons o examples: http://www.connectionstrings.com/
• Con.open( )
• Queries here
• Con.close( ) // connections consume
resources
• Adapter.Fill( ) does open/close automatically
121. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 122
29/04/2022
Commands (Queries)
• Command Types:
• SQL Query:
» Relation: SELECT
» Scalar: SELECT that returns 1 row, 1 col
» Non-query: INSERT, UPDATE, DELETE
• Table name
• View name
• Rdr = Cmd.ExecuteReader( );
122. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 123
29/04/2022
Query Parameters
• Want to substitute a parameter value into a query
• Dynamic SQL query construction:
cmd = new OleDbCommand(
"SELECT * FROM table WHERE myAttr = " + myValue, con);
• but: what if myValue contains weird chars?
• Parameterized query: (more robust, reusable)
cmd = new OleDbCommand(
"SELECT * FROM table WHERE myAttr = ?", con); // ? = parameter
cmd.Parameters.Add(“?”, myValue); // parameter value
• Or, put param query in DB as view / stored procedure:
cmd = new OleDbCommand("MyStoredQuery", con); // name of view
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Parameters.Add("?", myValue); // parameter value
123. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 124
29/04/2022
DataBound UI Controls
• Display a table:
• DataGrid
• Display a column:
• DataList
• listBox
• ComboBox
• Display a cell value: (of current row)
• TextBox
• Can bind any property of any UI control to any
DB column
DataGrid control
-scroll, sort, edit,
…
124. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 125
29/04/2022
Manual data processing
foreach(DataRow r in dataSet1.Tables[0].Rows) // for each row
{
doSomethingWith(r[“columnName”]); //or:
foreach(Object v in r.ItemArray) // for each column
doSomethingWith(v);
}
125. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 126
29/04/2022
Saving Data Changes
• Manual update/insert/delete queries:
cmd = new OleDbCommand(“UPDATE table SET myAttr=value WHERE
id=idval”, con);
cmd.ExecuteNonQuery(); // query does not return data.
• Adapters and bound UI Controls:
• User can edit in DataGrid, etc.
• Writes DataSet changes to DB on Update( ) method
• Must have param update/insert/delete commands in Adapter
cmd = new OleDbCommand("UPDATE table SET attr1=?, attr2=? WHERE id=?", con);
cmd.Parameters.Add(new OleDbParameter(“?”, …, “attr1”, DataRowVersion.Current ));
cmd.Parameters.Add(new OleDbParameter(“?”, …, “attr2”, DataRowVersion.Current ));
cmd.Parameters.Add(new OleDbParameter(“?”, …, “id”, DataRowVersion.Original ));
adpt.UpdateCommand = cmd;
adpt.Update(data); // analogous to adpt.Fill(data);
126. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 127
29/04/2022
Getting DB Schema Info
• Get list of tables in the DB:
con.Open();
System.Data.DataTable t = con.GetOleDbSchemaTable(
System.Data.OleDb.OleDbSchemaGuid.Tables,
new object[]{null,null,null,"TABLE"} );
127. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 128
29/04/2022
Visualization
• Draw graphics in Paint event
• Scale data coords to pixel coords
• E.g. scatterplot:
foreach(DataRow r in dataSet1.Tables[0].Rows) // for each row
{
x = r[“attr1”] * Width / maxValue1; // Scale x,y to fit into window
y = Height - r[“attr2”] * Height / maxValue2; // also flip y axis
e.Graphics.FillEllipse(Brushes.Red, x, y, 10, 10);
}
128. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 129
29/04/2022
Interaction
• Mouse Events
• Scale mouse coords back into data coords
• Parameterized SQL query
• E.g. 2 clicks define a rectangle:
Rect.left = click1.x / Width * maxValue1; // scale click x,y back to data
range
…
SELECT * FROM table
WHERE attr1 >= {rect.left} AND attr1 <= {rect.right}
AND attr2 >= {rect.top} AND attr2 <= {rect.bottom}
doSomething with results…
Refresh( ); // repaint the window to show results in Paint event
129. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 130
29/04/2022
Contenido
• Conceptos básicos y Conexión a base de
datos.
• Objetos comunes para trabajo con base de
datos: connection, command, parameter,
datareader, dataadapter.
• Formularios dinámicos con interacción a
base de datos.
• Creación de consultas y generación de
documentos con formato portable.
• Leer y escribir datos XML
130. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 131
29/04/2022
Creando archivos PDF con iTextSharp
• iTextSharp es una librería, de código abierto (open source) y
específicamente para .Net, que nos permite crear y modificar
documentos PDF.
• Creamos el documento PDF, con las medidas de una página
tradicional, le dijimos que guardara el documento en C: con
el nombre prueba.pdf y le colocamos el título y el autor del
documento. Finalmente lo abrimos para comenzar a añadirle
información.
// Creamos el documento con el tamaño de página tradicional
Document doc = new Document(PageSize.LETTER);
// Indicamos donde vamos a guardar el documento
PdfWriter writer = PdfWriter.GetInstance(doc,
new FileStream(@"C:prueba.pdf", FileMode.Create));
// Le colocamos el título y el autor
// **Nota: Esto no será visible en el documento
doc.AddTitle("Mi primer PDF");
doc.AddCreator("Roberto Torres");
// Abrimos el archivo
doc.Open();
http://sourceforge.net/projects/itextsharp/
131. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 132
29/04/2022
// Creamos el tipo de Font que vamos utilizar
iTextSharp.text.Font _standardFont = new
iTextSharp.text.Font(iTextSharp.text.Font.FontFamily.HELVETICA, 8,
iTextSharp.text.Font.NORMAL, BaseColor.BLACK);
// Escribimos el encabezamiento en el documento
doc.Add(new Paragraph("Mi primer documento PDF"));
doc.Add(Chunk.NEWLINE);
// Creamos una tabla que contendrá el nombre, apellido y país
// de nuestros visitante.
PdfPTable tblPrueba = new PdfPTable(3);
tblPrueba.WidthPercentage = 100;
// Configuramos el título de las columnas de la tabla
PdfPCell clNombre = new PdfPCell(new Phrase("Nombre", _standardFont));
clNombre.BorderWidth = 0;
clNombre.BorderWidthBottom = 0.75f;
PdfPCell clApellido = new PdfPCell(new Phrase("Apellido", _standardFont));
clApellido.BorderWidth = 0;
clApellido.BorderWidthBottom = 0.75f;
PdfPCell clPais = new PdfPCell(new Phrase("País", _standardFont));
clPais.BorderWidth = 0;
clPais.BorderWidthBottom = 0.75f;
// Añadimos las celdas a la tabla
tblPrueba.AddCell(clNombre);
tblPrueba.AddCell(clApellido);
tblPrueba.AddCell(clPais);
// Llenamos la tabla con información
clNombre = new PdfPCell(new Phrase("Roberto", _standardFont));
clNombre.BorderWidth = 0;
clApellido = new PdfPCell(new Phrase("Torres", _standardFont));
clApellido.BorderWidth = 0;
clPais = new PdfPCell(new Phrase("Puerto Rico", _standardFont));
clPais.BorderWidth = 0;
// Añadimos las celdas a la tabla
tblPrueba.AddCell(clNombre);
tblPrueba.AddCell(clApellido);
tblPrueba.AddCell(clPais);
132. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 133
29/04/2022
Creando archivos PDF con iTextSharp
• Una vez terminemos de ponerle data al documento, no
queda otra cosa que cerrar el archivo y ver nuestro
resultado final.
// Finalmente, añadimos la tabla al documento PDF y cerramos el documento
doc.Add(tblPrueba);
doc.Close();
writer.Close();
133. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 134
29/04/2022
iTextSharp: Cómo insertar imágenes
• Para insertar una imagen en un archivo PDF que estemos creando
utilizamos el siguiente código.
// Creamos el documento PDF
iTextSharp.text.Document doc = new iTextSharp.text.Document(PageSize.LETTER);
PdfWriter writer = new FileStream
("localización y nombre del PDF que estamos creando", FileMode.Create));
doc.Open();
// Creamos la imagen y le ajustamos el tamaño
iTextSharp.text.Image imagen = iTextSharp.text.Image.GetInstance("localización de la imagen");
imagen.BorderWidth = 0;
imagen.Alignment = Element.ALIGN_RIGHT;
float percentage = 0.0f;
percentage = 150 / imagen.Width;
imagen.ScalePercent(percentage * 100);
// Insertamos la imagen en el documento
doc.Add(imagen);
// Cerramos el documento
doc.Close();
134. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 135
29/04/2022
iTextSharp: Cómo unir archivos PDF
• Supongamos que tenemos un sistema y queremos exportar
lo que el usuario tiene en pantalla. Pero además de exportar
la información que el usuario necesita, también queremos
añadirle una portada al documento para darle un toque
elegante al documento que el usuario está por descargar.
• Primero necesitamos leer el primer archivo que queremos
utilizar. Si seguimos el ejemplo anterior esta sería la portada
del documento final.
• Luego, creamos un nuevo documento PDF y añadimos la
portada
// Abrimos el primer documento existente
PdfReader reader = new PdfReader("portada.pdf");
135. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 136
29/04/2022
// Creamos el nuevo PDF
MemoryStream m = new MemoryStream();
Document pdf = new Document(PageSize.LETTER);
PdfWriter writer = PdfWriter.GetInstance(pdf, m);// Instrucción para que el PDF imprima
correctamente según el tamaño de papel seleccionado.
writer.AddViewerPreference(PdfName.PICKTRAYBYPDFSIZE, PdfBoolean.PDFTRUE);// Añadimos los
atributos del nuevo PDF
pdf.AddAuthor("Autor");
pdf.AddTitle("Titulo del nuevo PDF");
pdf.AddCreator("Creador del documento");
pdf.AddCreationDate();
// Abrimos el documento
pdf.Open();
writer.PageEvent = new PdfFooter();
PdfContentByte cb = writer.DirectContent;
// Aquí declaramos el tipo de letra, tamaño y color que deseamos utilizar
BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252,
BaseFont.NOT_EMBEDDED);
cb.SetColorFill(BaseColor.BLACK);
cb.SetFontAndSize(bf, 12);
// Creamos una nueva página e importamos el contenido del paso #1: portada.pdf
PdfImportedPage page = writer.GetImportedPage(reader, 1);
cb.AddTemplate(page, 0, 0);
136. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 137
29/04/2022
iTextSharp: Cómo unir archivos PDF
• Después, añadimos contenido dinámico, como
normalmente hacemos, o continuamos
añadiendo archivos PDF ya creados.
• Cerramos el documento y lo guardamos
// Cerramos el nuevo archivo PDF
pdf.Close();
writer.Close();// En el caso que querramos guardarlo en una carpeta
byte[] bytArr = m.ToArray();
using (FileStream fs = File.Create("carpetaYNombreDelNuevoPDF.pdf"))
{
fs.Write(bytArr, 0, (int)bytArr.Length);
}// En el caso que estemos usando ASP.Net y querramos que el usuario lo pueda
descargar
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.ContentType = "application/pdf";
HttpContext.Current.Response.AddHeader("content-disposition", "attachment;
filename=" + "carpetaYNombreDelNuevoPDF.pdf");
HttpContext.Current.Response.BinaryWrite(m.GetBuffer());
HttpContext.Current.Response.End();
137. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 138
29/04/2022
iTextSharp: Imprimir en el tamaño de
papel del documento
• Los documentos PDF que creamos con iTextSharp no
necesariamente imprimen en el tamaño de papel que el documento
contiene.
– Esto causa molestia en los usuario porque tienen que pasar el trabajo
de escoger manualmente el tamaño de papel para que el documento
imprima adecuadamente.
• Para resolver este problema solo hay que añadir una propiedad al
objeto PdfWriter que utilizamos en la creación del documento. Así
que, asumiendo que el objeto PdfWriter se llame writer, utilizamos
esta propiedad.
• De esta manera, cuando se imprima un documento que generemos
con iTextSharp, la impresora va utilizar el tamaño del papel
configurado en el documento.
writer.AddViewerPreference(PdfName.PICKTRAYBYPDFSIZE, PdfBoolean.PDFTRUE);
138. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 139
29/04/2022
Crystal Reports
Es la herramienta de reporting estándar en .NET
Nos permite crear un informe desde el principio y utilizar alguno de los
Asistentes de informes
Podemos utilizar cualquier lenguaje de programación
Visores de informes para aplicaciones basadas en Windows y Web
Personalización de informes en tiempo de ejecución
Fácil interacción con los informes
Capacidades de visualización de datos y análisis
Crystal Reports
Beneficios
139. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 140
29/04/2022
Cómo crear y formatear un informe
utilizando Crystal Reports
Crear un informe Crystal Report
utilizando el Asistente de informes
Formatear
el informe
Generar
un informe
Agrupar
elementos y
crear fórmulas
Seleccionar
los campos
requeridos
Seleccionar una
fuente de datos
Seleccionar
una plantilla
Abrir el Asistente
de informes
140. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 141
29/04/2022
Generación de reportes con Crystal Reports
• Vamos a hacer un reporte que permita listar
todas las ordenes con sus detalle de productos
para un determinado cliente.
• Los clientes seran listados en en grid desde
donde se podra escoger el cliente para generar
el reporte de las ordenes
141. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 142
29/04/2022
Generación de reportes con Crystal Reports
• El reporte de ordenes listará cada una de
las ordenes del cliente con su numero de
orden, la fecha y el detalle de items
ordenados
142. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 143
29/04/2022
Generación de reportes con Crystal Reports
• Creamos el formulario que mostrará el reporte y
arrastramos un CrystalReportViewer
143. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 144
29/04/2022
Generación de reportes con Crystal Reports
• Creamos un nuevo reporte de Crystal report
144. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 145
29/04/2022
Generación de reportes con Crystal Reports
• Seleccionamos como un informa en
Blanco y aceptamos
145. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 146
29/04/2022
Generación de reportes con Crystal Reports
• Nos posicionamos dentro del diseño del reporte(de otra
manera Los campos de base de datos no apareceran)
• Seleccionamos Campos de base de datos
• Asistente de base de datos…
• Nota: Si el explorador de campos no aparece pulse Alternar
la vista de campos del menú de herramientas de Crystal
Reports.
• Si este menu no aparece vaya a Ver->Barras de
Herramientas->Crystal Reports - Principal
146. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 147
29/04/2022
Generación de reportes con Crystal Reports
• En el asistente expandimos Mis Conexiones y en la
conexión que debemos haber establecido previamente a
la base de datos, seleccionamos Agregar comando y
pulsamos el botón >
147. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 148
29/04/2022
Generación de reportes con Crystal Reports
• Ingresamos la consulta y agregamos un
parámetro del tipo apropiado
(numérico,texto, fecha, etc) y Aceptamos
148. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 149
29/04/2022
Generación de reportes con Crystal Reports
• Crear el parámetro
149. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 150
29/04/2022
Generación de reportes con Crystal Reports
• Escogemos el valor por defecto del
parámetro para la consulta y aceptamos
150. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 151
29/04/2022
Generación de reportes con Crystal Reports
• Click derecho en seccion detalles,
insertamos un nuevo Grupo para OrderID
151. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 152
29/04/2022
Generación de reportes con Crystal Reports
• Una vez creados los campos de la consulta les
arrastramos a los grupos de detalle como sea
necesario.
152. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 153
29/04/2022
Generación de reportes con Crystal Reports
• Para insertar las etiquetas pulsamos el
boton derecho Insertar->Objeto de Texto
153. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 154
29/04/2022
Generación de reportes con Crystal Reports
• En el footerSection ingresamos un
resumen para el campo STotal
154. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 155
29/04/2022
Generación de reportes con Crystal Reports
• Creamos un Formulario con un grid y le
poblamos con la lista de clientes que incluye
codigo y nombre desde donde se podrá
seleccionar al cliente cuyas ordenes se desean
reportar
155. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 156
29/04/2022
Generación de reportes con Crystal Reports
• En el evento DoubleClick del Grid que
muestra los clientes asignamos el
parámetro al formulario que generará el
reporte y mostramos el formulario del
reporte
156. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 157
29/04/2022
Generación de reportes con Crystal Reports
• En el evento Load del formulario que genera el
reporte y con el ID del cliente pasado desde el
formulario anterior, se instancia un nuevo objeto
del tipo del reporte, asignamos el Id del cliente
como parámetro y asignamos el reporte al
ReportSource del visor para generar el reporte
157. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 158
29/04/2022
Generación de reportes con Crystal Reports
• Damos formato a los campos con Click
derecho sobre al campo
158. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 159
29/04/2022
Cómo añadir DataSets a un informe
• Añadir conjuntos de de datos (datasets) a
los informes nos permite crear informes
desconectados de la base de datos
• Para añadir datasets a un informe, añadir
el código al evento Form_Load
Private rpt As New OrderHistory()
Private dsReportInfo As New DataSet()
dsReportInfo.ReadXml("NorthwindData.xml")
rpt.SetDataSource(dsReportInfo)
CrystalReportViewer1.ReportSource = rpt
159. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 160
29/04/2022
Cómo visualizar un informe utilizando
Crystal Report Viewer
Establecer ReportSource al nombre del informe visualizado
Añadir el control Crystal Report Viewer al formulario
Utilizar ShowZoomButton para hacer zoom in y zoom out
sobre el informe
Utilizar ShowPrintButton para imprimir el informe
Para visualizar un informe utilizando Crystal Report Viewer
160. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 161
29/04/2022
Cómo funciona la impresión en una
aplicación Windows Forms de .NET
5. Método Print
• Envía contenido a la
impresora
4. Cuadros de diálogo estándares
para impresión
• PrintPreviewDialog
• PageSetupDialog
• PrintDialog
¿Y sobre el
soporte de
usuario?
3. Parámetro PrintPageEventArgs
• Propiedad PageSettings
• Objeto Graphics
• Propiedad HasMorePages
2. Evento PrintPage
• Construye contenido
• Soporta documentos
multipágina
1. Objeto PrintDocument
• Habilita la impresión
¿Cómo?
¿Otra vez,
cómo?
¿Pero cómo
imprimo?
161. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 162
29/04/2022
Objeto PrintDocument
◼ Objeto PrintDocument
⚫ Proporciona la capacidad de imprimir un documento
⚫ Proporciona propiedades que describen qué imprimir
Nota: Las marcas indican las propiedades, eventos y métodos
del objeto PrintDocument utilizados más frecuentemente
Propiedades de
PrintDocument
DefaultPageSettings
DocumentName
PrintController
PrinterSettings
Eventos de
PrintDocument
BeginPrint
EndPrint
PrintPage
QueryPageSettings
Métodos de
PrintDocument
Dispose
Print
162. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 163
29/04/2022
Evento PrintPage y
PrintPageEventArgs
• El evento PrintPage incluye
dos parámetros: un objeto que
representa el emisor y un
objeto PrintPageEventsArgs
• El procedimiento de evento
PrintPage contiene la lógica
de programación que
construye los contenidos del
documento de impresión y
garantiza que el documento de
impresión completo se
imprime
•El objeto
PrintPageEventArgs
proporciona los
componentes requeridos
para construir las páginas
del documento de
impresión
•PageSettings, Graphics,
y HasMorePages son los
miembros críticos
Objeto PrintPagesEventArgs
Evento PrintPage
163. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 164
29/04/2022
Cómo habilitar la impresión en una
aplicación Windows Forms
Evento PrintPage
• La clase
debemos utilizarla para leer las
opciones de la página como los
márgenes y el ancho y alto de la
página
• Establece fuentes y grosor
utilizados en nuestra salida
• Establece regiones en la página
• Construye la salida posicionando
texto y gráficos utilizando los
métodos de la clase Graphics
Clase PrintPagesEventArgs
PrintPageEventArgs
• Objeto Graphics
• HasMorePages
• PageSettings
Objeto PrintDocument
• Especifica las opciones de
impresión
• Añade lógica de impresión al
evento PrintPage
• Invoca al método Print
Método Print
• Llama a PrintPage
• Verifica HasMorePages
DefaultPageSettings
Cuadros de diálogo
• La propiedad de los cuadros
de diálogo del documento se
establece al objeto
PrintDocument
164. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 165
29/04/2022
Cómo utilizar el control
PrintPreviewDialog
PrintPreviewDialog
◼ Utilizar PrintPreviewDialog para visualizar el aspecto de un
documento cuando se imprima
◼ Utilizar la vista previa de un documento
1.Crear una instancia del componente PrintPreviewDialog
2.Establecer la propiedad Document del objeto PrintDocument
3.Configurar las opciones de visualización deseadas para
PrintPreviewDialog y el PrintPreviewControl incluido
4.Mostrar el cuadro de diálogo utilizando el método ShowDialog
165. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 166
29/04/2022
Cómo utilizar el control
PageSetupDialog
◼ Utilizar PageSetupDialog para establecer los detalles de página en
aplicaciones Windows Forms
⚫ Ajustes de bordes y márgenes
⚫ Encabezados y pies
⚫ Orientación horizontal y vertical
◼ Para utilizar PageSetupDialog y especificar las opciones de página
1. Crear una instancia del control PageSetupDialog
2. Utilizar ShowDialog para visualizar el cuadro de diálogo en tiempo de
ejecución
3. Especificar las opciones del documento utilizando la propiedad
DefaultPageSettings o la clase PageSettings
PageSetupDialog
166. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 167
29/04/2022
Cómo utilizar el control PrintDialog
◼ Utilizar PrintDialog para especificar las opciones relacionadas con la
impresión
⚫ Especificar la impresora y las propiedades del trabajo de impresión
⚫ Especificar el rango de impresión y reunir las opciones
◼ Utilizar PrintDialog para que los usuarios seleccionen una impresora
1. Crear una instancia del omponente PrintDialog
2. Establecer la propiedad Document del objeto PrintDocument
3. Capturar la entrada del usuario utilizando la propiedad DialogResult
y visualizar el Cuadro de diálogo de impresión
PrintDialog
167. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 168
29/04/2022
Contenido
• Conceptos básicos y Conexión a base de
datos.
• Objetos comunes para trabajo con base de
datos: connection, command, parameter,
datareader, dataadapter.
• Formularios dinámicos con interacción a
base de datos.
• Creación de consultas y generación de
documentos con formato portable.
• Leer y escribir datos XML
168. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 169
29/04/2022
Conceptos básicos
• XML: Extensible Mark-up Language (lenguaje
de marcado extensible)
• Es un lenguaje orientado a:
– La definición de datos de carácter general. Nos
permite definir modelos de datos.
• Al compartir modelos de datos se facilita el intercambio de
datos entre sistemas (aplicaciones) heterogéneos.
– Crear nuevos lenguajes gracias a sus mecanismos
de extensibilidad. Por ello, se dice que XML es un
metalenguaje (un lenguaje para crear nuevos
lenguajes).
• Se refiere únicamente a los datos, no a su
presentación. Deja a otras aplicaciones la tarea
de definir la estructura de visualización.
169. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 170
29/04/2022
Conceptos básicos
XML
170. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 171
29/04/2022
¿Qué es XML?
• Texto que cumple ciertas reglas
• Las reglas tienen puntos en común con
HTML
• Abierto a sistemas operativos
171. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 172
29/04/2022
¿Qué es XML?
• XML es un sub-conjunto de SGML (Standard
Generalized Mark-up Language)
• Creado y soportado por el World Wide Web
Consortium (www.w3c.org)
SGML
XML
HTML
172. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 173
29/04/2022
¿Qué es XML?
• XML es un sub-conjunto
de SGML (Standard
Generalized Mark-up
Language)
• Creado y soportado por
el World Wide Web
Consortium
(www.w3c.org)
173. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 174
29/04/2022
¿Qué es XML?
• Más fácil que SGML
• Más pequeño
• Pensado para ser utilizado en Internet
• XML es un lenguaje utilizado para
estructurar y describir datos de forma que
puedan ser entendidos o interpretados por
diferentes aplicaciones
• Puede ser utilizado por cualquier lenguaje
y/o sistema operativo
174. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 175
29/04/2022
¿Qué es XML?
• XML es un meta-lenguaje que nos permite definir
lenguajes de marcado, adecuados a usos
determinados
• XML es un estándar de Internet, aprobado por la W3C
(http://www.w3.org/TR/REC-xml/)
• Traducciones:
http://www.w3.org/2003/03/Translations/OverviewLang
.html#es
• Los proveedores tratan de ajustarse a las
especificaciones
• Microsoft (MSXML40.DLL) e IBM ofrecen un conjunto
de objetos para manejar XML
175. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 176
29/04/2022
¿Qué es XML?
<?xml version="1.0"?>
<authors>
<author ID="1">
<name>Jay</name>
</author>
<!-- There are more authors. -->
</authors>
◼ Proporciona un método uniforme para describir e
intercambiar datos estructurados
◼ Podemos definir nuestros propios elementos y atributos
◼ Los elementos pueden anidarse
◼ XML válido frente a XML con un formato correcto
Instrucción de
procesamiento
Elementos
Atributos
Comentarios
176. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 177
29/04/2022
¿Qué NO es XML?
• XML no es una versión mejorada de
HTML
• XML no es un lenguaje para hacer
mejores páginas web
• XML no es difícil
177. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 178
29/04/2022
XML (ejemplo)
◼ Documento XML:
<libro> marca de comienzo
The XML Bible contenido
</libro> marca de fin
<autor nro=2332>
Elliotte Rusty Harold
</autor>
elemento atributo
178. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 179
29/04/2022
El elemento y sus atributos
<autor pais=“Uruguay”>Mario Benedetti</autor>
Nombre del elemento
Nombre del atributo
Valor del atributo
Contenido del elemento
Etiqueta de fin
179. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 180
29/04/2022
Reglas y pautas XML
• Se dice que un documento XML es ‘bien
formado’ (well formed), cuando cumple
una serie de reglas escritas en XML v1.0
– Los elementos deben seguir una estructura
de árbol (estrictamente jerárquica)
– Los elementos deben estar correctamente
anidados
– Los elementos no se pueden superponer
entre ellos
180. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 181
29/04/2022
Estructura de un documento XML
◼ Estructura
⚫ Lógica = cómo se
estructura el documento
⚫ Física = qué contiene el
documento
◼ Prólogo
⚫ XML Declaration
⚫ Document Type
Declaration
◼ Document Element
⚫ Siempre el raíz
◼ Anidamiento de
elementos restantes
<?xml version="1.0"?>
<!DOCTYPE FloresSilvestres SYSTEM “flores.dtd">
181. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 182
29/04/2022
Sintaxis
◼ Etiquetas
⚫ Apertura/cierre <TAG> Texto </TAG>
⚫ Elemento vacío <TAG></TAG> <TAG/>
◼ Atributos <TAG ATRIB=“valor”> Texto </TAG>
◼ Entidades
⚫ Parseadas <!ENTITY PL “poca luz”> ...
<TERM>Esta planta necesita &PL;</TERM>
⚫ No parseadas <!ENTITY Img SYSTEM “Img.gif” NDATA GIF>
⚫ Predefinidas < <
& &
...
182. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 183
29/04/2022
Recomendaciones
◼ Todo contenido estará etiquetado. Toda etiqueta debe estar delimitada por los símbolos
de menor y mayor. Ejemplo: <libro>
◼ Las etiquetas se cierran en el mismo orden en el que se abrieron. La etiqueta de cierre
tiene el mismo nombre que la de apertura y se inicia por la barra ‘/’.
⚫ Ejemplo: <libro> ... </libro>
⚫ Por comodidad se permiten etiquetas que sirvan tanto para la apertura como para el cierre. Estas
etiquetas deben acabar con el símbolo de barra ‘/’.
◼ Los nombres de etiquetas son sensibles a mayúsculas y minúsculas (a diferencia de
HTML)
◼ La estructura de una etiqueta sigue la terna objeto-atributo-valor.
⚫ Notación larga:
<etiqueta>
<atributo1> valor </atributo1>
...
</etiqueta>
⚫ Notación corta (las dobles comillas son obligatorias, a diferencia de HTML):
<etiqueta atributo1=“valor” ... > </etiqueta>
⚫ Ejemplo:
<libro>
<autor>Miguel De Cervantes</autor>
<titulo>El Quijote</titulo>
<precio>18</precio>
</libro>
183. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 184
29/04/2022
Recomendaciones
◼ La estructura del documento es jerárquica, en forma de árbol, en la que
siempre hay un primer elemento raíz.
◼ Todo documento XML debe comenzar por una declaración XML con la
siguiente estructura:
<?xml
version=“Versión de XML”
encoding=“Codificación”
standalone=“Incluye_DTD”
?>
◼ Donde cada atributo significa:
⚫ Versión de XML: número de versión que se utiliza.
⚫ Codificación: formato de codificación, por ejemplo, UTF-8, UTF-16, ISO-10646-
UCS-2, ISO-10646-UCS-4, ISO-8859-1, ISO-8859-2, (hasta ISO-8859-9), etc. Las
dos primeras son las más usadas.
⚫ Incluye_DTD: puede tomar el valor “yes” (la especificación DTD se encuentra en
el propio documento) o “no” (la especificación es un archivo externo).
◼ Ejemplo:
<?xml version=“1.0” encoding=“UTF-8” standalone=“yes” ?>
184. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 185
29/04/2022
<?xml version="1.0" encoding="UTF-8” standalone=“yes”?>
<!-- Ejemplo de Biblioteca -->
<biblioteca>
<libro ISBN="0-596-00292-0">
<titulo>XML in a Nutshell, 2nd Edition</titulo>
<autor>
<nombre>Elliotte Rusty Harold, W. Scott Means</nombre>
<email>elliottscott@oreilly.com</email>
<direccion>1005 Gravenstein Highway North, CA 3472
</direccion>
</autor>
<capitulo nombre="Introduccion">
XML Concepts
<seccion>
<nombre>Introducing XML</nombre>
<contenido>bla bla bla bla...</contenido>
</seccion>
</capitulo>
</libro>
</biblioteca>
XML (Ejemplo...)
185. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 186
29/04/2022
Principales tecnologías XML
◼ Definición de esquemas XML (XSD)
⚫ Define la estructura requerida de un documento XML válido
◼ Extensible Stylesheet Language Transformation (XSLT)
⚫ Transforma el contenido de un documento XML fuente en otro documento que
es diferente en formato o estructura
◼ Lenguaje XML Path (XPath)
⚫ Direcciona partes de un documento XML
◼ Document Object Model (DOM)
⚫ Modelo de objetos para trabajar programáticamente con documentos XML en
memoria
◼ XML Query (XQuery)
⚫ Lenguaje de fácil implementación en el que las consultas son concisas y se
entienden fácilmente
186. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 187
29/04/2022
¿Por qué utilizar XML con Datasets?
◼ XML es el formato universal para intercambiar datos en Internet
◼ Los Datasets serializan datos en forma de XML
◼ XML proporciona un formato cómodo para transferir el contenido de un Dataset
a/desde clientes remotos
◼ Los objetos XML sincronizan y transforman datos
Legible por una persona
Legible por un mainframe
Archivo
XML
o
Flujo
Legible por el navegador
Servidor Web
DataSet
Cortafuegos
187. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 188
29/04/2022
Descripción de XML y DataSets
Archivo
XML
Objeto
DataSet
Objeto
XmlDataDocument
Objeto
XslTransform
Archivo
XML o
HTML
Base de
datos
DataAdapter
ReadXML
Doc.Save
WriteXML
Archivo
XSLT
Archivo
XML
Archivo
XML
188. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 189
29/04/2022
System.Data - DataSet y XML
• El DataSet puede leer y escribir XML desde sus
datos y del esquema
– O sea: es posible crear o modificar un DataSet usando
XML
• Método de lectura con formato XML:
– GetXml: Obtiene los datos del DataSet
(incluyendo el esquema)
– GetXmlSchema: obtiene el esquema XSD del
DataSet
• Para escribir: WriteXml, WriteXmlSchema
189. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 190
29/04/2022
ADO.NET - Soporte a XML
XmlTextWriter
XmlTextReader
<XML>
XmlDocument
DocumentNavigator
XmlReader
XmlValidatingReader XmlNodeReader
190. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 191
29/04/2022
Los métodos basados en XML del
objeto DataSet
◼ Utilizan ReadXml para cargar datos de un archivo o flujo
◼ Utilizan WriteXml para escribir datos XML a un archivo o flujo
◼ Utilizan GetXml para escribir datos a una variable de cadena
DataSet ds = new DataSet();
ds.ReadXml(Server.MapPath("filename.xml"));
DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter("select * from
Authors", conn);
da.Fill(ds);
ds.WriteXml(Server.MapPath("filename.xml"));
string strXmlDS = ds.GetXml();
191. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 192
29/04/2022
Crear datos XML anidados
◼ De forma predeterminada, la salida de DataTable es secuencial
◼ Para anidar XML, anidar DataRelation
Secuencial Anidado
<Title name="title1" />
<Title name="title2" />
<Title name="title3" />
<Publisher name="pub1" />
<Publisher name="pub2" />
<Publisher name="pub1" >
<Title name="title1" />
<Title name="title3" />
</Publisher>
<Publisher name="pub2" >
<Title name="title2" />
</Publisher>
DataRelation dr = new
DataRelation("name",
parentCol,
childCol);
dr.Nested = true;
ds.Relations.Add(dr);
192. Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 193
29/04/2022
Crear archivo XML en C#
• Te mostramos un ejemplo de como crear un
archivo XML en C# usando XmlDocument de Syst
em.Xml.
• Desde luego, tu puedes crear un XML
concatenando cadenas y respetando la estructura
de un XML.
• Sin embargo, a veces es necesario hacerlo de
forma dinámica y con la seguridad de que la
estructura se puede modificar sin incurrir en
errores dejando las validaciones a librerías
especializadas.
• El código que puedes copiar y probar es el
siguiente: