Upload
others
View
5
Download
0
Embed Size (px)
Citation preview
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