Interoperabilidadnewton.uam.mx/xgeorge/hmoncayo/BasesDeDatos/Presentaci... · 2005. 10. 28. ·...
Transcript of Interoperabilidadnewton.uam.mx/xgeorge/hmoncayo/BasesDeDatos/Presentaci... · 2005. 10. 28. ·...
-
Interoperabilidad
-
La naturaleza del problema
Operaciones distribuidasExistencia de aplicaciones independientesNecesidad continua de cambiosSiempre da pavor cambiar las aplicaciones existentesUso de tecnología variada a través de la empresaNecesidad de operar en WEB
-
Aplicaciones Independientes
Presentación
Reglas delnegocio
Base de datos
Presentación
Reglas delnegocio
Base de datos
Presentación
Reglas delnegocio
Base de datos
Presentación
Reglas delnegocio
Base de datos
Pedidos Conta-bilidad
Factura-ción
Cuentaspor cobrar
-
Arquitectura de aplicaciones integradasAdaptación oportuna a cambios en los negociosProporcionar información veraz y oportunaApertura de las aplicaciones a nuevas formas de interfaz
-
Arquitectura IntegradaCapa de presentación
Servidor de transacciones Máquina de Inteligenciadel negocio
Componente deintegración
Base de Datos Data Warehouse
-
HardwareServidores de transacciones Data warehouse
Capa de presentación
Firewall
Database server
-
Midleware en el principio
Terminales locales
Terminales remotas
-
Internet
TCP/IP se desarrolla a mediados de los 70’sEn 1983 se instaló en ARPANETUso de sockets para comunicación de procesos remotosLlamado de procedimientos remotos (RPC)
-
RPC’s
Lenguaje dedefinición de
interfazIDL
stub
Cliente
Skeleton
Servidor
-
Acceso a base de datos
Oracle transparent gatewayDRDA de IBMODBC de MicrosoftOLE DB ADO (Active Data Objects)ADO NETJDBC
-
Proceso remoto de SQLServidorCliente
SQL
ParseQuery
Execute
Execute + params
Datos
-
Procedimientos catalogados
DesarrolloServidor
Definición
PlanCliente
Ejecución
Resultados
Definición
Basede
datos
-
Requerimientos Empresariales
EscalabilidadFacilita la incoprporación de hardwarePermite el empleo de bases de datos con replicaciónDepósitos de componentes
Compartición de recursosControl de uso concurrente
Robustez
-
Requerimientos Empresariales
SeguridadControl del nivel de acceso de los usuarios
Encriptamiento de mensajes en red
Soporte de transaccionesBases de datos distribuidas
Bases de datos heterogéneas
Replicación
-
Middleware de componentesTransaccionales
CaracterísticasOperación de componentes en un ambiente distribuido
MTS (Microsoft Transaction Server)Ahora parte de COM+
EJB (Enterprise Java Beans)CORBA
Especificación de OMG
-
Arquitectura de tres capascon COM+
DHTML HTML Win 32 Win FormsServicios depresentación
IIS/ASP
COM+
Servicios deNegocio
Servicios dedatos
ADO OLEDB ODBC
-
Contenedor COM+
Cliente Componentesescitos
por usuariolControldel ciclode vida
Envolturadel
Objeto
IMiInterfazIMiInterfaz
IClassFactory IClassFactory
-
Introducción a .Net
-
.NET FrameworkWeb Services Web Forms Windows Forms
Data and XML ClassesADO.NET, SQL, XSLT, XML
Framework ClassesIO, string, security, threading, reflection, collections
Common Languaje Runtimedebug, exceptions, type checking, JIT Compilesr
Plataforma de Windows
-
Porque .Net
Modelo consistente de programaciónTodos los servicios a través de oop
Modelo simplificado de programaciónNo: IUnknown, AddRef, Release, HRESULT
Una vez que funciona siempre funcionaComponentes en la misma versión
Instalación simplificadaNo: Registro; solo copia de archivos
-
Porque .Net
Independencia de la plataformaGeneración de CIL (Common IntermediateLanguaje)En ejecución CLR (Common LanguajeRuntime) traduce CIL a lenguaje de máquina
Integración de lenguajesLa biblioteca de clases compartida por todos los lenguajes
-
Porque .NetReutilización del código
Creación de componentes comunesManejo automático de memoria
Colector de basura, no apuntadoresFuerte verificación de tiposDepuración multilenguajeBiblioteca de clases consistenteInteroperabilidad
Acceso a componentes COMAcceso a código no administrado
-
Compiladores
Código fuenteC#
Compiladorde C#
MóduloAdministrado
Código fuenteBasic
Compiladorde Basic
MóduloAdministrado
Código fuenteC++
Compiladorde C++
MóduloAdministrado
Código fuenteJScript
Compiladorde JScript
MóduloAdministrado
-
Módulo administradoEncabezado PE
Encabezado CLR
Metadatos
Código IL
•Ejecutable Portable
•Versión de CLR requerida•Punto de entrada
•Descripción de tipos definidos en el módulo•Descripción de los tipos a los que hace referencia el módulo
•Código en Lenguaje Intermedio de MS
-
MetadatosElimina la necesidad de encabezadosProporciona ayuda durante la ediciónPermite la serialización para procesamiento remotoPermite al colector de basura determinar los tipos de objetos en memoria
-
Ensambles
Es una combinación de:Uno o mas módulosArchivos de recursos
Es la unidad con que trabaja CLREs la unida mínima de
Seguridad, reuso y versiónArchivo simple o multi archivo
-
Ensambles
MóduloAdministrado
MóduloAdministrado
Archivo derecursos
Compilador o
Encadenador de ensambles
Manifiesto
MóduloAdministrado
MóduloAdministrado
Archivo deRecursos
Ensamble
-
Carga y ejecución•Se carga MSCorLib.dll enel espacio de trabajo
•Se sustituye la dirección dela función _CorExeMain
•Se pasa el control a la instrucción JMP _CorExeMain
•Se ejecuta _CorExeMain•_CorExeMain inicializa CLR•CLR examina el encabezado CLRpara localizar el punto de entrada
•Se compila el IL del método •Se pasa el control al códigogenerado
Ejecutable administrado
Encabezado PE
Sección .text
Sección .idata
Encabezado CLR
IL
Metadatos
JMP _CorExeMain
DLL: MSCorLib.dllFunción: _CorExeMain
Sección Importr
-
Introducción a C#
-
Hola Mundousing System;
namespace HolaMundo{
class Hola{
[STAThread]static void Main(string[] args){
Console.WriteLine("Hola Mundo");}
}}
-
Tipos de datosIntrínsecos
Definidos por el lenguajeDefinidos por el usuarioTipo valor
Su valor está en el stack o como parte de un tipo referenciaLa variable es su dirección
Tipo referenciaSu dirección es tipo valor (está en el stack)Una variable contiene su direcciónSu valor está en el heap
-
Asignación de memoriaStack
x
y
z
Heap
x
y
class Punto{
private double x;private double y;public Punto(double x, double y){
this.x = x;this.y = y;
}}. . .int x, y;Punto z;z = new Punto(x, y);
-
Tipos de datos básicosTipo C# Bytes Tipo .NET Descripciónbyte 1 Byte Sin signo (0-255)
char 1 Char Símbolo Unicode
bool 1 Boolean true o false
sbyte 1 Sbyte Con signo (-128 a 127)
short 2 Int16 Con signo (-32,768 a 32,767)
ushort 2 Uint16 Sin signo (0 a 65,535)
int 4 Int32 Con signo (-2,147,483,647 a 2,147,483,647)
-
Tipos de datos básicosTipo C# Bytes Tipo .NET Descripciónuint 4 Uint32 Sin signo (
-4,294,967,296 a-4,294,967,295
float 4 Single ±1.5*10-45 a ±3.4*1038 con 6.3 dígitos
double 8 Double ±5.0*10-324 a ±1.7*10308 con 16 dígitos
decimal 8 Decimal 28 dígitos en punto fijo
long 8 Int64 -9,223,372,036,854,775,808 a 9,223,372,036,854,775,807
ulong 8 Uint64 El doble del anterior
-
Conversión de tipos básicos
ImplícitaEs automática (short a int)No debe ser posible la pérdida de información
ExplícitaSe requiere cuando pudiera haber pérdida de información (int a short)Se realiza con un operador de molde (cast)
-
Constantes
Se les asigna valor en su declaraciónconst float pi = 3.1416;
No se puede cambiar el valor de una constante
-
Enumeradoresenum dias {
Lunes = 0,Martes = 1,Miercoles =2,Jueves = 3,Viernes = 4,Sabado = 5,Domingo = 6
}
enum dias {Lunes,Martes,Miercoles,Jueves,Viernes,Sabado,Domingo
}
-
Uso de enumeradoresusing System;namespace Enumeradores{
class Enumerador{
enum dias {
Lunes = 0, Martes = 1, Miercoles =2,Jueves = 3, Viernes = 4, Sabado = 5, Domingo = 6
}[STAThread]static void Main(string[] args){
Console.WriteLine("Valor {0} Texto {1}",dias.Viernes.GetHashCode(), dias.Viernes);
}}
}
-
Formas de controlif
if (expresión booleana)postulado1
[elsepostuilado2]
switch
switch (expresion){
case expresionConstante:postulado1salto
. . .[default:
postuladon]}
-
Definición de clases
[atributos] [modificadores de acceso] class identificador [ :claseBase ]{ cuerpo de la clase }
Ejemplo:
public class Punto{
public double x, y;}
-
Modificadores de acceso
publicvisibilidad sin restricción
privatevisibles desde la misma clase
protectedvisibles desde la misma clase y clases derivadas
-
Modificadores de acceso
internalVisibles desde cualquiera de los los miembros del mismo ensamble
protected internalvisibles desde las clases derivadas y desde los miembros del mismo ensamble
staticEl elemento pertenece a la clase, no a los objetos
-
Constructoras
class Punto{
private double x;private double y;public Punto(double x, double y){
this.x = x;this.y = y;
}}
-
Uso de constructora
public class Prueba{
public static void Main(string[] par){
Punto p = new Punto(5.2, 7.3);Console.WriteLine("El punto es: {0}",
p.ToString());}
}
-
Inicializadores
class Punto{
private double x = 0;private double y = 0;. . .
}
1. Se pueden usar expresiones2. La constructora tiene precedencia
sobre los inicializadores
-
Costructores de copiaclass Punto{
private double x;private double y;. . .public Punto(Punto w){
x = w.x;y = w.y;
}}
1. Reciben un argumento delmismo tipo
2. Inicializan las variables miembrocon los valores del argumento
-
Constructores estáticos1. No tiene argumentos2. Se ejecuta automáticamente antes de crear la primera instancia3. Se puede usar para inicializar miembros estáticos
class Punto{
static public Punto origen;public Punto(double x, double y){
this.x = x;this.y = y;
}static Punto(){
origen = new Punto(12.5, 7.2);}
}
-
Destrucción de objetos
Finalize()Es llamado automáticamente cuando el colector de basura destruye el objetoNo se puede invocar explícitamente
Función destructoraSu sintaxis es la misma que en C++Realmente se invoca la función Finalize de la clase base
-
Paso de parámetros
Tipos de valorSe pasan por valorSe usa el modificador ref para que pasen por referenciaSe usa el modificador out cuando se pasa un parámetro sin inicializar
-
Sobrecarga
void funcion(int x);void funcion(string s);void funcion(double z, int x);
-
Propiedadesclass Complejo{
double r, i;public Complejo(double r, double i){
this.r = r;this.i = i;
}public double Real{
get{return r;}set{r = value;}
}
-
HerenciaHerencia simple
public class ListBox : Window
Llamado a funciones de clase basebase.DrawWindow();
Llamado de constructora de clase base
public ListBox(int top, int left, string theContents):base(top, left) // call base constructor
{
-
Polimorfismo
Window
int x;int y;
virtual DrawWindow()
ListBox
string[] text
overrride DrawWindow()
Button
string text
override DrawWindow()
CheckBox
bool status
override DrawWindow()
-
PolimorfismoArreglo de WindowwinArray
ListBox
string[] text
DrawWindow()CheckBox
bool status
DrawWindow()
CheckBox
bool status
DrawWindow()
for (int i = 0;i < 3; i++){
winArray[i].DrawWindow( );}
-
Clases abstractas
Función abstracta
abstract public void DrawWindow( );
Si una clase tiene una función abstracta la clase es abstractaNo se pueden crear objetos de una clase abstractaSi se pueden crear referencias a objetos de clases abstractasLos métodos abstractos se deben definir en todas las clases derivadas
-
La clase ObjectEs la base de todas las clasesContiene las funciones:Método Usado para
Equals() Compara objetosGetHashCode() Calcula un hashGetType() Proporciona tipoToString() Obtiene cadenaFinalize() Finaliza el objetoMemberWiseClone() Crea una copia
-
BoxingPermiten manejar los tipos valor como tipos referenciaint x = 250;Object o = i;
HeapPilaBoxing250x
250
Into
Es implícito.
Ocurre cuando se requiere que un tipo valorse convierta en un tipo referencia (llamado a funciones)
-
Unboxing
Debe hacerse de manera explícita
int k = (int)o;
HeapPila
250250
IntUnboxing
k
o
-
Sobrecarga de operadoresDebe hacerse con funciones estáticas
públicas
public static Complejo operator+(Complejo w, Complejo z){
return new Complejo(w.r + z.r, w.i + z.i);}public override string ToString(){
return "(" + r + ", " + i + ")"; }
-
Operadores de conversiónExplícito
public static explicit operator double(Complejo z){
return z.r;}Implícito
public static implicit operator Complejo(double z){
return new Complejo(z, 0);}
-
Structs
Implicitamente derivan de ObjectNo soportan herencia
No pueden heredar de otras claseNo se pueden usar como base
No constructora por omisiónNo destructoraNo inicializadoresSon tipos valor
-
Interfaces
Una clase que deriva de una interfaz se compromete a implementar sus:
MétodosPropiedadesEventosIndicadores (Indexers)
-
Declaración de interfaces
[atributos] [modificadores de acceso] interface nombre_interfaz[: lista_base]{cuerpo de la interfaz}
interface IStorable{
// no access modifiers, methods are public// no implementationvoid Read( );void Write(object obj);int Status { get; set; }
}
-
Uso de la interfaz
static void InvocaInterfaz(IStorable o){
o.Status = 2;o.Read();o.Write(o);
}
-
Interfaces
Una interfaz puede heredar de otraUna clase puede heredar varias interfacesUso deo operador is
-
Operadores is y asisif (doc is IStorable)
{IStorable isDoc = (IStorable) doc;isDoc.Read();
}
asIStorable isNote = theNote as IStorable;
if (isNote != null){
isNote.Read( );isNote.Write( );
}
-
ArreglosUnidimensional
int[] pesos = new int[8] {52, 85, 67, 49, 71, 96, 55, 61};for (i = 0; i < 8; i++)
Console.Write("{0}\t", pesos[i]);
Clausula foreach
foreach(int k in pesos)Console.Write("{0}\t", k);
-
Arreglos rectangularesstatic void ArreglosRectangulares(){
Console.WriteLine("ArregloRectangular");int[,] x = new int[, ] {
{12, 16, 25},{11, 21, 17},{7, 15, 21},{12, 34, 85}};
Console.WriteLine("Length {0}", x.GetLength(0));for (int i = 0; i < x.GetLength(0); i++){
for (int j=0; j < x.GetLength(1); j++)Console.Write("\t{0}", x[i,j]);
Console.WriteLine();}
}
-
Arreglos dentadosstatic void ArreglosDentados(){
Console.WriteLine("ArregloDentados");int[][] x;x = new int[4][];x[0] = new int[] {11, 12};x[1] = new int[] {1, 2, 3, 4, 5};x[2] = new int[] {56, 43, 56, 33};x[3] = new int[] {12};for (int i = 0; i < x.Length; i++){
for (int j=0; j < x[i].Length; j++)Console.Write("\t{0}", x[i][j]);
Console.WriteLine();}
}
-
Indexerstype this [type argument]{get; set;}
public class ListBoxTest{
string[] strings;public string this[int index] {get {
if (index < 0 || index >= strings.Length) {// handle bad index
}return strings[index];
}set {
// add only through the add methodif (index >= ctr ){
// handle error}else
strings[index] = value;}
}}
-
Interfaces de colecciónInterfaz DescripciónIEnumerable Para usar foreach
ICollection Implementado por colecciones
IComparer Para poder ordenar la colección
IList Para usar colecciones tipo arreglo
IDictionary Colecciones llave-valor
IDictionaryEnumerator Combina IDictionary con IEnumerator
-
IEnumerableUna clase que implementa IEnumerable puede ser usada en el ciclo foreach
ListBox:IEnumerable ListBoxEnumerator:IEnumerator
IEnumerator GetEnumerator()bool MoveNext()
void Reset()object Current{get;}
-
ICollection : IEnumerable
IEnumerable
void CopyTo(Array array, int index)int Count {get;}
bool IsSincronized{get;}object SyncRoot {get;}
-
ArrayListManeja arreglos dinámicosTiene una serie de funciones como:
Add()BinarySearch()Clear()IndexOf()Sort()
-
Tarea 1
Implementar una lista ordenada de objetos con las siguientes caracteísticasEl tipo de los objetos podrá ser cualquieraLos objetos almacenados serán del mismo tipoUtilice la interfaz IComparable e IComparer para generalizar la lista
-
String
public sealed class String : IComparable, IClonable, IConvertible
Es una clase inmutable (Nunca cambia su valor)
Interfaz ImplemntaIComparable CompareTo()IClonable Clone()IConvertible ToInt32(), ToDouble(),...
-
StringBuilder
public sealed class StringBuilder : IComparable, IClonable, IConvertible
Es una clase mutable (Cambia su valor)
-
Excepciones
Errores de código (bugs) Pueden provocar excepciones pero no lo son
Errores provocados por el usuarioSe evitan con validación
ExcepcionesCondiciones anormalesSe puede tomar alguna medida correctiva
-
Excepciones
Cuando ocurre alguan situación anormal
Se lanza una excepción (throw)Se busca hacia atrás en el stack un manejador apropiado de la excepciónEl manejador de excepción se implementa con catchSi no se encuentra ninguna CLR termina el programa
-
Instrucción throw
throw new System.Exception();
Enter Main...Enter Func1...Enter Func2...
Excepción no controlada: System.Exception: Se inició una excepción de tipo Systm.Exception.at Excepcion.Test.Func2() in c:\documents and settings\hugo\mis documentos\
itroduccionalaprogramacion\ejemplos\excepcion\class1.cs:line 28at Excepcion.Test.Func1() in c:\documents and settings\hugo\mis documentos\
itroduccionalaprogramacion\ejemplos\excepcion\class1.cs:line 21at Excepcion.Test.Main() in c:\documents and settings\hugo\mis documentos\in
roduccionalaprogramacion\ejemplos\excepcion\class1.cs:line 13Press any key to continue
-
Atrapando excepciones
try{
Console.WriteLine("Entering try block...");Func2();Console.WriteLine("Exiting try block...");
}catch{
Console.WriteLine("Exception caught and handled.");
}
-
Excepciones específicastry {
double a = 5;double b = 0; Console.WriteLine ("{0} / {1} = {2}",
a, b, DoDivide(a,b));}// most derived exception type firstcatch (System.DivideByZeroException) {
Console.WriteLine("DivideByZeroException caught!");}catch (System.ArithmeticException) {
Console.WriteLine("ArithmeticException caught!");}// generic exception type lastcatch {
Console.WriteLine("Unknown exception caught");} finally {
Console.WriteLine ("Close file here.");}
-
Clase Exception
Propiedad ComentarioHelpLink Vinculo de ayudaInnerException Instancia que provocó la excepciónMessage Descripción de la excepciónSource Nombre de la aplicaciónStackTrace Rastro del stackTargetSite Metodo que inició la excepción
-
Excepciones de usuarioDeben derivarse de System.ApplicationException
public class MyCustomException : System.ApplicationException
{public MyCustomException(string message):
base(message){
}}
-
RelanzamientoOcurre cuando dentro del catch se lanza otra exepción
try{
DangerousFunc3( );}catch (System.DivideByZeroException e){
Exception ex =new Exception("E2 - Func2 caught divide by zero",e);
throw ex;}
-
Delegados y eventos
-
Delegadospublic delegate bool Mayor(Object o1, Object o2);
Declaración:
private Mayor MayorDelegada;public Lista(Mayor delegada) : base(null, null){
MayorDelegada = delegada;}
Definición:
Uso:MayorDelegada(x, n.siguiente.e)
Definición:public static bool Mayor(Object p1, Object p2){
return String.Compare(((Perro)p1).Nombre, ((Perro)p2).Nombre) > 0;
}public static readonly Lista.Mayor DelegadoMayor =
new Lista.Mayor(Mayor);
-
Delegados propiedadespublic static bool Mayor(Persona p1, Persona p2){
return p1.edad > p2.edad;}public static Lista.Mayor DelegadoMayor{
get{
return new Lista.Mayor(Mayor);}
}En main
Lista p = new Lista(Persona.DelegadoMayor);
-
Arreglos de delegadosPermiten establecer un conjunto de operaciones que se deben ejecutar en un cierto orden
Las opercione
-
Multicasting
Un delegado acepta multiples suscriptoresEs posible utilizar los operadores += y -= para agregar y eliminar suscriptoresLos suscriptores se invocan en el orden en que se realizaron las suscripciones
-
EventosManeja el paradigma publicador –suscriptorClase publicador
Define un delegado con el atributo event
-
EventosEventArgsDisplayClock (Suscriptor)
TimeInfoEventArgs void Suscribe(Clock);void TimeHasChanged(Clock,
TimeInfoEventArgs)int hour, minute, second
TimeInfoEventArgs()
Clock (Publicador)int hour, minute, second
delegate SecondChangeHandler(Object,TimeInfoEventArgs)
event SecondChangeHandler OnChangevoid Run()
LogClock (Suscriptor)void Suscribe(Clock);void WriteLogEntry(Clock,
TimeInfoEventArgs)
int main(){
Clock cl = new Clock;DisplayClock dc = new DisplayClock();dc.Subscribe(theClock);LogCurrentTime lct = new LogCurrentTime();lct.Subscribe(theClock);theClock.Run();
}
-
ADO.Net
-
Características
Soporte de XMLAcceso sin conexiónMejor control en actualizacionesIntegrado totalmente en NET Framework
-
Proveedores .NET
OLE DB .NET ProviderManeja todas las fuentes con proveedores OLE DBOracle, SQL Server,
SQL Client Data ProviderOptimizado para SQL Server
-
Clases conectadas y deconectadas
Connection
Transaction
DataAdapter
Command
Parameter
DataReader
Objetos Conectados Objetos Desconectados
DataSet
DataTable DataView
DataRow
DataColumn
Constraint
DataRelation
-
ConnectionOleDbConnection
ConnectionStringConnectionTimeoutDatabaseDataSourceProviderServerVersionSiteState
Open()Close()CreateCommand()BeginTransaction()
-
Connection
Cadena de conexiónServidorUsuarioContraseña
Establece la conexión con la base de datos
SqlConnection connection = new SqlConnection("Data Source =calipso;Initial Catalog=Escolar; user id=Cynthia");
-
CommandOleDbCommand
CommandTextCommandTimeoutCommandTypeConnectionContainerDesignTimeVisibleParametersTransaction
ExecuteReader()ExecuteNonQuery()ExecuteScalar()
-
Command
Comandos de SQL en propiedad TextConsultaLlamado a un procedimiento catalogadoActualización
string SqlText = "Select matricula, nombre, estado from Alumno";SqlCommand comando =
new SqlCommand(SqlText, connection);
-
DataAdapterActua como puente entre la base de datos y los objetos desconectadosOperaciones
Fill llena un DataSet con informaciónUpdate actualiza la base de datos
PropiedadesSelectCommandInsertCommandDeleteCommandUpdateCommand
SqlDataAdapter adapter = new SqlDataAdapter(comando);DataSet ds = new DataSet("Alumnos");
-
DataReader
Está diseñado para recorrer hacia adelante un conjunto de registrosNo permite actualización
connection.Open();Console.WriteLine("Prueba de DataReader .............");SqlDataReader dr = comando.ExecuteReader();while (dr.Read())
Console.WriteLine(dr[“nombre”].ToString());
-
DataTable
DataTable
ColumnsRows
DataColumn
ColumnNameDataTypeDefaultValueMaxLength
DataColumn
ColumnNameDataTypeDefaultValueMaxLength
DataColumn
ColumnNameDataTypeDefaultValueMaxLength
DataRow
ItemRowStateBeginEdit()EndEdit()
-
Transaction
Agrupa un conjunto de operaciones sobre la base de datos en una transacciónMétodos
BeginCommitRollback
-
Parameter ObjectSe utiliza para proporcionar los parámetros de una consultaPropiedades
ParameterNameValueDbTypePrecision, Scale, Size
-
DataColumn ObjectContiene la descripción de una columna
NombreTipo de datoSi admite valores nulosAutoincremento
table = ds.Tables["Alumno"];foreach (DataColumn dc in table.Columns)
Console.WriteLine("{0}, {1}", dc.ColumnName.ToString(), dc.DataType.ToString());
-
Constraint ObjectEs una colección de DataTableContiene reglas de integridad
PrimaryKeyForeignKeyUnique
DataTable
ConstraintsPrimaryKey
ForeignKeyConstraint
DataColumnDataColumn
DataColumn
UniqueConstraint{
-
ForeignKeyConstraintUso de Reglas DescripciónAcceptRejectRule Cuando se aceptan las
modificacionesDeleteRule Se aplica al eliminar un renglón
UpdateRule Se aplica al actualizar un renglón
Regla DescripciónCascade Elimina o actualiza las filas
afectadasSetNull Establece los valores de la relación
en nulosSetDefault Establece los valores relacionados
por defectoNone No hacer nada
-
DataRow ObjectEs una colección de DataTable
foreach(DataRow row in table.Rows){
string coma = "";foreach(Object ob in row.ItemArray){
Console.Write("{1}{0}", ob.ToString(), coma);coma = ", ";
}Console.WriteLine("");
}
-
DataSet ObjectContiene una colección TablesGetChanges()
Genera un DataSet con los cambiosMerge()
Genera un DataSet a partir de dos
-
DataSet
DataSet
DataSetNameTablesRelations
DataTable
DataRelation
DataTableDataTable
DataRelationDataRelation
-
DataRelation ObjectUn DataSet Contiene la colección RelationsCada DataRelation establece la relación entre dos tablasFacilitan la presentaciónFacilitan la actualizaciónSon dinámicasPermiten relacionar tablas de diferentes fuentes
-
DataRelation
DataRelation
ParentColumnsChildColumns
DataColumnDataColumn
DataColumn
DataColumnDataColumn
DataColumn
-
DataView Object
OrdenamientoFiltrado de informaciónSe pueden definir varios DataView sobre la misma tabla
-
Versión de una fila
Constante Valor DescripciónCurrent 512 Valor actual de la columnaOriginal 256 Valor original almacenado en la columnaProposed 1024 Valor propuesto antes de confirmaciónDefault 1536 Acción por defecto
-
Estado de las filasValor Valor DescripciónUnchanged 2 No ha habido cambios
Detached 1 La fila no pertenece a la base de datos
Added 4 La fila no existe en la base de datos
Modified 16 Hay cambios pendientes
Deleted 8 Pendiente de ser eliminado
-
Ejemplo del estadoEjemplo Estadorow = pedidos.NewRowrow[“pedidoId”] = 25
Detached
pedidos.Rows.Add(row) Added
row = pedidos.Rows[0] Unchanged
row[“fecha”] = “03/06”03” Modified
row.Delete() Deleted
-
Actualización
DataAdapter
UpdateCommand
SelectCommandCommand Text
Command Text
nomNewemplIdOldversionOldUpdateRowSource Comentarios
Both (por defecto) Primera fila y parámetros de salida
FirstReturnedRecord Datos de la primera fila devuelta
None Se omiten filas y parámetros devueltos
OutputParameters Se usan los parámetros de salida
Parameters
Update empl set nom = @nomwhere emplId = @emplId and version = @version
-
Texto para Update
UPDATE pedido SET pedidoId = ?, fecha = ?, emplId = ? WHERE (pedidoId = ?) AND (emplId = ? OR ? IS NULL AND emplId IS NULL) AND (fecha = ? OR ? IS NULL AND fecha IS NULL) AND (version = ? OR ? IS NULL AND version IS NULL);
SELECT version, pedidoId, fecha, emplIdFROM pedido WHERE (pedidoId = ?)";
-
Texto para Insert
INSERT INTO detalle(version, pedidoId, articId, cant) VALUES (?, ?, ?, ?);
SELECT version, pedidoId, articId, cant FROM detalle WHERE (articId = ?) AND (pedidoId = ?)";
-
Texto para Delete
DELETE FROM detalle WHERE (articId = ?) AND (pedidoId = ?) AND (cant = ? OR ? IS NULL AND cant IS NULL) AND (version = ? OR ? IS NULL AND version IS NULL)";
-
Uso de timestamp
DataAdapter
UpdateCommand
SelectCommand
SELECT version, emplId, nom from empl
Update empl set nom = ? where emplId = ? and version = ?
nomNewemplIdOldversionOld
Parameters
InsertCommand
Insert empl values (NULL, ?, ?)
Delete emplwhere emplId = ? and version = ?
DeleteCommand
nomNewemplIdNew
emplIdOldversionOld
-
Procedimientos catalogados
Select
create procedure spSelectDetalle @pedidoId smallintasSelect Detalle.version, detalle.pedidoId, detalle.ArticId,
detalle.cant, artic.descrfrom detalle
inner join artic on artic.articId = detalle.articIdwhere pedidoId = @pedidoId
-
Procedimientos catalogados
Insert
Create procedure spInsertDetalle@pedidoId_nue smallint,@articId_nue smallint,@cant_nue decimal(6, 2)
asInsert Detalle values (null, @pedidoId_nue,
@articId_nue, @cant_nue)
-
Recuperación de valores
Los campos identity se generan cuando se inserta un nuevo renglónLos campos timestamp se modifican automáticamente cuando se modifica un renglón de una tablaCampos que se encuentran en otra tabla
-
Proc Updatecreate procedure spUpdateDetalleRec@cant_nue decimal(6, 2),@pedidoId_ant smallint,@articId_ant smallint,@version_ant timestamp,@pedidoId_nue smallint,@articId_nue smallintasUpdate Detalle set cant = @cant_nue, pedidoId = @pedidoId_nue,
articId = @articId_nuewhere pedidoId = @pedidoId_ant and articId = @articId_ant
and version = @version_ant;Select Detalle.version, detalle.pedidoId, detalle.ArticId,
detalle.cant, artic.descrfrom detalle inner join artic on artic.articId = detalle.articIdwhere pedidoId = @pedidoId_nue and artic.articId = @articId_nue
-
Proc Insert
Create procedure spInsertDetalleRec@pedidoId_nue smallint,@articId_nue smallint,@cant_nue decimal(6, 2)asInsert Detalle values (null, @pedidoId_nue, @articId_nue, @cant_nue);Select Detalle.version, detalle.pedidoId, detalle.ArticId,
detalle.cant, artic.descrfrom detalle inner join artic on artic.articId = detalle.articIdwhere pedidoId = @pedidoId_nue and artic.articId = @articId_nue
-
CurrencyManager
Control Ligado
CurrencyManagerControl Ligado
Origende
datos
CurrencyManagerControl LigadoOrigen
de datos
Formularioo
contenedorBindingContext
controla
controla
-
Conjuntos de datoscon tipos
Contienen la descripción de tablas y columnasFacilitan el desarrollo de las aplicacionesEvitan el uso índices de cadenasEvitan errores en tiempos de ejecuciónTienen representación en XMLSon intercambiables con XML
-
Crear un conjunto de datos con tipos
En un proyecto con una forma se agrega uno o varios DataAdapters
Se configura la conexiónSe configuran los comandos
A partir de un DataAdapterSe crea el DataSet con todos los orígenes de datos necesariosSe crean las relaciones
Conviene cambiar los nombres generados
-
AtributosAgregan metadatos a los componentes de un ensambleLos atributos se pueden aplicar a:
ClasesMétodosEnumeradoresEventosInterfacesParámetrosetc.
-
Aplicar un atributo[BugFixAttribute(121,"Jesse Liberty","01/03/05")][BugFixAttribute(107,"Jesse Liberty","01/04/05",
Comment="Fixed off by one errors")]public class MyMath{...
[BugFixAttribute(121,"Jesse Liberty","01/03/05"),BugFixAttribute(107,"Jesse Liberty","01/04/05",
Comment="Fixed off by one errors")]public class MyMath{...
-
Definición de atributosSystem.Attribute
El nombre debe terminar con “Attribute”,al aplicarlo se puede omitir “Attribute”
•Los parámetros posicionales se definenen la constructora
•Los parámetros por llave se definen comopropiedades
BugFixAttribute
BugFixAttribute(bugId, programmer, date)public static Comment{
get
-
Sujetos de los atributos[AttributeUsage(AttributeTargets.Class |
AttributeTargets.Constructor |AttributeTargets.Field |AttributeTargets.Method |AttributeTargets.Property,AllowMultiple = true)]
public class BugFixAttribute : System.Attribute
•Se definene mediante el atributo AttributeUsage•Su primer parámetro es un conjunto de flags tomados del enum AttributeTarget•El segundo parámetro indica si el Atributo se puede aplicar en forma múltiple
-
Reflexión
Permiten obtener información de un ensamble
Tipos de datosClases y funcionesInterfacesTipos valor
-
MetadatosDescriben los tipos de datos (clases)
Sus atributos y mètodosPermite combinar módulos en diferentes lenguajesPosibilit que el colector de baura localizar los objetos activosPermite proporcionar ayuda durante la ediciónSe utiliza en la serialización (disco, net)
-
Reflexión
Permite que los componentes desarrollados por el usuario puedan
Incorporarse en la barra de herramientasEl IDE podrá desplegar su ventana de propiedades
Un método puede alterar su comportamiento dependiendo del objeto que lo llamó
-
Usos de reflexión
Es posible crear dinámicamente una instancia de una claseA un objeto existente se le puede asociar un tipoSe pueden invocar los métodos y propiedades del objeto
-
Clases de ReflectionAssembly Define y carga ensables
GetModules regresa una colección de módulos
Proporciona información de un móduloGetTypes() regresa una colección de las clases (Type)Module
Type Proporciona la información de los tiposGetMembers() regresa una colecciónde MemberInfo
MemberInfo Proporciona información de los datos miembros, funciones, enumeradores, etc.
-
Enlazado tardío
Una vez descubierto un método es posible invocarlo usando reflexión
Obtener la clase que contiene la funciónUtilizar el método Activator.CreateInstance para crear una instancia de la clase
-
Métodos estáticosType
mathType(Type)
GetType()
cosMethoth(MethodInfo)
GuetMethod()
Invoke()
Type.GetType("System.Math");
-
Métodos de instanciaAssembly
asm(Assembly)
LoadFrom()
someType(Type)
GuetType()
Invoke()
miMetodo(MethodInfo)
GetMethod()
-
Procesamiento Remoto
-
Carga de CLR
Se carga como un componente COMCrea un dominio de aplicaciónCrea el Heap administradoCrea un depósito de hilos de ejecución
-
Dominio de aplicación
Proceso Windows
Motor de ejecución, colector de basura, depósito de hilos
Ensambles de dominio neutoHeap
Tipo m1 m2
Tipo m1 m2AssemblyMS Core
Dominio de aplicación 1
HeapTipo m1 m2
Tipo m1 m2
AssemblyApp 1
Dominio de aplicación 2
HeapTipo m1 m2
Tipo m1 m2AssemblyOtra AppAssembly
App 2
-
Dominios de aplicación
AisladosLos objetos no se ven
Pueden descargarseConfigurables individualmente
SeguridadSe pueden crear y descargar conAppDomain.CreateDomain(“nombre”)AppDomain.Unload(domain)
-
Dominio de aplicación
using System; using System.Reflection; class AppDomain3 {
public static void Main() {//Create the new application domain. AppDomain domain = AppDomain.CreateDomain("MyDomain", null); //Output to the console. Console.WriteLine("Host domain: " +
AppDomain.CurrentDomain.FriendlyName); Console.WriteLine("new domain: " + domain.FriendlyName); Console.WriteLine("Application base is: " +
domain.BaseDirectory); Console.WriteLine("Relative search path is: " +
domain.RelativeSearchPath); Console.WriteLine("Shadow copy files is set to: " +
domain.ShadowCopyFiles); AppDomain.Unload(domain); }
}
-
MarshalingBy value By value
Cliente
Proxi Servidor
Objeto
Receptor
ClienteCopia
delobjeto
Servidor
Objeto
-
Hilos de ejecución
Dominio de aplicación 1 Dominio de aplicación 1
Hilo de ejecución
-
Descarga de un dominio
Se lanza ThreadAbortExceptinSe pueden atrapar fuera del dominio
Se invalidan todos los ProxisCualquier llamado a un objeto del dominio provoca AppDommainUnloadedException
-
Aplicaciones Consola o Windows
CLR carga el COM adecuado según el encabezado del ensambleSe determina el punto de entrada (Main)Se invoca al métodoCuando se hace referencia a otro ensamble este se cargaAl terminar Main se descarga el Dominio de aplicación y se termina el proceso
-
Contextos
Dominio de aplicación
Contexto 1 Contexto 2
Objeto 1 Objeto 2Marshaling
-
Tipo de Objetos
Objetos ÁgilesSe ejecutan en el contexto del clienteNo se usa marshaling
Objetos LigadosSi se invocan desde otro contexto se usará marshaling
-
Objetos ligados y ágiles
Objeto C(ligado)
Objeto B(ágil) Database
Objeto A(ligado con soporte de
transacciones)
-
Objetos ligados y ágiles
Objeto C(ligado)
Objeto B(ligado) Database
Objeto A(ligado con soporte de
transacciones)
Creación
-
Definición del contextoDefinición Tipo de objeto ComentarioSin atributos Ágil Opera en el contexto
que invoca
Derivado deContextBoundObjectsin atributos
Ligado Se ejecuta en el contexto de su creador
Con atributos Ligado Se ejecuta en su propio contexto
[Serializable] oderivado deMarshalByRefObject
Ágil Se ejecuta en el contexto del que lo invoca
-
Tipos de servidorSingleton(atiende todos losmensajes)
Well known(sin conexión)
Single call(se crea un nuevo objeto por cada llamado)
Servidor
Activado por cliente(con conexión)
-
Servidor con interfaces
Evita el acoplamiento entre el cliente y el servidorIndependiza al cliente de los cambios internos del servidor (mientras no cambie la interfaz)
-
Hilos de ejecución
-
Hilos de ejecuciónSon mas ligeras que un procesoPueden existir varios hilos de ejecución de una misma aplicación en un procesoPueden intercatuar entre síUsos típicos
Realizar un proceso largo y permitir que el usuario continue interactuando con la aplicaciónEn los servidores se pueden crear tareas para atender en forma indivudual varias solicitudes de servicios.
-
Creación de una hilo de ejecución
public delegate void ThreadStart()
Thread
objeto
new ThreadStart(f)
new Trhead(delegate)
delegate
Start()
-
Espera de Hilos
Threadobjeto
Start()
Join()
-
Suspensión de hilos
Threadobjeto
Start()
Interrupt()
catch(ThreadInterruptException e)
-
Sincronización
Hilo A Recurso Hilo B
Solicita Información
Solicita Información
Actualiza Información
Actualiza Información
-
Uso de Interlocked
Hilo A Hilo BRecurso comprtido
int = 0
Interlocked.Increment()
1
Interlocked.Increment()
Espera
2
-
Instrucción lock
lock (this){
int temp = counter;temp++;...counter = temp;
}
Para funciones de instancia normalmente se usa thisPara funciones estáticas typeof(clase)
-
MonitoresHilo A Monitor Hilo B
Enter()
Wait()
Enter()
Espera()
Pulse()
Exit()Exit()
-
Componentes
-
Uso de componentesReutilización del códigoUtilización del concepto de capas
Interfaz de usuarioReglas del negocioBase de datos
Facilita la distribución de las aplicaciones
-
Componentes
Componente
System.ComponentModel.
Component
Componente
IComponent
-
Inicialización de componentes
Inicialización de Clase
Mediante una constructora estática
class ADrawing { static Font m_referenceFont = new Font("TimesNewRoman", 14); // Simply add the static keyword to create a static constructor. // Static constructors do not have any parameters. static ADrawing() {
// There is no call to the base class's static constructor. // Code to initialize the font here.
} }
-
Inicialización de instancia
class AShape { private int m_answer = 42; // Forward to another constructor. public AShape() :
this(System.Drawing.Color.Red, 5280, DefinedSizes.Large) {
// Additional initialization goes here. } public AShape(Color color, int length, DefinedSizes size) {
// Code to initialize the class goes here. }
}
-
Disposición de recursos
public override void Dispose() {
mywidget.Dispose(); mywidget = null; // Dispose of remaining objects.
}
-
ASP.NET
-
HTML
Es un lenguaje de marcado de textoUtiliza http (Hyper Text TransferProtocol)Se puede compartir información en diferentes plataformasUtiliza eficientemente en ancho de bandaEs difícil manejar contenido dinámico
-
CGI (Common Getway Interphase)
Son programas ejecutables el el servidor WebEscriben texto Html en su salida estandarTienen capacidad
Acceso a base de datosAcceso al registro del sistema
Se puede usar cualquier lenguaje de programación (Perl, Delphi, C, C++, etc)Se coloca el ejecutable en el directorio adecuado
-
CGIC:\Inetpub\wwwroot\DirApp\Prog.exe
#include "stdafx.h"#include
int main(int argc, char* argv[]){
printf("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n");printf("\r\n");printf("Hola Mundo CGI\r\n");printf("\r\nHola Mundo CGI");printf("
\r\n\r\n");printf("\r\n");return 0;}
-
Limitacions de CGI
Cada solicitud se crea un nuevo proceso en la memoria del servidorAl terminar su trabajo el programa se descargaNo es posible tener escalabilidad de las aplicaciones
-
ISAPI (Internet Server ApplicationProgram Interface)
Utiliza DLL’s en vez de ejecutablesSe manejan dos tipos de DLL’s
Extensiones ISAPISe invocan en una URLPueden tener parámetros
Filtros ISAPINo se invocan directamente179Los invoca ISAPI para atender eventosUsos
Autenticación de clientesModificación del HTML que se envía a los clientes
-
ISAPIC:\Inetpub\wwwroot\SayHelloISAPI\SayHelloISAPI.dll
-
ISAPIPuntos de entrada de la dll
GetExtensionVersionHTTPExtensionProc
FuncionesStartContent
Escribe las etiquetas y WriteTitle
Invoca a GetTitle y genera Y EndContent
Genera etiquetas y Default
Invoca a las anteriores y genera el texto visible
-
ISAPIVentajas
El código se carga una sola vez para atender a todas las peticionesSe ejecuta en el espacio de IISSe pueden cargar en otro espacio de direccionesPueden recibir parámetros para realizar diferentes funciones
DesventajasEs difícil independizar el código del diseño
-
ASP (Active Server Pages)
Se basa en ISAPI para convertir secuencias de comandos en HTMLIIS mantiene una lista de las dll’s que atienden las peticiones de acuerdo a su extensiónLas páginas contienen
Texto HTMLTexto VBScript, JavaScript o C#
-
ASPVentajas
Facilita la creación dinámica de páginasSe tiene acceso a bases de datos (ADO)Simplifica el ciclo de desarrollo
DesventajasDificulta separar la presentación de la lógica de procesamientoHay un cambio de contexto cada vez que se entra a una sección de comandos
-
ASP:NET
-
ASP.NET
Es un nuevo productoPermite utilizar las capacidades de los desarrolladoresEntorno de ejecución de .NETUso de lenguajes compiladosUso de componentes .NETFormularios WebUtilización de ADO.NET
-
ASP.NET
Las páginas son generadas dinámicamente en el servidorSe crean páginas con el contenido estático y con C# se genera el contenido dinámico
-
Generación Dinámica
Servidor
HTMLestático
Código C#
Páginagenerada
Cliente
-
Desarrollo de ASP.NETEdición
Prueba
Compilación
-
Aplicación Web
WebForm.aspx.csWebForm.aspx
WebForm1
-
Manejo de eventos
Los controles provocan eventosLos eventos son manejados por delegados
Regresan voidTienen dos argumentos
El objeto que provocó el eventoUn derivado de EventArgs
Se ejecutan en el servidor (viaje redondo)
-
Postback
Eventos PostbackLa forma es enviada al servidorTipicamente click en un botón
Eventos no PostbackSon atendidos hasta que ocurre un evento PostbackSe pueden forzar a Postback
-
Estado
Las aplicaciones Web son sin estadoASP.NET proporciona mecanismos para preservar el estadoEs posible preservar el estado de los controles en un viaje redondo al servidor
-
Ciclo de vida
InitializeSe realizan la inicializaciones necesarias
Load View StateSe define la propiedad ViewState de los controles. Permite la persistencia de la información
Process Postback DataLos datos enviados por el cliente son procesados en el servidor
-
Ciclo de vidaLoad
Se crean e inicializan los controlesEl estado es restaurado
Send Postback Change ModificationSi hay cambios de estado se invoca la función RaisePostDataChangeEvent()
Handle Postback EventSe atiende el evento que provocó el cliente
-
Ciclo de vidaPreRender
Se produce justo antes de desplegar la página en el cliente
Save StateSe salva el estado de los controles
RenderSe atiende cuando la página es enviada al cliente
DisposeLimpieza final
-
Estado de Aplicación
System.Web.UI.Page
ApplicationSession
•Application y Session son coleccionesde objetos
•Los objetos de Application se comparten por todas las sesiones de la misma apli-cación.
•Los objetos almacenados en Session sehacen persistentes para la sesión.
-
Servicios Web XML
Son componentes de software que proporcionan servicios a través de la WebUtilizan XMLDeben ser compatibles con SOAP (Simple Object Access Protocol)
-
Manejadores y módulos HTTP
Son similares a extesniones y filtros ISAPISe utilizan
Cuando se requiere alto rendimientoSe requiere la flexibilidad de filtros y estensiones
InteroperabilidadLa naturaleza del problemaAplicaciones IndependientesArquitectura de aplicaciones integradasArquitectura IntegradaHardwareMidleware en el principioInternetRPC’sAcceso a base de datosProceso remoto de SQLProcedimientos catalogadosRequerimientos EmpresarialesMiddleware de componentesTransaccionalesArquitectura de tres capascon COM+Contenedor COM+Introducción a .Net.NET FrameworkPorque .NetPorque .NetPorque .NetCompiladoresMódulo administradoMetadatosEnsamblesEnsamblesCarga y ejecuciónIntroducción a C#Hola MundoTipos de datosAsignación de memoriaTipos de datos básicosTipos de datos básicosConversión de tipos básicosConstantesEnumeradoresUso de enumeradoresFormas de controlDefinición de clasesModificadores de accesoModificadores de accesoConstructorasUso de constructoraInicializadoresCostructores de copiaConstructores estáticosDestrucción de objetosPaso de parámetrosSobrecargaPropiedadesHerenciaPolimorfismoPolimorfismoClases abstractasLa clase ObjectBoxingUnboxingSobrecarga de operadoresOperadores de conversiónStructsInterfacesDeclaración de interfacesUso de la interfazInterfacesOperadores is y asArreglosArreglos rectangularesArreglos dentadosIndexersInterfaces de colecciónIEnumerableICollection : IEnumerableArrayListTarea 1StringStringBuilderExcepcionesExcepcionesInstrucción throwAtrapando excepcionesExcepciones específicasClase ExceptionExcepciones de usuarioRelanzamientoDelegados y eventosDelegadosDelegados propiedadesArreglos de delegadosMulticastingEventosEventosADO.NetCaracterísticasProveedores .NETClases conectadas y deconectadasConnectionConnectionCommandCommandDataAdapterDataReaderDataTableTransactionParameter ObjectDataColumn ObjectConstraint ObjectForeignKeyConstraintDataRow ObjectDataSet ObjectDataRelation ObjectDataRelationDataView ObjectVersión de una filaEstado de las filasEjemplo del estadoActualizaciónTexto para UpdateTexto para InsertTexto para DeleteUso de timestampProcedimientos catalogadosProcedimientos catalogadosRecuperación de valoresProc UpdateProc InsertCurrencyManagerConjuntos de datoscon tiposCrear un conjunto de datos con tiposAtributosAplicar un atributoDefinición de atributosSujetos de los atributosReflexiónMetadatosReflexiónUsos de reflexiónClases de ReflectionEnlazado tardíoMétodos estáticosProcesamiento RemotoCarga de CLRDominio de aplicaciónDominios de aplicaciónDominio de aplicaciónMarshalingHilos de ejecuciónDescarga de un dominioAplicaciones Consola o WindowsContextosTipo de ObjetosObjetos ligados y ágilesDefinición del contextoTipos de servidorServidor con interfacesHilos de ejecuciónHilos de ejecuciónCreación de una hilo de ejecuciónEspera de HilosSuspensión de hilosSincronizaciónUso de InterlockedInstrucción lockMonitoresComponentesUso de componentesComponentesInicialización de componentesInicialización de instanciaDisposición de recursosASP.NETHTMLCGI (Common Getway Interphase)CGILimitacions de CGIISAPI (Internet Server Application Program Interface)ISAPIISAPIISAPIASP (Active Server Pages)ASPASP:NETASP.NETASP.NETGeneración DinámicaDesarrollo de ASP.NETAplicación WebManejo de eventosPostbackEstadoCiclo de vidaCiclo de vidaCiclo de vidaEstado de AplicaciónServicios Web XMLManejadores y módulos HTTP