SlideShare une entreprise Scribd logo
1  sur  199
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
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.
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
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).
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
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]
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
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
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
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).
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.
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
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)...
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).
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.
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
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
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.
Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 19
29/04/2022
Proveedores de acceso a datos
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
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.
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
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
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
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
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
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
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)
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
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
Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 31
29/04/2022
Datos conectados
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
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
Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 34
29/04/2022
Modelo conectado
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
Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 36
29/04/2022
Datos desconectados
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)
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
Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 39
29/04/2022
Modelo desconectado
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.
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.
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
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
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
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
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
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
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.
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);
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
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)
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);
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.
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
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
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);
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);
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
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
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
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
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);
}
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));
}
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;
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();
}
}
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
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
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);
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
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
Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 71
29/04/2022
Adaptador de datos
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
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
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;
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
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
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!
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
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
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
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
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
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
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"];
}
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
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.
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);
}
}
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 );
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
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 );
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
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
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");
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
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
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;
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");
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
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;
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();
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)
Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 103
29/04/2022
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();
}
}
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();
}
}
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)
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
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
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
…
…
…
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
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
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;
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.
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;
}
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
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
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
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
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
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
• …
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
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( );
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
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,
…
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);
}
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);
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"} );
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);
}
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
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
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/
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);
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();
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();
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");
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);
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();
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);
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
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
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
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
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
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
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
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
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 >
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
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
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
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
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.
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
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
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
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
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
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
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
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
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?
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
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
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
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
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
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
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
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.
Programación Orientada a Eventos Carrera de Software
Ph.D. Franklin Parrales 170
29/04/2022
Conceptos básicos
XML
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
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
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)
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
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
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
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
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
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
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
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">
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 &lt;  <
&amp;  &
...
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>
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” ?>
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...)
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
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
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
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
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
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();
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);
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:
POE Unidad 3: Aplicaciones visuales orientadas a eventos con acceso a base de datos
POE Unidad 3: Aplicaciones visuales orientadas a eventos con acceso a base de datos
POE Unidad 3: Aplicaciones visuales orientadas a eventos con acceso a base de datos
POE Unidad 3: Aplicaciones visuales orientadas a eventos con acceso a base de datos
POE Unidad 3: Aplicaciones visuales orientadas a eventos con acceso a base de datos
POE Unidad 3: Aplicaciones visuales orientadas a eventos con acceso a base de datos
POE Unidad 3: Aplicaciones visuales orientadas a eventos con acceso a base de datos

Contenu connexe

Tendances

POO Unidad 3: Interfaz gráfica de usuario e hilos
POO Unidad 3: Interfaz gráfica de usuario e hilosPOO Unidad 3: Interfaz gráfica de usuario e hilos
POO Unidad 3: Interfaz gráfica de usuario e hilosFranklin Parrales Bravo
 
Patrones de diseño de software
Patrones de diseño de softwarePatrones de diseño de software
Patrones de diseño de softwareIker Canarias
 
ORM: Object-relational mapping
ORM: Object-relational mappingORM: Object-relational mapping
ORM: Object-relational mappingAbhilash M A
 
Object Pascal Clean Code Guidelines Proposal (at EKON 22)
Object Pascal Clean Code Guidelines Proposal (at EKON 22)Object Pascal Clean Code Guidelines Proposal (at EKON 22)
Object Pascal Clean Code Guidelines Proposal (at EKON 22)Arnaud Bouchez
 
TDD (Test-Driven Development)
TDD (Test-Driven Development)TDD (Test-Driven Development)
TDD (Test-Driven Development)Renato Groff
 
Manejo de excepciones en Java
Manejo de excepciones en JavaManejo de excepciones en Java
Manejo de excepciones en JavaJohn Ortiz
 
Learn Entity Framework in a day with Code First, Model First and Database First
Learn Entity Framework in a day with Code First, Model First and Database FirstLearn Entity Framework in a day with Code First, Model First and Database First
Learn Entity Framework in a day with Code First, Model First and Database FirstJibran Rasheed Khan
 
Apresentação Banco de Dados - Caché
Apresentação Banco de Dados - CachéApresentação Banco de Dados - Caché
Apresentação Banco de Dados - CachéRenzo Petri
 
Patrón de diseño Modelo-Vista-Controlador (MVC)
Patrón de diseño Modelo-Vista-Controlador (MVC)Patrón de diseño Modelo-Vista-Controlador (MVC)
Patrón de diseño Modelo-Vista-Controlador (MVC)Jose R. Hilera
 
Spring boot
Spring bootSpring boot
Spring bootsdeeg
 
Curso de PHP Básico ao Avançado
Curso de PHP Básico ao AvançadoCurso de PHP Básico ao Avançado
Curso de PHP Básico ao AvançadoLuiz Junior
 
Introdução à Programação Web com Angular
Introdução à Programação Web com AngularIntrodução à Programação Web com Angular
Introdução à Programação Web com AngularElmano Cavalcanti
 
UDA-Guia desarrollo web services
UDA-Guia desarrollo web servicesUDA-Guia desarrollo web services
UDA-Guia desarrollo web servicesAnder Martinez
 

Tendances (20)

POO Unidad 3: Interfaz gráfica de usuario e hilos
POO Unidad 3: Interfaz gráfica de usuario e hilosPOO Unidad 3: Interfaz gráfica de usuario e hilos
POO Unidad 3: Interfaz gráfica de usuario e hilos
 
Patrones de diseño de software
Patrones de diseño de softwarePatrones de diseño de software
Patrones de diseño de software
 
Getting started with entity framework
Getting started with entity framework Getting started with entity framework
Getting started with entity framework
 
ORM: Object-relational mapping
ORM: Object-relational mappingORM: Object-relational mapping
ORM: Object-relational mapping
 
Object Pascal Clean Code Guidelines Proposal (at EKON 22)
Object Pascal Clean Code Guidelines Proposal (at EKON 22)Object Pascal Clean Code Guidelines Proposal (at EKON 22)
Object Pascal Clean Code Guidelines Proposal (at EKON 22)
 
Programação Orientado a Objetos
Programação Orientado a ObjetosProgramação Orientado a Objetos
Programação Orientado a Objetos
 
TDD (Test-Driven Development)
TDD (Test-Driven Development)TDD (Test-Driven Development)
TDD (Test-Driven Development)
 
Manejo de excepciones en Java
Manejo de excepciones en JavaManejo de excepciones en Java
Manejo de excepciones en Java
 
Learn Entity Framework in a day with Code First, Model First and Database First
Learn Entity Framework in a day with Code First, Model First and Database FirstLearn Entity Framework in a day with Code First, Model First and Database First
Learn Entity Framework in a day with Code First, Model First and Database First
 
POO - Aula 1
POO - Aula 1POO - Aula 1
POO - Aula 1
 
Apresentação Banco de Dados - Caché
Apresentação Banco de Dados - CachéApresentação Banco de Dados - Caché
Apresentação Banco de Dados - Caché
 
10 Polimorfismo
10   Polimorfismo10   Polimorfismo
10 Polimorfismo
 
Patrón de diseño Modelo-Vista-Controlador (MVC)
Patrón de diseño Modelo-Vista-Controlador (MVC)Patrón de diseño Modelo-Vista-Controlador (MVC)
Patrón de diseño Modelo-Vista-Controlador (MVC)
 
Spring boot
Spring bootSpring boot
Spring boot
 
Front End x Back End
Front End x Back EndFront End x Back End
Front End x Back End
 
Presentación JavaScript
Presentación JavaScriptPresentación JavaScript
Presentación JavaScript
 
Curso de PHP Básico ao Avançado
Curso de PHP Básico ao AvançadoCurso de PHP Básico ao Avançado
Curso de PHP Básico ao Avançado
 
CSS FLexBox
CSS FLexBoxCSS FLexBox
CSS FLexBox
 
Introdução à Programação Web com Angular
Introdução à Programação Web com AngularIntrodução à Programação Web com Angular
Introdução à Programação Web com Angular
 
UDA-Guia desarrollo web services
UDA-Guia desarrollo web servicesUDA-Guia desarrollo web services
UDA-Guia desarrollo web services
 

Similaire à POE Unidad 3: Aplicaciones visuales orientadas a eventos con acceso a base de datos

Similaire à POE Unidad 3: Aplicaciones visuales orientadas a eventos con acceso a base de datos (20)

Oledb
Oledb Oledb
Oledb
 
Diapositivas de ado.net
Diapositivas de ado.netDiapositivas de ado.net
Diapositivas de ado.net
 
Base datos
Base datos Base datos
Base datos
 
Base de datos
Base de datosBase de datos
Base de datos
 
JDBC
JDBCJDBC
JDBC
 
Base de datos
Base de datosBase de datos
Base de datos
 
ADO .net
ADO .netADO .net
ADO .net
 
Glosario base de datos
Glosario base de datosGlosario base de datos
Glosario base de datos
 
Base de datos
Base de datosBase de datos
Base de datos
 
Programacion de base de datos - Unidad 1: Conexion a la base de datos con un ...
Programacion de base de datos - Unidad 1: Conexion a la base de datos con un ...Programacion de base de datos - Unidad 1: Conexion a la base de datos con un ...
Programacion de base de datos - Unidad 1: Conexion a la base de datos con un ...
 
ADO
ADOADO
ADO
 
Base de datos
Base de datos Base de datos
Base de datos
 
Bases de Datos II: El entorno
Bases de Datos II: El entornoBases de Datos II: El entorno
Bases de Datos II: El entorno
 
Base de datos
Base de datosBase de datos
Base de datos
 
Actividad 4
Actividad 4Actividad 4
Actividad 4
 
programación III
programación III programación III
programación III
 
Base de datos
Base de datosBase de datos
Base de datos
 
Actividad4 garibay blanca
Actividad4 garibay blancaActividad4 garibay blanca
Actividad4 garibay blanca
 
Gestores de Base de Datos
Gestores de Base de DatosGestores de Base de Datos
Gestores de Base de Datos
 
Ado.net
Ado.netAdo.net
Ado.net
 

Plus de Franklin Parrales Bravo

Presentacion del congreso ETCM del 2021 en Cuenca
Presentacion del congreso ETCM del 2021 en CuencaPresentacion del congreso ETCM del 2021 en Cuenca
Presentacion del congreso ETCM del 2021 en CuencaFranklin Parrales Bravo
 
IW Unidad 1: Introducción a la Ingeniería Web
IW Unidad 1: Introducción a la Ingeniería WebIW Unidad 1: Introducción a la Ingeniería Web
IW Unidad 1: Introducción a la Ingeniería WebFranklin Parrales Bravo
 
IW Unidad 4: Web accesible, semántica y ubicua
IW Unidad 4: Web accesible, semántica y ubicuaIW Unidad 4: Web accesible, semántica y ubicua
IW Unidad 4: Web accesible, semántica y ubicuaFranklin Parrales Bravo
 
IW Unidad 3: Ingeniería Web dirigida por modelos
IW Unidad 3: Ingeniería Web dirigida por modelosIW Unidad 3: Ingeniería Web dirigida por modelos
IW Unidad 3: Ingeniería Web dirigida por modelosFranklin Parrales Bravo
 
IW Unidad 2: Metodologías y Técnicas de la Ingeniería Web
IW Unidad 2: Metodologías y Técnicas de la Ingeniería WebIW Unidad 2: Metodologías y Técnicas de la Ingeniería Web
IW Unidad 2: Metodologías y Técnicas de la Ingeniería WebFranklin Parrales Bravo
 
AD Unidad4: Programación paralela y distribuida
AD Unidad4: Programación paralela y distribuidaAD Unidad4: Programación paralela y distribuida
AD Unidad4: Programación paralela y distribuidaFranklin Parrales Bravo
 
AD Unidad3: Tecnologías de aplicaciones distribuidas
AD Unidad3: Tecnologías de aplicaciones distribuidasAD Unidad3: Tecnologías de aplicaciones distribuidas
AD Unidad3: Tecnologías de aplicaciones distribuidasFranklin Parrales Bravo
 
EP Unidad03: Planificación financiera y análisis de riesgos
EP Unidad03: Planificación financiera y análisis de riesgosEP Unidad03: Planificación financiera y análisis de riesgos
EP Unidad03: Planificación financiera y análisis de riesgosFranklin Parrales Bravo
 
AD Unidad2: Diseño de programas paralelos y distribuidos
AD Unidad2: Diseño de programas paralelos y distribuidosAD Unidad2: Diseño de programas paralelos y distribuidos
AD Unidad2: Diseño de programas paralelos y distribuidosFranklin Parrales Bravo
 
AD Unidad1: Fundamentos de sistemas paralelos y distribuidos
AD Unidad1: Fundamentos de sistemas paralelos y distribuidosAD Unidad1: Fundamentos de sistemas paralelos y distribuidos
AD Unidad1: Fundamentos de sistemas paralelos y distribuidosFranklin Parrales Bravo
 
EP Unidad01: Principios básicos de la metodología de proyectos
EP Unidad01: Principios básicos de la metodología de proyectosEP Unidad01: Principios básicos de la metodología de proyectos
EP Unidad01: Principios básicos de la metodología de proyectosFranklin Parrales Bravo
 
EP Unidad02: Conceptos para el alcance, tiempo y muestra
EP Unidad02: Conceptos para el alcance, tiempo y muestraEP Unidad02: Conceptos para el alcance, tiempo y muestra
EP Unidad02: Conceptos para el alcance, tiempo y muestraFranklin Parrales Bravo
 
GCSW Unidad1: Objetos de la Gestión de Configuración del Software
GCSW Unidad1: Objetos de la Gestión de Configuración del SoftwareGCSW Unidad1: Objetos de la Gestión de Configuración del Software
GCSW Unidad1: Objetos de la Gestión de Configuración del SoftwareFranklin Parrales Bravo
 
GCSW Unidad2: Actividades de la gestión de configuración del software
GCSW Unidad2: Actividades de la gestión de configuración del software GCSW Unidad2: Actividades de la gestión de configuración del software
GCSW Unidad2: Actividades de la gestión de configuración del software Franklin Parrales Bravo
 
POO Unidad 4: Persistencia de objetos y manejo de archivos
POO Unidad 4: Persistencia de objetos y manejo de archivosPOO Unidad 4: Persistencia de objetos y manejo de archivos
POO Unidad 4: Persistencia de objetos y manejo de archivosFranklin Parrales Bravo
 
POO Unidad 2: Programación Orientada a Objetos
POO Unidad 2: Programación Orientada a ObjetosPOO Unidad 2: Programación Orientada a Objetos
POO Unidad 2: Programación Orientada a ObjetosFranklin Parrales Bravo
 
POO Unidad 1: Introducción a la Programación Orientada a Objetos
POO Unidad 1: Introducción a la Programación Orientada a ObjetosPOO Unidad 1: Introducción a la Programación Orientada a Objetos
POO Unidad 1: Introducción a la Programación Orientada a ObjetosFranklin Parrales Bravo
 
RD Unidad 3: IPv6, Routers y Enrutamiento
RD Unidad 3: IPv6, Routers y EnrutamientoRD Unidad 3: IPv6, Routers y Enrutamiento
RD Unidad 3: IPv6, Routers y EnrutamientoFranklin Parrales Bravo
 
RD Unidad 2: Transmisión de datos. El mundo del TCP/IP y direccionamiento iPv4
RD Unidad 2: Transmisión de datos. El mundo del TCP/IP y direccionamiento iPv4RD Unidad 2: Transmisión de datos. El mundo del TCP/IP y direccionamiento iPv4
RD Unidad 2: Transmisión de datos. El mundo del TCP/IP y direccionamiento iPv4Franklin Parrales Bravo
 

Plus de Franklin Parrales Bravo (20)

Presentacion del congreso ETCM del 2021 en Cuenca
Presentacion del congreso ETCM del 2021 en CuencaPresentacion del congreso ETCM del 2021 en Cuenca
Presentacion del congreso ETCM del 2021 en Cuenca
 
IW Unidad 1: Introducción a la Ingeniería Web
IW Unidad 1: Introducción a la Ingeniería WebIW Unidad 1: Introducción a la Ingeniería Web
IW Unidad 1: Introducción a la Ingeniería Web
 
IW Unidad 4: Web accesible, semántica y ubicua
IW Unidad 4: Web accesible, semántica y ubicuaIW Unidad 4: Web accesible, semántica y ubicua
IW Unidad 4: Web accesible, semántica y ubicua
 
IW Unidad 3: Ingeniería Web dirigida por modelos
IW Unidad 3: Ingeniería Web dirigida por modelosIW Unidad 3: Ingeniería Web dirigida por modelos
IW Unidad 3: Ingeniería Web dirigida por modelos
 
MOD Unidad 2: Tipos de modelado
MOD Unidad 2: Tipos de modeladoMOD Unidad 2: Tipos de modelado
MOD Unidad 2: Tipos de modelado
 
IW Unidad 2: Metodologías y Técnicas de la Ingeniería Web
IW Unidad 2: Metodologías y Técnicas de la Ingeniería WebIW Unidad 2: Metodologías y Técnicas de la Ingeniería Web
IW Unidad 2: Metodologías y Técnicas de la Ingeniería Web
 
AD Unidad4: Programación paralela y distribuida
AD Unidad4: Programación paralela y distribuidaAD Unidad4: Programación paralela y distribuida
AD Unidad4: Programación paralela y distribuida
 
AD Unidad3: Tecnologías de aplicaciones distribuidas
AD Unidad3: Tecnologías de aplicaciones distribuidasAD Unidad3: Tecnologías de aplicaciones distribuidas
AD Unidad3: Tecnologías de aplicaciones distribuidas
 
EP Unidad03: Planificación financiera y análisis de riesgos
EP Unidad03: Planificación financiera y análisis de riesgosEP Unidad03: Planificación financiera y análisis de riesgos
EP Unidad03: Planificación financiera y análisis de riesgos
 
AD Unidad2: Diseño de programas paralelos y distribuidos
AD Unidad2: Diseño de programas paralelos y distribuidosAD Unidad2: Diseño de programas paralelos y distribuidos
AD Unidad2: Diseño de programas paralelos y distribuidos
 
AD Unidad1: Fundamentos de sistemas paralelos y distribuidos
AD Unidad1: Fundamentos de sistemas paralelos y distribuidosAD Unidad1: Fundamentos de sistemas paralelos y distribuidos
AD Unidad1: Fundamentos de sistemas paralelos y distribuidos
 
EP Unidad01: Principios básicos de la metodología de proyectos
EP Unidad01: Principios básicos de la metodología de proyectosEP Unidad01: Principios básicos de la metodología de proyectos
EP Unidad01: Principios básicos de la metodología de proyectos
 
EP Unidad02: Conceptos para el alcance, tiempo y muestra
EP Unidad02: Conceptos para el alcance, tiempo y muestraEP Unidad02: Conceptos para el alcance, tiempo y muestra
EP Unidad02: Conceptos para el alcance, tiempo y muestra
 
GCSW Unidad1: Objetos de la Gestión de Configuración del Software
GCSW Unidad1: Objetos de la Gestión de Configuración del SoftwareGCSW Unidad1: Objetos de la Gestión de Configuración del Software
GCSW Unidad1: Objetos de la Gestión de Configuración del Software
 
GCSW Unidad2: Actividades de la gestión de configuración del software
GCSW Unidad2: Actividades de la gestión de configuración del software GCSW Unidad2: Actividades de la gestión de configuración del software
GCSW Unidad2: Actividades de la gestión de configuración del software
 
POO Unidad 4: Persistencia de objetos y manejo de archivos
POO Unidad 4: Persistencia de objetos y manejo de archivosPOO Unidad 4: Persistencia de objetos y manejo de archivos
POO Unidad 4: Persistencia de objetos y manejo de archivos
 
POO Unidad 2: Programación Orientada a Objetos
POO Unidad 2: Programación Orientada a ObjetosPOO Unidad 2: Programación Orientada a Objetos
POO Unidad 2: Programación Orientada a Objetos
 
POO Unidad 1: Introducción a la Programación Orientada a Objetos
POO Unidad 1: Introducción a la Programación Orientada a ObjetosPOO Unidad 1: Introducción a la Programación Orientada a Objetos
POO Unidad 1: Introducción a la Programación Orientada a Objetos
 
RD Unidad 3: IPv6, Routers y Enrutamiento
RD Unidad 3: IPv6, Routers y EnrutamientoRD Unidad 3: IPv6, Routers y Enrutamiento
RD Unidad 3: IPv6, Routers y Enrutamiento
 
RD Unidad 2: Transmisión de datos. El mundo del TCP/IP y direccionamiento iPv4
RD Unidad 2: Transmisión de datos. El mundo del TCP/IP y direccionamiento iPv4RD Unidad 2: Transmisión de datos. El mundo del TCP/IP y direccionamiento iPv4
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)
  • 102. Programación Orientada a Eventos Carrera de Software Ph.D. Franklin Parrales 103 29/04/2022
  • 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 &lt;  < &amp;  & ...
  • 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: