Vous êtes sur la page 1sur 60

Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .

NET Framework • Windows Server System

dotNetManía
www.dotnetmania.com
nº3 abril 2004 • Precio: 6,00 € (España)
Dedicada a los profesionales de la plataforma .NET

Visual Studio 2005 y SQL Server 2005


Whidbey y Yukon ya tienen nombre

El poder de la reflexión en .NET


Generación de tipos en tiempo de ejecución

Laboratorio
Crystal Enterprise v10
Open Source
datNet
Comunidades
Equivalencia de instrucciones Concurso de creación de páginas Web
con ASP.NET
de C# y VB .NET (y III) •
Configuración de
aplicaciones Web de ASP.NET
• Gestión de concurrencia en
ADO.NET • Introducción a
GDI+ • SQL-Server. Diseñar la
estrategia de copias de
seguridad y restauraciones •
El Señor Arquitecto
opinión
El real valor de las certificaciones del mundo informático (de sus realidades, mitos y proyección)
dnm.editorial
<< dnm.editorial

No en mi nombre
<< Por supuesto, la noticia del mes es el retraso que
sufrirán los lanzamientos de Whidbey y Yukon que
to? ¿Esta Comisión no debería ser más dura con
otros monopolios de hecho que sufrimos los usua-
se trasladan a mediados del 2005 y que saldrán al rios de manera sangrante? ¿Lo han hecho en bene-
mercado conjuntamente bajo los nombres Visual ficio de los usuarios o de los competidores de
Studio 2005 y SQL Server 2005. Algunos usuarios Microsoft? Me consta que los fabricantes de Real
han mostrado su malestar al respecto, puesto que Player, Real Networks están muy satisfechos.
habían pagado por el programa Software Assurance Personalmente a mí me importa poco si Windows
durante tres años sin recibir ninguna actualización lleva o no Windows Media Player, de todas formas
principal a cambio. Luego están los que se preocu- yo uso Winamp, pero un sistema operativo debe
pan por el soporte de las versiones actuales que pue- ser capaz de abrir el máximo tipo de archivos posi-
den terminar de ofrecerse con poca diferencia con ble. ¿Harán lo mismo con los visualizadores de
las versiones nuevas. Otros opinan que lo mejor es otros tipos de archivos? ¿Es mejor para los usua-
que el software salga al mercado cuando realmente rios un sistema operativo incapaz de abrir archi-
esté listo y que esto es mejor aunque haya que espe- vos en aras a que la competencia pueda vender sus
rar algo más. Pero es que todo esto afecta a tantas visores?
cosas que sería mejor que estos chicos de Microsoft No quisiera terminar sin tener un sentido
afinasen más, si bien es cierto, que yo me encuentro recuerdo para las víctimas y sus familiares y ami-
entre los que opinan que los lanzamientos precipi- gos del atentado cometido por seres humanos en
tados para cumplir fechas son a la larga peores para Madrid el 11 de marzo. Extraña palabra la palabra
los usuarios. “humanidad” que suele usarse como aglutinadora
Acabamos de recibir la noticia de la multa de de todos los buenos sentimientos que sólo los
casi 500 millones de euros (la más alta impuesta humanos podemos sentir. Me pregunto si también
hasta ahora por este organismo) que la Comisión debería servir para aglutinar todo lo malo que sólo
Europea ha impuesto a Microsoft por supuesto los humanos podemos hacer. Sólo un humano pue-
abuso de posición dominante en el mercado euro- de ser tan despiadado. ¿Fue, pues, éste un acto de
peo. Ahora se iniciará una nueva, larga y aburrida “humanidad”? Cómo me avergüenza pertenecer a
batalla legal, por supuesto. Esto viene después de la misma especie animal que alguno de mis con-
que Steve Ballmer hiciera un viaje inesperado a géneres. No debemos olvidar tampoco a los muer-
Bruselas, cancelando su keynote en el Summit el tos en Nueva York, en Irak, en Afganistán, en Pales-
miércoles 17, en la que se especulaba que habría tina, en Israel, y en tantos sitios donde mueren ino-
una demo de Indy, para intentar llegar a una sali- centes y no tan inocentes a manos de asesinos lega-
da negociada que finalmente no fue posible. les o ilegales ¿en nombre de quién? Desde luego
¿Tendremos un Windows europeo distinto del res- no en mi nombre.

Editor Charte, Fernando Guerrero, Fernando Imprime


Paco Marín Nogueras, Guillermo ‘guille’ Som, Iván Gráficas Vallehermoso
(paco.marin@dotnetmania.com) González, Jesús López, Jordi Rambla, www.graficasvallehermoso.com
Jorge Serrano, José Manuel Alarcón, Juan
Administración Torres, Liborio López, Luis Miguel Blan-
Pilar Pérez co, Marino Posadas, Miguel Egea, Miguel
(pilar.perez@dotnetmania.com) Katrib, Pablo Abbate, Pedro Gómez, Depósito Legal
Pedro Pozo, Pepe Hevia, Salvador Ramos M-3.075-2004
Asesor Técnico/Coordinación
Marino Posadas Diseño y Maquetación
Suscripciones
(marino.posadas@dotnetmania.com) Éride Diseño Gráfico
Tel.: (34) 91 477 48 85 suscriptores@dotnetmania.com
Publicidad eride@eride.net • www.eride.net
Juan Manuel Urraca Redaccion
<<dotNetManía

(jmurraca@dotnetmania.com) Edita redaccion@dotnetmania.com


Netalia
Redactores y Colaboradores c/ Robledal, 135
Alejandro Mezcua, Angel Esteban, 28529 Rivas-Vaciamadrid (Madrid)
Antonio Quirós, Antonio Rojo, David Tf. (34) 91 6667477 Nuevos colaboradores
Carmona, Eladio Rincón, Francisco Fax (34) 91 4991364 colaboradores@dotnetmania.com

3
El real valor de las certificaciones del mundo informático
dnm.sumario
3 8-10
(de sus realidades, mitos y proyección)
El mundo de las certificaciones IT, casi desde su aparición ha generado
controversia, entusiastas y detractores.

Equivalencia de instrucciones de C# y VB .NET (y III) 11-14


Cómo hacer las mismas cosas (o casi) en C# y Visual Basic .NET
Tercera y última entrega de esta serie de artículos en la que hemos pretendido explicarle
cómo hacer las mismas cosas (o casi) tanto en C# como en Visual Basic .NET

Configuración de aplicaciones Web de ASP.NET 16-19


En versiones anteriores de la tecnología ASP, la configuración de aplicaciones Web
se realizaba de forma muy distinta. En este artículo damos un breve repaso a las
opciones principales de configuración de ASP.NET

Gestión de concurrencia en ADO.NET 20-26


La concurrencia, en un entorno multiusuario, es siempre una cuestión
problemática, pero si además se trata de un entorno desconectado como el que se
usa en ADO.NET con sus DataSets y DataAdapters, la problemática es aún
mayor debido a la propia naturaleza desconectada del entorno.

El poder de la reflexión en .Net 27-34


Este trabajo muestra cómo usando reflection se define un conversor de tipos que
permite a partir de un objeto, el cual comparte una misma funcionalidad con un
dnm.sumario

interface, obtener un objeto proxy equivalente en funcionalidad al original pero


que garantiza ser subtipo de dicha interface.

Introducción a GDI+ 37-42


La llegada de la tecnología .NET ha venido acompañada de GDI+ (Graphics
Device Interface), que como su nombre deja entrever, se trata de la nueva
generación del API gráfico de Windows, adaptado a la plataforma .NET
Framework.

SQL-Server. Diseñar la estrategia de copias de seguridad y restauraciones 43-49


Todos los sistemas necesitan una salvaguarda, pero aquellos que contienen datos
importantes mucho más aún. En una base de datos suele guardarse información
muy viva y casi siempre trascendental para el negocio que sustentan.

El Señor Arquitecto 50-51


Parece que la arquitectura está de moda. ¿A qué se debe toda esa artillería?
¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo
sirve para allanar el camino hacia el combate con nuestro enemigo virtual?

Crystal Enterprise v10 52-53


Business Objects, líder en el área de Business Intelligence, acaba de lanzar las primeras
versiones bajo su égida de los productos Crystal, adquiridos a Crystal Decisions. En este
artículo presentamos Crystal Enterprise 10 [CE10], el hermano mayor de una familia
que también incluye a Crystal Analysis y al ampliamente conocido Crystal Reports.

Biblioteca 54
C# al descubierto de Joseph Mayo.
Arquitectura de aplicaciones para .NET. Diseño de apicaciones y servicios de
Microsoft Press.

Comunidades 55
Concurso de creación de páginas Web con ASP.NET para la comunidad de
desarrolladores de ASP.NET en España

Open Source 56-57


dataNet

Desván 58
ás
dr
en
bt
yo e

n irt
ib s
cu r
7 l inscrama
50
te
es a g
ga to pro
rt e n
En ue o s
sc st r
d e nue
de a
dnm.noticias
<< dnm.noticias

noticias.noticias.noticias.noticias.noticias.noticias
Whidbey y Yukon
ya tienen nombre: Visual Studio 2005
y SQL Server 2005

ta. Ambos productos van a estar estrechamente


integrados, se lanzaron a la vez.
El soporte completo de SQL Server 7 y SQL
Server 2000 termina en el año 2005, por lo que el
retraso en la salida de la nueva versión de SQL
Server, significa que habrá menos tiempo para la
migración. ¿Supone este retraso en la salida de
Yukon, un retraso igual en la fecha tope de sopor-
te de las versiones anteriores? Según el citado Tom
Rizzo, Microsoft está considerando una amplia-
ción de este soporte.
Además, esto puede tener, a nuestro juicio, un
claro efecto dominó. Longhorn, la siguiente ver-
sión de Windows, sufrirá posiblemente un retra-
En el número anterior de dotNetManía ya ade- so en su salida, al igual que puede ocurrir con el
lantábamos como rumor el retraso que sufriría Office 12, la versión de Office para este sistema
Whidbey, según palabras del “padre” de ASP.NET operativo. Hay que tener en cuenta que este sis-
2.0, Scott Guthrie. Pues bien, ya no es un rumor. tema operativo usará a Yukon para gestionar los
El día 10 de marzo, Microsoft hizo público el retra- datos del sistema. Así mismo, las nuevas versiones
so que sufrirán tanto Whidbey como Yukon, que de productos como SharePoint Portal Server,
pasan de estar listos antes de terminar el 2004 a Content Management, Commerce Server depen-
estarlo en el primer semestre de 2005. Fue el den estrechamente de ASP.NET 2.0 e igualmen-
momento para asignarles su nombre comercial: te se pueden ver afectados.
Visual Studio 2005 y SQL Server 2005. Claro que hay fuentes que aseguran que el
Según fuentes de Microsoft, “Microsoft ha retraso es precisamente porque una buena parte
tomado la decisión de retrasar la entrega de estos de los desarrolladores de Yukon están trabajando
productos para poder llegar a ofrecer los altísi- en WinFS, y no sería de extrañar pues la salida de
mos requerimientos que nos han pedido nuestros Longhorn es vital para la compañía y empieza a
clientes”. especularse que podría irse hasta el 2007.
Según Tom Rizzo, Director of Product Oficialmente, Microsoft sólo reconoce el posi-
Management for SQL Server, hemos decidido sacar ble retraso de Orcas que estaría disponible un par
una beta 2 de Yukon y una beta 1 de Whidbey hacia de años después de la salida de Whidbey, según
mediados de 2004 y finalmente una beta 3 de afirma Ari Bixhorn, Visual Studio Lead Product
<<dotNetManía

Yukon para finales de 2004 que no estaba previs- Manager, en una entrevista concedida a eWeek.

6
<< dnm.noticias

Nuevas versiones de Windows


Windows 2003 R2 para 2005
Microsoft ha confirmado su intención de lanzar Windows 2003
R2, una actualización que evolucionará al actual Windows 2003
Server antes de la salida de Longhorn. Se rumorea que posible-
mente aparezca en el verano de 2005.
Estará diseñado para combinar las características de la versión
gold de Windows 2003, Windows 2003 SP1 y los llamados “fea-
ture packs” o actualizaciones que se han ido sirviendo desde su apa-
rición. Aún no tenemos noticias sobre su comercialización, aun-
que esperamos sea una actualización gratuita para los clientes actua-
les de Windows 2003.
El SP1 de Windows 2003 quizá esté disponible para finales de este año.
Una de las posibles mejoras que la nueva versión tenga sea soporte para Indigo así como otras carac-
terísticas del lado del servidor de Longhorn, aún por determinar, e incluirá la nueva versión del .NET
Framework que saldrá el año que viene.
Esto es completamente lógico pues la nueva versión del sistema operativo del servidor aparecerá des-
pués de Longhorn y el actual Windows 2003 tendrá que soportar a los PCs que se conecten con Longhorn
instalado.
Puede obtener más información en la Web de Paul Thurrott’s en http://www.winsupersite.com.

Windows XP SP2 para 2004


Windows XP SP2 es una actualiza-
ción de Windows XP que incluye mejo-
ras de seguridad como el nuevo
Windows Security Center que centrali-
zará la configuración de seguridad y que
incluye incluso protección antivirus; un
nuevo firewall que reemplaza al actual
ICF (Internet Connection Firewall) con
políticas de grupo integradas en el
Active Directory; una nueva versión de
RPC para protección contra ataques en
la red;un bloqueador de popups y un
gestor de descargas en el también nuevo Internet Explorer junto con mejoras de seguridad en el
Outlook Express y en el Windows Messenger; un nuevo Windows Update; una remodelada protec-
ción de memoria para evitar los comunes “overruns”; mejoras de seguridad en el Windows Media
Player; y otros cambios.
La RC1(Release Candidate 1) de Windows XP SP2 ya está disponible y los betatesters registrados
pueden descargarla desde http://www.microsoft.com/sp2preview. Puede obtener más información
en el MSDN en http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnwxp/html/secu-
rityinxpsp2.asp

dnm.noticias
Por Willy Marroquín
Visual Basic MVP
willydev.net

El real valor de las certificaciones


del mundo informático (de sus realidades,
mitos y proyección)

El mundo de las certificaciones IT, casi desde su aparición ha generado controversia, entu-
siastas y detractores. En este escrito, daré una percepción personal a lo que pueda referir de
este tema, así que ¡allí vamos!

<< De sus realidades y de sus mitos podía creer que después de invertir cerca de 500 dóla-
res en una semana de educación técnica (demasiado
Cuando estaba en la universidad, una de las cosas dinero para las economías "latam" en esos días e inclu-
que siempre tuve muy claras era la del hecho de bus- so hoy) y pagar 80 dólares aproximadamente por el
car una certificación IT avalada. Cuando rendí mi pri- examen, alguien vendiera la prueba por 200 dólares
mer examen, hace ya varias líneas de código = ), la ver- aproximadamente (mucho más que para esos días el
dad estaba demasiado nervioso. Como cualquier neó- salario promedio para un desarrollador no sumaba más
fito, compartí mi tensión , con mis parceros (amigos) de 220 dólares mensuales en el mejor de los casos a
y mi familia, hablándoles de lo que para mí en ese este lado del charco), quedé realmente desilusionado,
entonces implicaba un espléndido reto. Al final del y entendí que nunca las certificaciones equivaldrían o
examen todo salió bien (es un momento que aún superarían las ingenierías por dos razones: una de ellas,
recuerdo con sonrisa en el rostro), llamé a mi familia la que acabo de relatar; y la siguiente, porque las tec-
y le escribí a mis amigos del suceso… Varios de uste- nologías tienen una duración muy corta, en cambio,
des se preguntarán porqué esta introducción de índo- cuando eres ingeniero, tus bases "ingeniériles" duran
le tan personal; pues bien así de importante fue para para siempre (aunque la verdad es que hoy me lleva-
mi rendir mi primer examen de certificación, pero con ría un rato recordar la metódica de solución a las trans-
el correr de los días dicha ilusión fue al traste… formadas de fourier =P).
"..Las certificaciones IT, desafortunadamente, no Con ello y otros bemoles, seguí igual tomando mis
son tan importantes como crees, es más, fue un dife- cursos técnicos y rindiendo mis exámenes (incluso per-
renciador algún tiempo, pero con los días se ha con- dí el 70-300, un examen de arquitectura de .NET en
vertido en toda una farsa.", me repitió mi maestra de el primer intento, hace sólo algunos meses). A estas
construcción de software. Lo curioso es que para esos alturas usted se puede preguntar ¿porqué seguir rin-
días en Colombia (hace siete años aproximadamente), diendo estas pruebas, que pareciere que día a día, estu-
la cantidad de certificados era mucho menor, e inclu- vieren más y más a la venta por unos pocos dólares?
so, ella viajó a Estados Unidos para tomar la capacita- (La verdad es que me asombra el nivel de fidelidad de
ción debida, pues no existía en el país ese tipo de entre- esos documentos; es tal el descaro, que salen hasta las
<<dotNetManía

namiento aun. Le pregunté por qué razón afirmaba tal capturas de pantalla). ¿Porqué rendir una prueba que
cuestión, "... Willy, verás en estas URL's los exáme- tiene un coste tan alto, si las respuestas están a la ven-
nes están a la venta…", la verdad no podía creerlo, no ta por un valor con el cual podría comprar el examen

8
<< dnm.opinion

completo? -Cuando hago referencias a ellos, no me


refiero a las pruebas de preparación o a los libros que
se escriben sobre tema, desde luego-. Ojalá las multi-
nacionales IT que tienen que ver con estos procesos de
certificación, acaben con este cuento pronto; realmen-
te es lamentable que ello suceda y no se pronuncien.
Todas las compañías después de aprobar algunos de
sus exámenes, hacen llegar una especie de certificado
impreso y alguna documentación, pero siendo objeti-
vos, no pasa de allí la cuestión, la verdad es que me pare-
ce un poco desigual el "trato". El porqué de este comen-
tario viene a lo siguiente: si una compañía IT promue-
ve como un alto grado de avance el hecho de certifi-
carse, lo mínimo que esperaría sería la generación de
bolsas de empleo de las personas que certifican o la pro- Figura 2. Reporte de MCP's en los últimos nueve meses
moción de dichas personas por algún tipo de canal, cosa
que ha día de hoy no sucede y parece que se divise (este han pasado a ser necesidad por solicitud de los emple-
último comentario es una generalidad, desde luego, por adores y una tendencia al aumento de sus salarios…
estos lados, las personas de Microsoft, están retoman- entonces ¿qué es lo inclusive de esta encuesta? Bueno,
do el tema con toda la fuerza que amerita). dicha labor de recolección de información, sólo se lle-
vó acabo en Estados Unidos, ¿y el resto de nosotros
donde quedamos? ¿Será que nuestras economías pue-
Una perspectiva mundial den equipararse en proporción a salarios…? La res-
y los certificados puesta evidentemente es no. Lo que implicaría que el
coste de dicho tipo de educación fuere proporcional-
Recientemente una de las publicaciones más mente ajustada. No son lo mismo 100 dólares en
importantes en el tema, MCPMag.com, publicó el Estados Unidos que en Latam...
resultado de su estudio de salarios con respecto a los
profesionales certificados (no sólo de Microsoft, sino
de diferentes compañías), disponibles en http://mcp-
mag.com/salary2003/ (les recomiendo mucho la lec-
tura de este documento). Muestra dos tendencias cla-
ras: el nivel de profesionales ha aumentado conside-
rablemente, a medida que las certificaciones técnicas

Figura 3. Reporte de MCSD's en los últimos nueve meses


<<dotNetManía

Figura 1. Reporte de Certificados a Febrero


de 2004
Figura 4. Reporte de MCT's en los últimos nueve meses

9
<< dnm.opinion

Desde luego las variables macroeco- con la tecnología antes de rendir la prue- mente inconcebible que un profesional
nomías influyen localmente, pero si se ve ba de certificación de la misma y con ello diga tener credenciales que lo habilitan
con detenimiento el coste de este tipo de sustentar la credencial en caso de rendir como experto en un frente tecnológico
formación IT, no sólo debería ser ajus- positivamente la prueba. A día de hoy, y que no posea experiencia. Si usted es
tada localmente, sino después de ajusta- algunas compañías, mantienen esta mecá- empleador, es muy buena idea enterarse
da, reducirse por lo menos a la mitad. La nica. Esto permite mantener la credibi- del Skill de cada certificación, y con ello
justificación de esta premisa está en que lidad en la credencial y en consecuencia determinar si es equiparable lo uno con
somos nosotros los IT (me refiero a todo del profesional que decide tomarlas y me lo otro. Es notorio que la certificación es
el gremio, pero con más fuerza a los desa- lleva al siguiente punto de este escrito... un diferenciador, pero no lo será por
rrolladores de software) quienes hace- mucho tiempo, pasará a ser un requisito
mos que las plataformas permanezcan ¿Contrataría usted a un (así se puede leer en la encuesta de
y/o se difundan, ello debido a nuestra MCPMag que recomendaba unas líneas
inclinación hacia la misma (llámese como
profesional sin experiencia arriba), aunque bueno fuera que reco-
se llame), pues si no hay productos para de campo y con certificaciones brara su estatus de credibilidad.
la plataforma X o Y, ésta pierde su posi- a su haber? A pesar de esta posición un poco
cionamiento.... pero bueno ello daría para escéptica (y desde luego desde una pers-
otro escrito de esta saga. Esta es la misma pregunta que debe- pectiva muy personal y ya para rematar
Debido al crecimiento de las certi- rían hacerse las personas que se logran estas líneas), usted debe tener en cuen-
ficaciones como requisito, se hace cada certificar de una manera, cómo decir- ta que las certificaciones son buena idea,
vez más importante la intervención de lo… "poco ortodoxa". pero aún mejor idea es conocer a fon-
la industria, para que estas credenciales Si me hicieran esta pregunta, mi res- do las tecnologías para ser un real exper-
conserven (o en algunos casos recupe- puesta sería un contundente JAMÁS (¿de to… así no te certifiques. Nos vemos en
ren) su buen nombre. qué me sirve un experto de diploma, si un próximo articulo… debo seguir estu-
Una buena alternativa, pudiere ser el en realidad tengo un fiasco como emple- diando para rendir mi próxima certifi-
hecho de exigir un tiempo comprobable ado?). Desde mi perspectiva, es sencilla- cación =).

Microsoft lanza BizTalk Server 2004


Con motivo del Silicon Valley Speaker Series, vicepresidente corporativo del Grupo de • Integración en Visual Studio .NET
en marzo de 2004, Microsoft presentó Servidores E-Business de Microsoft. “Los 2003. Permite a los desarrolladores cre-
BizTalk® Server 2004. BizTalk es una solu- primeros usuarios han obtenido gran valor ar, organizar y administrar los procesos
ción de integración líder en la industria y de sus soluciones BizTalk Server 2004, y el empresariales a través de un ambiente de
miembro del Windows Server System™. Las día de hoy nos emociona poder ofrecer los desarrollo integrado y muy productivo.
aplicaciones creadas con BizTalk Server 2004 mismos resultados a más clientes”. • Supervisión de actividad de estado
corren bajo .NET Framework, lo cual per- Nuevas características que organi- (HAT). Permite a los administradores
mite a los clientes automatizar y administrar zan y administran los procesos empre- supervisar y administrar el estado de sus
procesos empresariales complejos al integrar sariales de principio a fin Además de las procesos empresariales dentro de sus
aplicaciones, socios comerciales y emplea- capacidades de integración de aplicaciones ambientes BizTalk Server.
dos con el núcleo de organización de proce- contenidas en las versiones anteriores, • Entrada única empresarial. Optimiza el
sos altamente escalable de BizTalk Server. BizTalk Server 2004 brinda nuevas capaci- proceso de verificación de entrada de los
BizTalk Server 2004 ayuda a incrementar la dades que permiten a las empresas admi- usuarios Windows y no Windows que acce-
productividad de los trabajadores con infor- nistrar y aplicar reglas a los procesos empre- den a las aplicaciones de giro empresarial.
mación, los profesionales en TI y los desa- sariales, conectarse con los socios comer- • Máquina de normas empresariales muy
rrolladores a través de herramientas especí- ciales y analizar el estado de los procesos escalable. Permite a los analistas empre-
ficas para desarrollar, administrar y acceder empresariales en forma más efectiva. Las sariales crear normas y políticas flexibles
a los procesos empresariales en entornos nuevas funciones incluidas en BizTalk y de mejor respuesta en torno a los pro-
familiares tales como Microsoft Office Server 2004 incluyen lo siguiente: cesos empresariales.
System y Visual Studio® .NET 2003. • Supervisión de actividad empresarial
“En la actualidad, las empresas se enfren- • Administración de procesos empresa- (BAM). Ofrece a los trabajadores con
tan a retos importantes para administrar y riales (BPM). Ofrece una máquina de información supervisión en tiempo real de
automatizar los procesos empresariales cada mensajes y organización muy escalable con los procesos empresariales a través de
vez más desconectados. BizTalk Server 2004 capacidad BPM de nivel empresarial, herramientas conocidas como Microsoft
permite a los clientes administrar y automa- incluyendo soporte para Business Process Office Excel o Microsoft Office SharePoint
tizar sus procesos empresariales, al tiempo Execution Language (BPEL), un nuevo Portal Server 2003.
<<dotNetManía

que brinda a los usuarios herramientas para estándar para enlazar los procesos empre- • Integración en Microsoft Office
diseñar, implementar y supervisar estos pro- sariales entre los socios comerciales, las System. Permite el análisis de procesos y
cesos en tiempo real”, dijo Ted Kummert, aplicaciones y los usuarios empresariales. datos.

10 noticias.noticias.noticias.noticias
Por Guillermo ‘Guille’ Som
Visual Basic MVP desde 1997
www.elguille.info

Equivalencia de instrucciones
de C# y VB .NET (y III)
Tercera y última entrega de esta serie de artículos en la que hemos pretendido
explicarle cómo hacer las mismas cosas (o casi) tanto en C# como en Visual
Basic .NET

<< Instrucciones de decisión y operadores En los comentarios se indican algunas de las


peculiaridades de C# y de Visual Basic .NET.
de comparación
En algunas de estas instrucciones se utilizan Las instrucciones para realizar bucles
expresiones que devolverán un valor verdadero
(true) o falso (false). Las instrucciones para realizar bucles nos per-
En esas expresiones podemos utilizar cualquiera miten iterar un número determinado (o indeter-
de los operadores condicionales mostrados en la minado) de veces sobre una parte del código. El
tabla 8. También podemos formar expresiones múl- código lo incluiremos dentro de dicho bucle.
tiples usando los operadores condicionales mos- En C# el código a usar en un bucle puede ser
trados en esa misma tabla. una sola instrucción, terminada con un punto y
En la tabla 9 se muestran algunos ejemplos de coma, o un bloque de código, incluido dentro de
cómo usar las instrucciones de selección o de tomas un par de llaves.
de decisiones según usemos if... else o switch... En VB .NET los bucles siempre estarán dentro
case / Select Case. de un bloque de código bien delimitado, es decir,

Descripción C# VB .NET

Operador de igualdad == =
Distinto != <>
Menor, menor o igual, mayor o mayor o igual son los
mismos operadores en ambos lenguajes: <, <=, >, >=
Y & And
Or | Or
Xor ^ Xor
Negación (not) ! Not
Y cortocircuitado && AndAlso
Or cortocircuitado || OrElse
<<dotNetManía

Tabla 8. Instrucciones (operadores) de comparación

11
<< dnm.lenguajes.net

habrá una parte inicial y otra instruc-


Tarea a realizar C# VB .NET ción que marcará el final de dicho bucle.
En la tabla 10 podemos ver cómo
Toma de decisiones con if if(a != b) <código>; If a <> b Then <código> crear bucles for, do, while así como algu-
nos aspectos a tener en cuenta, ya que
Toma de decisiones con if if(a > b){ If a > b Then
con varias instrucciones <código> <código>
Constructores, destructores
} End If
y cómo invocar a los
Instrucción if que si se if(a > b) If a > b Then constructores de una clase
cumple haga una cosa y si no <código> <código>
se cumple, haga otra, else Else y de la clase base
usando varias líneas <código> <código> Los constructores son el punto de
End If inicio de las clases o tipos de datos, si
en una clase no definimos un cons-
Varias instrucciones if... else if(a != b) If a <> b Then
tructor, se creará uno predetermina-
asociadas a otro if. <código> <código>
else ElseIf b > i AndAlso a do que simplemente asignarán un
> b Then valor inicial a los campos (variables)
if(b > i && a > b){ que la clase contiene. También pode-
<código> mos crear nuestros propios construc-
<código> tores, de forma que puedan recibir
Else parámetros para asignar valores a cier-
} tos campos de nuestra clase. Incluso
<código> podemos crear distintas versiones de
End If los constructores para permitir dife-
Varias instrucciones if anidadas. if(a != b) If a <> b Then rentes formas de instanciar (o crear)
if(b > i) If b > i Then nuevos objetos.
<código>; <código> En Visual Basic .NET un cons-
else End If tructor se define por medio de un pro-
<código>; Else cedimiento (Sub) llamado New. En C#
<código> el constructor será un procedimien-
End If to “especial” que se llama igual que la
En C# no se distingue entre un if de simple línea o multilínea, pero si queremos usar varias instrucciones en propia clase (o tipo) que estamos defi-
lugar de una sola acabada con un punto y coma, las incluiremos dentro de un bloque entre un par de llaves {}. niendo.
Por otro lado, un destructor se uti-
En VB .NET podemos crear un bloque If multilínea acabándola con End If, tanto en el bloque If como en el blo-
liza cada vez que destruimos un obje-
que Else o ElseIf podemos indicar una o más líneas con instrucciones. Si no se indica End If se tomará como una
to, en .NET Framework se llama
instrucción de una línea, en la que se puede incluir también la parte Else, pero siempre en la misma línea física.
finalizador, de hecho, en Visual Basic
Seleccionar entre varias switch(<expresión>){ Select Case <expresión> .NET se utiliza como destructor una
opciones usando switch... case <constante1>: Case <valor1> sobrecarga del método Finalize decla-
<código> <código> rado en la clase Object. En C# el des-
break; tructor se define usando el nombre
case <constante2>: Case <valor2>, <valor3>
de la clase precedida con ~. Un des-
case <constante3>: <código>
tructor se llamará cuando un objeto
<código> Case <valorA> To <valorB>
break; <código> deje de estar en “ámbito” o se asigne
default: Case Is <expresión> un valor nulo a la variable. Hay que
<código> <código> tener en cuenta que en .NET los
break; Case Else objetos no se destruyen inmediata-
} <código> mente, sino que cuando dejan de ser
End Select

<<
En C# sólo se pueden usar valores constantes con cada cláusula case. Podemos anidar una tras otra indicando
varios case seguidos. Después de cada bloque case hay que usar la instrucción break o bien se debe salir del blo-
que de código, ya que no se permite pasar de un case a otro, salvo que usemos goto case <constante>.
En VB .NET en cada cláusula Case se pueden indicar varios valores separados por comas, incluso un rango de
<<dotNetManía

valores usando To o un valor condicional usando Is. Esos valores no tienen porqué ser constantes, pueden ser
también expresiones.
Tabla 9. Instrucciones de decisión

12
<< dnm.lenguajes.net

“útiles”, el recolector de basura (reco-


Tarea a realizar C# VB .NET lector de objetos no usados) se encar-
ga de ellos y será el propio GC
Bucle for for(<inicio>; <final>; For <contador> = (Garbage Collector) se encargará de
<incremento>) <inicio> To <final> destruirlo, aunque esa destrucción no
<código> <código>
Next
Bucle for infinito for(;;) ; For i = 0 To 0 Step 0:
Nota: Espero que a nadie en su Next
sano juicio se le ocurra hacer esto
Bucle for con incremento for(int i = 0; i<10; i For i = 0 To 9 Step 2
distinto de uno. += 2)
<código> <código>
Next
Bucle for para recorrer de mayor for(int i = 10; i>0; i—) For i = 10 To 1 Step -2
a menor. <código> <código>
Next
Salir de un bucle for break; Exit For
En C# podemos indicar varias instrucciones después de if o else incluyéndolas dentro de un bloque entre
un par de llaves {} o bien una sola instrucción acabada con punto y coma.
En VB .NET podemos crear un bloque If acabándola con End If, tanto en la parte If como en la parte Else
podemos indicar una o más líneas con instrucciones. Si no se indica End If se tomará como una instrucción
en una sola línea.
Bucle sin condición de término do{ Do
<código> <código>
}while(true) Loop se hará inmediatamente, este punto es
Bucle con una condición después do{ Do importante ya que si nuestro objeto
de cada iteración, se repetirá <código> <código> mantiene recursos externos éstos no
mientras se cumpla la condición }while(<expresión>) Loop While <expresión> se liberarán inmediatamente, en esos
casos, es recomendable definir un
Bucle con una condición al principio while(<expresión>) Do While <expresión>
<código>; <código> método al que llamemos de forma
Loop explícita para liberar esos recursos jus-
to cuando ya no los necesitemos.
While <expresión>
Los constructores siempre llama-
<código>
End While rán a un constructor de la clase deri-
vada, si no lo indicamos expresamen-
Bucle que continúe la ejecución do{ Do te, el compilador intentará llamar a
hasta que se cumpla <código> <código> un constructor sin parámetros. En
la condición }while(! <expresión>) Loop Until <expresión>
caso de que la clase base no tenga defi-
Bucle que continúe la ejecución while(! <expresión>){ Do Until <expresión> nido un constructor sin parámetros,
hasta que se cumpla la condición, <código> <código> tendremos que realizar nosotros esa
realizando la comprobación } Loop llamada, indicando el constructor ade-
al principio del bucle
cuado, si no lo hacemos se producirá
Salir de un bucle do o while break; Usar Exit seguida del un error de compilación.
tipo de bucle: Por otra parte, los destructores
Exit Do para Do... Loop siempre llaman al método Finalize de
Exit While para While...
la clase base, de forma que se destru-
End While
yan todos los objetos creados. En este
En C# los bucles do se utilizan con una instrucción while al final del bucle, esta instrucción es la que se caso no es necesario que lo llamemos
encarga de comprobar si el bucle debe seguir ejecutándose o no. Si queremos que el bucle se repita indefi- de forma explícita.
nidamente podríamos usar una expresión que siempre devuelva un valor verdadero. En la tabla 11 podemos ver cómo
En Visual Basic .NET podemos usar la instrucción While o la instrucción Until, en C# no existe la ins- definir los constructores y destructo-
trucción Until, pero se puede simular usando un while en el que se niega la expresión usada. res, así como la forma de invocar a
En VB .NET se puede usar While como instrucción asociada a Do... Loop o como instrucción indepen-
otra sobrecarga de un constructor de
<<dotNetManía

diente, en ese caso el final del bloque del código se indicará con End While.
la misma clase e incluso de la clase de
Tabla 10. Instrucciones de bucles la que se deriva.

13
<< dnm.lenguajes.net

Tarea a realizar C# VB .NET Definir clases abstractas


y selladas, miembros abs-
Definir un constructor de una clase. public Cliente() Public Sub New()
En estos ejemplos, supondremos {} End Sub tractos y virtuales, redefinir
que la clase se llama Cliente y ocultar métodos
Definir un constructor que recibe public Cliente(int id) Public Sub New(id As Las clases abstractas son clases que
un parámetro Integer) sólo se pueden utilizar para derivar
{} nuevas clases, no se podrán usar para
End Sub crear nuevos objetos. Una clase abs-
Definir un destructor o finalizador ~Cliente() Public Overrides Sub tracta puede contener métodos y pro-
{} Finalize() piedades normales así como abstrac-
End Sub tos, los métodos abstractos sólo se
definen como en las interfaces: sin
En C# el constructor siempre se llama como la clase.
código que los hagan operativos.
En VB .NET el constructor siempre es un método Sub llamado New.
Los destructores sólo se pueden usar en las clases no en las estructuras. Por otro lado los métodos virtua-
les son los que podremos redefinir en
Definir un constructor que llama a otro public Cliente(int id, Public Sub New(id As la clase derivada, para dar la funcio-
constructor de la propia clase. string nombre) : Integer, nombre As nalidad adecuada que creamos conve-
this(id) String) niente. Las referencias a las instancias
{} Me.New(id)
creadas en memoria siempre usarán
End Sub
las versiones redefinidas de los méto-
Definir un constructor que llama public Cliente(int id, Public Sub New(id As dos (o miembros) virtuales. Por defec-
a otro constructor de la clase base. string nombre) : Integer, nombre As to, los métodos y propiedades de una
base(id) String) clase no son virtuales, es decir, no se
{} MyBase.New(id) pueden redefinir en las clases deriva-
End Sub das, sin embargo podemos ocultarlos.
Tabla 11. Constructores y destructores. Esos miembros ocultados sólo perte-
necerán a la instancia de la clase que
los define, no a las referencias obte-
Tarea a realizar C# VB .NET
nidas a través de tipos de la clase base.
Definir una clase abstracta abstract class Prueba MustInherit Class Los miembros abstractos siempre
{} Prueba son virtuales.
End Class También podemos definir clases
Definir una clase sellada sealed class Prueba2 NotInheritable Class selladas, lo contrario de las clases abs-
{} Prueba2 tractas, es decir, clases que no se pue-
End Class den usar para derivar nuevas clases a
Definir un miembro abstracto abstract void Prueba(); MustOverride Sub partir de ellas.
Prueba() También podemos ocultar tipos
además de los miembros de una clase.
Definir un miembro virtual virtual void Prueba2() Overridable Sub En la tabla 12 podemos ver una
{} Prueba2() lista de las instrucciones usadas para
End Sub declarar clases abstractas, miembros
Los miembros abstractos sólo definen el método o propiedad, pero no contienen código que lo defina. abstractos, virtuales, así como las ins-
Redefinir un miembro abstracto o override void Prueba() Overrides Sub Prueba() trucciones usadas para ocultar miem-
virtual {} bros y para redefinir los miembros
End Sub virtuales de las clases base.
Por supuesto no se han cubierto
Definir un miembro que oculta new void Prueba3() Shadows Sub Prueba3() todas las posibilidades sintácticas
a otro de la clase base {} End Sub entre los dos lenguajes más usados de
En VB .NET si se quiere ocultar un miembro virtual, además de usar Shadows debemos usar la instruc- la plataforma .NET, pero espero que
ción Overloads. al menos ahora tengas una idea bas-
Nota sobre seguridad: Los miembros declarados como virtual internal (Overridable Friend en VB) en teo- tante aproximada de cómo hacer las
ría sólo se pueden reemplazar en clases definidas en el propio ensamblado, pero esa “restricción” sólo es tareas más comunes tanto en C#
aplicable a los compiladores de C# y de VB, el CLR no tiene esa restricción, por tanto es teóricamente posi- como en Visual Basic .NET, de for-
<<dotNetManía

ble reemplazar esos miembros desde otro ensamblado, al menos por compiladores que no tengan dicha res- ma que en cualquier momento te
tricción. Para más información: /cpguide/html/cpconkeyconceptsinsecurity.htm resulte fácil poder escribir código en
/cpguide/html/cpconsecurityconcernsforinternalvirtualoverloadsoverridablefriendkeywords.htm cualquiera de estos dos lenguajes.
Tabla 11. Constructores y destructores.

14
Por Ángel Esteban
Software Arquitect
Alhambra-Eidos

Configuración de aplicaciones
Web de ASP.NET
En versiones anteriores de la tecnología ASP, la configuración de aplicaciones Web se rea-
lizaba a través del administrador de servicios de Internet (Internet Information Server,
IIS), ya que la información relativa a la configuración de aplicaciones ASP se almacenaba
en un repositorio binario denominado metabase de Internet Information Server. Se tenía
que acceder a las distintas hojas de propiedades que nos ofrecía IIS para poder configu-
rar nuestra aplicación.

<< Pero en la tecnología ASP.NET ma .NET para configurar las aplicacio- web.config, y de esta forma pueda ver
esto ha cambiado y nos permite realizar nes Web de ASP.NET, aporta las la configuración de nuestra aplica-
una configuración de las aplicaciones siguientes ventajas: ción ASP.NET
Web basada en ficheros en formato
XML. Este sistema de configuración de • Valores de configuración en formato Proceso de obtención
ASP.NET hace uso de dos tipos de legible: Es muy sencillo abrir un
ficheros de configuración: fichero XML y leer o modificar la
de la configuración de una
configuración. aplicación Web
1. Configuración del servidor: Que se alma- • Actualizaciones inmediatas: Las
cena en un fichero denominado machi- modificaciones realizadas en la A continuación se va a comentar el
ne.config. Este fichero va a representar configuración de las aplicaciones proceso que sigue la plataforma .NET
la configuración por defecto de todas se aplican de forma inmediata sin para obtener y aplicar la configuración
las aplicaciones ASP.NET existentes necesidad de reiniciar el servidor final de una aplicación ASP.NET.
en el servidor y se localiza en el direc- Web o parar los servicios. A la hora de obtener la configura-
torio Windows \Microsoft.NET • Configuraciones fácilmente repetibles: ción se produce una fusión entre los
\Framework\[versión]\config. Para tener una aplicación ficheros machine.config y web.config. Los
2. Configuración de la aplicación: Se almace- ASP.NET con la misma configu- valores de configuración se heredan
na en el fichero web.config. Un servidor ración que otra aplicación distin- entre distintas aplicaciones ASP.NET,
Web puede contener varios ficheros ta, únicamente debemos copiar los siendo el fichero machine.config la con-
web.config, cada uno de ellos dentro del ficheros de configuración en el figuración raíz de la que heredan el
directorio raíz de cada una de las apli- directorio de la aplicación corres- resto.
caciones ASP.NET del servidor. La con- pondiente. Por lo tanto, en primer lugar tene-
figuración indicada dentro de un fiche- • Bloqueo de valores de configuración: mos el fichero machine.config que afec-
ro web.config sobrescribe los valores espe- Podemos bloquear los valores de tará a todas las aplicaciones ASP.NET
cificados en el fichero machine.config. configuración que deseemos para existentes en el servidor Web. A los valo-
que no sean sobrescritos. res de configuración indicados en este
Ventajas • ASP.NET configura de manera fichero se le añadirían o sobrescribirí-
<<dotNetManía

automática el servidor Web IIS para an los presentes en el fichero web.config


Este nuevo mecanismo de configu- que no sea posible que un cliente que posee un sitio Web, que actúa como
ración que encontramos en la platafor- realice una petición a un fichero una aplicación ASP.NET.

16
<< dnm.asp.net

Si dentro de este sitio Web tenemos


<?xml version=”1.0” encoding=”UTF-8” ?>
definida una aplicación ASP.NET, que
ofrece su propio fichero web.config, éste <configuration>
se combinaría con el fichero XML pre- <configSections>
sente en el sitio Web predeterminado. <section name=”appSettings”
Y así podríamos seguir una cadena de type=”System.Configuration.NameValueFileSectionHandler,System,
combinación de ficheros web.config. Version=1.0.2411.0, Culture=neutral,PublicKeyToken=b77a5c561934e089” />
<sectionGroup name=”system.web”>
Formato de los ficheros de <section name=”sessionState”
type=”System.Web.SessionState.SessionStateSectionHandler, System.Web,
configuración de una Version=1.0.2411.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”
aplicación ASP.NET allowDefinition=”MachineToApplication” />
<section name=”trace”
type=”System.Web.Configuration.TraceConfigurationHandler, System.Web,
Tenga a mano el contenido de un Version=1.0.2411.0, Culture=neutral,
fichero machine.config y web.config para PublicKeyToken=b03f5f7f11d50a3a” />
seguir el artículo de forma más senci- </sectionGroup>
lla y conseguir un mayor aprovecha- </configSections>
miento del mismo.
Los ficheros machine.config y el fiche- … … … …
ro web.config internamente presentan el
mismo formato XML. El elemento raíz </configuration>
es siempre <configuration>. Dentro de
Fuente 1. Definición de manejadores para las secciones sesionState y trace
éste podemos encontrar dos secciones
generales: Sección de los manejadores y
sección de los valores de configuración. appSettings. El grupo <system.web> va a Tareas de configuración
ser de gran interés, ya que nos va a per- más comunes
Sección de los manejadores mitir configurar los distintos aspectos
de nuestras aplicaciones ASP.NET. Si examinamos detenidamente el
Identifican las clases de .NET Una vez que se ha declarado la sec- fichero de configuración machine.config
Framework que se utilizarán cuando el ción de los manejadores no es necesa- que tenemos en nuestro equipo, pode-
sistema de configuración se carga. Esta rio volver a declararla en los ficheros mos encontrar alrededor de treinta
sección se encuentra entre las etiquetas web.config, ya que si se encuentran en el opciones de configuración distintas. En
<configSections>. La función de estas cla- fichero machine.config, o en un fichero este artículo no vamos a tratar todas
ses es la de leer los valores de la sección web.config de nivel superior, la hereda- estas tareas de configuración, sino que
de los valores de configuración que les rán de manera automática. vamos a ver las más comunes y las que
corresponda. más se pueden usar en un entorno real
El atributo name de la etiqueta <sec- Sección de los valores de trabajo.
tion> define el nombre de la etiqueta del Todas estas opciones de configura-
de configuración
elemento de la sección de los valores de ción se encontrarán dentro de la sección
configuración del que se va a encargar Mientras que la sección de los de los valores de configuración del fiche-
el manejador, cuya clase especificamos manejadores define clases, la sección ro de configuración correspondiente,
en el atributo type, dentro de este atri- de valores de configuración identifica que por lo general será el fichero
buto además se indica el assembly en el las propiedades que afectan al com- web.config.
que se encuentra la clase junto con su portamiento de la aplicación ASP.NET.
versión correspondiente. En muchos de los casos necesitaremos Configuración general
Si se desea definir manejadores para saber únicamente el significado de la
una sección de valores de configuración opción que vamos a modificar. En esta sección se va a indicar una serie
que a su vez va a tener varias secciones, Normalmente los valores de configu- de parámetros de configuración genéri-
las distintas etiquetas <section> irán inclui- ración de la aplicación ASP.NET no los cos para la aplicación ASP.NET. Para ello
das entre las etiquetas <sectionGroup>. vamos a indicar en el fichero machine.con- se hace uso de la etiqueta <httpRuntime>.
En el fuente 1 se muestra un frag- fig, ya que estos valores afectarán a todas Esta etiqueta tiene como más significati-
mento del fichero machine.config que se las aplicaciones ASP.NET del servidor, vos los siguientes atributos:
corresponde con la definición de dos sino que utilizaremos un fichero web.con-
manejadores para las secciones fig particular para una aplicación ASP.NET • executionTimeout: En este atributo
<<dotNetManía

sessionState y trace, que a su vez perte- determinada. En este fichero web.config indicaremos en segundos el tiempo
necen al grupo <system.web>, también se heredaremos la sección de los manejado- de espera que se aplicará a la ejecu-
define el manejador para la sección res indicada en el fichero machine.config. ción de un recurso solicitado. Una

17
<< dnm.asp.net

vez sobrepasado este tiempo de Configuración de la aplicación • mode: Indica el modo de almacena-
espera la aplicación ASP.NET fina- miento utilizado para el proceso que
lizará la ejecución del recurso. Por En esta sección vamos a poder alma- se corresponde con el estado de la
defecto es 90 segundos. cenar valores de detalles de configuración sesión. Los valores que podemos
• maxRequestLength: Indica en Kb el de la aplicación. Para almacenar estos asignar a este atributo son: InProc,
tamaño máximo de una petición. parámetros dentro del fichero de confi- el estado de sesión se encuentra en
Por defecto es 4.099 Kb. guración vamos a utilizar pares clave/valor. el proceso actual de ASP.NET; Off,
• userFullyQualifiedRedirectUrl: Indica Estos valores de configuración defi- el estado de sesión se encuentra
si al cliente se le va a devolver una nidos en la sección <appSettings> los desactivado; SQLServer, se utiliza
URL completa o una URL relati- vamos a poder recuperar en las páginas un proceso de SQL Server para
va. Por defecto es false, por lo que ASP.NET de la aplicación. Esta etiqueta almacenar el estado; StateServer, se
se enviará una URL relativa. de configuración de la aplicación no se utiliza un proceso en forma de ser-
encuentra dentro de la sección <sys- vicio de Windows para almacenar
Configuración de la página tem.web>. el estado. Por defecto es InProc.
Dentro de la etiqueta <appSettings> • stateConnectionString: En este atri-
Mediante la etiqueta <pages> pode- tenemos unas subetiquetas <add>. buto se indica la dirección IP y el
mos controlar algunos de los compor- Existirá una etiqueta <add> por cada número de puerto utilizados para
tamientos de las páginas ASP.NET parámetro o valor que queremos indi- comunicarse con el servicio de
presentes en una aplicación. La eti- car en la aplicación, esta etiqueta posee Windows que ofrece las facilidades
queta <pages> puede tener los siguien- dos atributos: key, que es la clave con la de almacenamiento. Este atributo
tes atributos: que después vamos a poder acceder a únicamente tiene sentido utilizarlo
este parámetro a través de la colección cuando el atributo mode tiene el
• autoEventWireup: Indica si los even- AppSettings, y value que va a ser el valor valor de StateServer.
tos de la página se van a lanzar de for- que le vamos a asignar al parámetro. • sqlConnectionString: Identifica la
ma automática. Por defecto es true. En el fuente 4 se muestra el frag- cadena de conexión de la base de
• buffer: Se utilizará para activar o mento de un fichero web.config en el que datos utilizada para almacenar el
desactivar el búfer de las páginas se definen dos parámetros para la apli- estado cuando el atributo mode
ASP.NET de la aplicación actual. cación: Se indica una cadena de cone- posee el valor SQLServer. Esta cade-
Puede tomar valores true/false. xión y una sentencia SQL. na debe incluir la dirección IP y el
• enableSessionState: Este atributo per-
mite activar o desactivar el estado de <configuration>
sesión, es decir, permite o no la uti- <appSettings>
lización del objeto Session para alma- <add key=”conexion” value=”server=aesteban;database=datos;uid=sa;pwd=”/>
cenar información común a la sesión <add key=”sentencia” value=”select nombre, apellidos,email from
actual del usuario con la aplicación Usuarios”/>
</appSettings>
Web. Puede tomar valores true/false.
</configuration>
• enableViewState: Permite activar o
desactivar el mantenimiento auto- Fuente 3. Ejemplo de uso de la etiqueta <appSettings>
mático de los valores de los contro-
les Web dentro de los formularios nombre y contraseña de usuario
Web. Por defecto es true. Configuración de la sesión para conectar a la base de datos de
SQL Server.
Estos atributos se corresponden con Desde el fichero de configuración • cookieless: Atributo que indica si el
los atributos del mismo nombre de la de la aplicación ASP.NET tenemos la objeto Session utiliza cookies para
directiva @Page, por lo que utilizando posibilidad de configurar la forma en la almacenar el identificador de sesión,
esta directiva podemos sobrescribir estos que se va a utilizar el estado de sesión o por el contrario no las utiliza y el
valores de configuración para una pági- mediante la etiqueta <sessionState>. Para identificador de sesión lo va mante-
na ASP.NET en concreto. ello presenta los siguientes atributos: niendo a través del mecanismo de
URLs. El mecanismo de URLs será
utilizado cuando el valor de este atri-
<configuration> buto sea true. Por defecto es false.
<system.web> • timeout: El atributo timeout especifi-
<pages buffer=”true” enableSessionState=”true”
ca, en minutos. el intervalo de inac-
enableViewState=”true” autoEventWireup=”true”/>
tividad para el objeto Session. Si el
<<dotNetManía

</system.web>
</configuration> usuario no actualiza o solicita una
página durante ese intervalo, la sesión
Fuente 2. Ejemplo de uso de la etiqueta <pages> termina. Por defecto es 20 minutos.

18
<< dnm.asp.net

Globalización to, el usuario IUSR_NombreServidor, vado a o no. Tiene por lo tanto la mis-
o bien bajo el usuario que nosotros le ma funcionalidad que el atributo de mis-
Los valores indicados en la sección indiquemos. Por defecto es false. mo nombre de la directiva @Page. Su
<globalization> nos va a permitir confi- • name: Este atributo estará disponi- valor por defecto es false.
gurar las opciones de codificación y cul- ble cuando el atributo impersonate requestLimit: En este atributo indi-
tura. La etiqueta <globalization> nos tenga el valor true, y lo vamos a uti- caremos el número máximo de peti-
ofrece cinco atributos para indicar diver- lizar cuando deseemos indicar una ciones HTTP de las que se va a alma-
sos aspectos de la codificación utilizada cuenta de usuario de Windows espe- cenar información de trazas. Las tra-
en nuestra aplicación: cífica para representar al proceso de zas van a ser almacenadas en un regis-
ejecución de ASP.NET. tro de trazas mediante un mecanismo
• requestEncoding: Mediante este atri- • password: En él indicaremos la con- circular en las que permanecerán las
buto podemos indicar la codifica- traseña del usuario que se va a uti- últimas n peticiones. Por defecto es
ción utilizada en cada solicitud. Por lizar en el proceso. 10.
defecto tiene la codificación utf-8.
• responseEncoding: Este atributo tie-
<configuration>
ne el mismo significado que el ante- <system.web>
rior pero aplicado a una respuesta <identity impersonate=”true” user=”aesteban” password=”xxx”/>
enviada al cliente. Por defecto tie- </system.web>
ne la codificación utf-8. </configuration>
• fileEncoding: Permite indicar el tipo
de codificación aplicado a los fiche- Fuente 5. Ejemplo de la sección <Identity>.
ros. Por defecto tiene la codifica-
ción utf-8. En el fuente 6 se puede observar el • pageOutput: Indica si la información
• culture: Podemos especificar el lugar uso de esta etiqueta. En este caso se indi- de trazas se va a mostrar al final de
en el que nos encontramos para que ca que utilice como identidad del proce- cada página ASP.NET, tal como se
se aplique a las cadenas el idioma ade- so de ASP.NET un usuario de Windows. hace con las trazas a nivel de pági-
cuado, así como también a las fechas Si quisiéramos utilizar el usuario de IIS, na. Por defecto es false.
y su formato. Por ejemplo, en-US
representa al idioma inglés de Estados
Unidos y fr-FR francés en Francia. <configuration>
• uiCulture: Indica la misma infor- <system.web>
mación que en el atributo anterior, <trace enabled=”false” localOnly=”true” pageOutput=”false” requestLimit=”10”
traceMode=”SortByTime” />
pero se va a utilizar para realizar
</system.web>
búsquedas en las cadenas del idio- </configuration>
ma correspondiente.
Fuente 6. Ejemplo de la sección <trace>.

<configuration>
<system.web> • traceMode: Este atributo nos permite
<globalization requestEncoding=”utf-8” responseEncoding=”utf-8” indicar el modo de ordenación de los
culture=”es-ES” uiCulture=”es-ES”/> mensajes de trazas en la sección
</system.web> Información de seguimiento. Puede pre-
</configuration> sentar los valores SortByCategory y
SortByTime. Por defecto es SortByTime.
Fuente 4. Ejemplo de la sección <Globalization>. • localOnly: Indica si la información
de trazas se muestra únicamente a
Identidad de la aplicación le asignaríamos el valor de cadena vacía los clientes locales o por el con-
a los atributos name y password: trario, se muestra también a los
En la sección <identity> vamos a clientes remotos. Por defecto es
poder configurar la identidad del pro- Configuración de trazas false.
ceso que ejecuta ASP.NET en el servi-
dor. Para ello esta etiqueta nos ofrece La configuración del mecanismo de Le animo a que siga investigando las
los siguientes atributos: trazas que de ASP.NET se hace a tra- numerosas posibilidades de configura-
vés del uso de la etiqueta <trace> que tie- ción para las aplicaciones Web que ofre-
<<dotNetManía

• impersonate: Si posee el valor true indi- ne los siguientes atributos: ce ASP.NET. Lo mejor es empezar por
ca que el proceso de ASP.NET se va enabled: Este atributo indica si el observar los contenidos de los ficheros
a ejecutar bajo la identidad por defec- mecanismo de trazas se encuentra acti- de configuración.

19
Por Jesús López Méndez
(SqlRanger)

Gestión de concurrencia en ADO.NET


La concurrencia, en un entorno multiusuario, es siempre una cuestión proble-
mática, pero si además se trata de un entorno desconectado como el que se
usa en ADO.NET con sus DataSets y DataAdapters, la problemática es aún mayor
debido a la propia naturaleza desconectada del entorno.

<< Veamos,posteriormente
en primer lugar, cual es esa problemática y
qué alternativas tenemos para
Los conflictos de concurrencia no se produ-
cen solamente al actualizar un registro porque
tratarla. El problema fundamental que se nos otro usuario lo haya modificado, también ocu-
plantea son los conflictos de concurrencia. Un rren si el registro ha sido eliminado por otro usua-
conflicto de concurrencia se produce cuando un rio. Asimismo, tienen lugar cuando un usuario
usuario modifica un registro de una tabla de una intenta eliminar un registro que ha sido modifi-
base de datos y ese registro ha cambiado desde cado e incluso que ha sido eliminado. Con la
la última vez que lo leyó. Por ejemplo, conside- inserción, sin embargo, es evidente que no se pro-
remos la siguiente secuencia de sucesos: ducen conflictos de concurrencia, ya que es impo-
sible que otro usuario pueda modificar un regis-
• Los usuarios A y B leen el registro R1 de tro que aún no existe en la base de datos. En defi-
la base de datos cargándolo en un DataSet. nitiva, los conflictos de concurrencia pueden pro-
• El usuario A modifica R1 ducirse:
• El usuario A guarda R1 en la base de datos.
• El usuario B modifica R1 • Al modificar un registro
• El usuario B guarda R1 en la base de datos. • Al eliminar un registro

Y la causa del conflicto puede ser porque


dicho registro:

• Ha sido modificado desde la última vez que


se leyó.
• Ha sido eliminado desde la última vez que
se leyó.

Otro aspecto básico acerca de los conflictos


de concurrencia es la forma de detectarlos. La
técnica de detección se basa fundamentalmente
en incluir en la cláusula WHERE de la instruc-
• El usuario B recibe una excepción ción UPDATE o DELETE el valor original de
<<dotNetManía

DBConcurrencyException, indicando un con- los campos, es decir, el valor que tenían los cam-
flicto de concurrencia al haber sido modi- pos del registro cuando se leyeron de la base de
ficado R1 desde la última vez que B lo leyó. datos. Pongamos un ejemplo para aclarar ideas.

20
<< dnm.ado.net

Supongamos que estamos trabajando pos en la cláusula SET, excepto el Aún así, podríamos obtener un
con la siguiente tabla en una base de IdEmpleado que es autonumérico y por conflicto de concurrencia, pero sólo
datos de SQL Server: tanto de sólo lectura. Esto viene a en el caso de que haya sido eliminado
el registro. Un inconveniente de esta
opción es que es posible perder modi-
CREATE TABLE Empleados ( ficaciones. Si por ejemplo, los usua-
IdEmpleado INT IDENTITY(1,1) PRIMARY KEY, rios A y B leen el empleado 10, el
DNI VARCHAR(12) NOT NULL UNIQUE, usuario A modifica su nombre y lo
Nombre VARCHAR(50) NOT NULL, guarda, y luego B modifica el apelli-
Apellidos VARCHAR(50) NOT NULL
do y lo guarda, las dos actualizaciones
)
tienen éxito, pero la modificación que
hizo A se pierde, ya que el nombre es
El comando UPDATE que detec- suponer que se actualizarán todos los sobrescrito con el valor que leyó B.
ta conflictos de concurrencia sería el campos en la tabla, independiente- En ciertos sistemas, esta posible pér-
siguiente: mente de si se han modificado o no, dida de modificaciones es inaceptable
y por tanto habría que elegir otra
opción.
UPDATE Empleados Otra alternativa sería incluir en la
SET DNI=@DNI, Nombre=@Nombre, Apellidos=@Apellidos cláusula SET sólo los campos que se
WHERE IdEmpleado=@Original_IdEmpleado AND DNI=@Original_DNI AND han modificado. De esta manera, aun-
Nombre=@Original_Nombre AND Apellidos=@Original_Apellidos que sólo incluyéramos la clave pri-
maria en la cláusula WHERE, no se
perderían las modificaciones. También
Como veis, están todos los valores lo que implica una falta de optimiza- es una opción interesante incluir en
originales en la cláusula WHERE de ción. la cláusula SET sólo los campos modi-
esta instrucción parametrizada. De Sin embargo, es posible que no nos ficados, y en la cláusula WHERE la
esta manera, si ha cambiado alguno interese detectar conflictos de concu- clave primaria más el valor original de
de los campos, no se cumplirá la con- rrencia y que queramos que la actua- los campos que han cambiado, así el
dición, y por tanto la instrucción no lización se lleve a cabo independien- conflicto de concurrencia que detec-
actualizará ningún registro, o lo que temente de si el registro ha sido modi- taríamos sería en el caso de que otro
es lo mismo, el número de registros ficado o no desde la última vez que se usuario hubiera modificado alguno de
afectados será cero. Solamente la ins- leyó. En ese caso sólo incluiríamos la los campos que han sido modificados
trucción tendrá éxito, o sea, actuali- clave primaria en la cláusula WHERE. o en el caso de eliminación. Por ejem-
zará el registro, si éste no ha cambia- La instrucción UPDATE sería la plo, si los usuarios A y el B leen el
do. Así es como ADO.NET detecta siguiente: empleado 10, el usuario A modifica su
los conflictos de concurrencia, con-
cretamente un DataAdapter lanzará
una excepción DBConcurrencyException UPDATE Empleados
cuando el comando de actualización SET DNI=@DNI, Nombre=@Nombre, Apellidos=@Apellidos
afecte a cero registros. Observad que WHERE IdEmpleado=@Original_IdEmpleado
este comando incluye todos los cam-

nombre y lo guarda y el usuario B


modifica su nombre y lo guarda, el
usuario B recibe un conflicto de con-
currencia. Pero si lo que ocurre es que
el usuario A modifica el nombre y el
Los conflictos de concurrencia no se producen B el apellido, no hay conflicto de con-
currencia y las dos actualizaciones tie-
solamente al actualizar un registro porque otro usuario nen éxito.
Una última alternativa para la cláu-
lo haya modificado, también ocurren si el registro sula WHERE es incluir la clave pri-
maria más el valor original de un cam-
ha sido eliminado por otro usuario po de tipo TimeStamp que por supues-
<<dotNetManía

to tendría que formar parte de la tabla.


El funcionamiento es equivalente a
incluir los valores originales de todos

21
<< dnm.ado.net

los campos, pero resulta más eficiente ya que la ins- Empecemos primero por los conflictos que se
trucción es más corta, reduciéndose el tráfico de producen al actualizar. Si la causa es que otro usua-
red y reduciendo el trabajo del procesador de con- rio lo ha modificado podríamos tener las siguien-
sultas del servidor de base de datos. Un campo de tes alternativas:
tipo TimeStamp en SQL Server es una especie de
autonumérico de 64 bits único en toda la base de • Descartar las modificaciones y refrescar el registro
datos. No puede haber dos registros en una base de volviéndolo a leer de la base de datos. Al usuario
le avisaríamos del conflicto de concurrencia y
le daríamos la oportunidad de volver a hacer
las modificaciones.
• Refrescar sólo los valores originales sin descartar las
modificaciones. Al usuario le avisaríamos del con-
flicto. Entonces él tendría la oportunidad de
La técnica de detección se basa fundamentalmente ver las modificaciones deshaciendo cambios o
de volver a guardar con lo que forzaría la actua-
en incluir en la cláusula WHERE lización.
• Directamente forzar la actualización. Esto se
de la instrucción UPDATE o DELETE conoce como la técnica “el último que llega
gana”. En realidad esta acción no es una res-
el valor original de los campos puesta a un conflicto de concurrencia, ya que
para llevarla a cabo incluiríamos únicamente
la clave primaria en la cláusula WHERE, no
detectándose conflictos de concurrencia por
modificación.
datos con el mismo valor de TimeStamp, incluso
aunque pertenezcan a distintas tablas. Cada vez que Si la causa es que otro usuario lo ha eliminado,
se modifica un registro que tiene un campo las alternativas serían las siguientes:
TimeStamp, el valor del campo también cambia.
Debido a esto y si usamos esta alternativa, después • Volver a insertar el registro en la base de datos. En
de modificar un registro, sería necesario volver a el caso de que tengamos un autonumérico en
leer el campo TimeStamp para poder realizar más la tabla no sería posible volver a insertar el
modificaciones en el mismo registro. registro exactamente igual a como era ante-
Detectar conflictos de concurrencia en la eli- riormente.
minación es similar a la actualización, con la salve- • Eliminarlo del DataSet. Esta es la opción que
dad de que en este caso sólo podemos jugar con la más se suele utilizar.
cláusula WHERE de la instrucción DELETE.
Podríamos incluir sólo la clave primaria, en cuyo Detectar la causa del conflicto, al igual que
caso sólo obtendremos conflictos de concurrencia refrescar un registro, puede realizarse volviendo a
cuando otro usuario haya eliminado el registro. En leer tal registro de la base de datos basándose en la
la mayoría de los casos, este conflicto sencillamen- clave primaria, pero si la clave primaria puede cam-
te lo podríamos ignorar. También podríamos incluir biar, esta técnica no sirve para su propósito ya que
todos los valores originales de los campos o la cla- si ésta ha cambiado no es posible identificar el regis-
ve primaria más el TimeStamp, en cuyo caso reci- tro y no es posible determinar si el conflicto de con-
biremos un conflicto de concurrencia cuando otro currencia ha ocurrido por modificación o por eli-
usuario haya modificado o eliminado el registro. minación. Por eso sería recomendable usar claves
Una vez que tenemos decidido cómo vamos a primarias artificiales como autonuméricos o
detectar los conflictos de concurrencia y cómo GUID’s.
vamos a hacer las actualizaciones y eliminaciones,
hemos de decidir cómo los vamos a tratar, o sea, En cuanto a los conflictos de concurrencia que
qué acciones vamos a tomar en el caso de un con- se producen al eliminar un registro, podríamos tener
flicto de concurrencia. Cada conflicto de concu- las siguientes alternativas cuando la causa es por
rrencia lo trataremos de manera diferente en fun- modificación:
ción de si se ha producido al hacer una actualiza-
ción o al realizar una eliminación y en función de • Deshacer la eliminación y refrescar el registro. Al
<<dotNetManía

la causa del conflicto, esto es, si ha sido porque usuario le informaríamos del conflicto y ten-
otro usuario lo ha modificado o porque lo ha eli- dría la posibilidad de volverlo a eliminar des-
minado. pués de haber visto los cambios realizados.

22
<< dnm.ado.net

• Forzar la eliminación. En realidad


esta acción no es una respuesta a
un conflicto de concurrencia, ya
que para llevarla a cabo incluiría-
mos únicamente la clave primaria
en la cláusula WHERE con lo que
no se detectan conflictos de con-
currencia por modificación.

Por último, el conflicto de concu-


rrencia que se produce al eliminar un
registro que ha sido eliminado, gene-
ralmente puede tratarse sencillamen-
te ignorando el conflicto y eliminan-
do definitivamente el registro del
DataSet.
Como hemos visto, existen varias
alternativas para detectar y tratar los
conflictos de concurrencia. Veamos
ahora qué nos ofrece ADO.NET en
este sentido. Figura1. Opciones avanzadas de generación de instrucciones SQL.
En ADO.NET tenemos una serie
de clases, los DataAdapters, que son
los encargados de revertir las modi-
ficaciones realizadas en un DataSet del valor actual o del valor original. senta el cuadro de diálogo de la
sobre la base de datos mediante su Antes de poder invocar al método figura 1.
método Update. Los DataAdapters tie- Update de un DataAdapter tenemos Como vemos, el asistente puede
nen tres propiedades: DeleteCommand, que configurarlo correctamente, esto generar por nosotros los comandos de
UpdateCommand e InsertCommand que es, tenemos que establecerle los actualización INSERT, UPDATE y
son los comandos de actualización. comandos de actualización. Para con- DELETE. Si elegimos “Usar concu-
Estos comandos son parametrizados, figurar un DataAdapter tenemos tres rrencia optimista”, el asistente inclui-
de manera que sirvan para todas las filas alternativas: rá en la cláusula WHERE de las ins-
de un DataTable. Cuando invocamos al trucciones UPDATE y DELETE el
método Update de un DataAdapter, éste • Usar el asistente para la configu- valor original de todos los campos del
recorre todas las filas del DataTable, y ración del DataAdapter registro. Mientras que si no activamos
si la fila es una fila eliminada, ejecuta • Usar un CommandBuilder esa casilla de verificación, la cláusula
el DeleteCommand; si la fila es una fila • Configurarlo manualmente WHERE sólo incluirá la clave prima-
modificada, invoca el UpdateCommand; escribiendo nosotros mismos el ria. Si elegimos “Actualizar el con-
y si es una fila nueva, invoca al código junto de datos” el asistente añade una
InsertCommand. Si al invocar al Update- instrucción SELECT a los comandos
Command o al DeleteCommand, el Para usar el asistente, sólo tene- de actualización para refrescar el regis-
número de registros afectados es cero, mos que arrastrar un DataAdapter tro. En cualquier caso, la instrucción
el DataAdapter lanza una excepción de la ficha datos del cuadro de UPDATE incluye en la cláusula SET
DBConcurrencyException indicando que herramientas a nuestro formulario todos los campos.
se ha producido un conflicto de con- o componente y seguir sus instruc- Esta sería la instrucción UPDA-
currencia. Antes de invocar un coman- ciones. En el paso “Generar las ins- TE para nuestra tabla de ejemplo
do de actualización, el DataAdapter trucciones SQL” tenemos un botón usando concurrencia optimista. Ver
establece el valor de los parámetros del “Opciones avanzadas” que nos pre- tabla 1.
comando con los valores originales o
actuales de los campos de la fila basán-
dose en la configuración del propio
UPDATE Empleados
comando. Cada parámetro de la colec-
SET DNI=@DNI, Nombre=@Nombre, Apellidos=@Apellidos
ción Parameters de un comando tiene WHERE IdEmpleado=@Original_IdEmpleado AND DNI=@Original_DNI AND
la propiedad SourceColumn que indica Nombre=@Original_Nombre AND Apellidos=@Original_Apellidos
<<dotNetManía

el nombre del campo cuyo valor debe-


rá copiarse al parámetro, y la propie-
dad SourceVersion que indica si se trata Tabla 1

23
<< dnm.ado.net

Y esta sería la instrucción UPDATE sin usar la ciones, que sea capaz de gestionar los conflictos de
concurrencia optimista: concurrencia y que disponga de todas las opciones

UPDATE Empleados
SET DNI=@DNI, Nombre=@Nombre, Apellidos=@Apellidos
WHERE IdEmpleado=@Original_IdEmpleado

mencionadas en este artículo. Podéis encontrar un


Como hemos dicho anteriormente, también DataAdapter para SQL Server (SqlRanger.SqlAdapter)
podemos usar un CommandBuilder. Este sería el escrito por mí en la web de la revista o en mi propia
código a usar para nuestra tabla de ejemplo: página web: http://sqlranger.com/descargas.aspx.

SqlDataAdapter Adapter = new SqlDataAdapter(“SELECT * FROM Empleados”, Connection);


SqlCommandBuilder CommandBuilder = new SqlCommandBuilder(Adapter);
Adapter.UpdateCommand = CommandBuilder.GetUpdateCommand();
Adapter.InsertCommand = CommandBuilder.GetInsertCommand();
Adapter.DeleteCommand = CommandBuilder.GetDeleteCommand();

Este DataAdapter es completamente gratis y se


Las instrucciones UPDATE y DELETE serían incluye el código fuente así como un ejemplo de su
equivalentes a las generadas por el asistente usan- uso. El SqlRanger.SqlAdapter tiene propiedades espe-
do concurrencia optimista y sin actualizar el con- cíficas para tratar la concurrencia. Entre las que se
junto de datos. incluyen:
La alternativa de configurar manualmente el
DataAdapter no es muy recomendable, ya que • UpdateCriteria: Determina los campos a incluir
requiere escribir bastante código y la funcionalidad en la cláusula WHERE de la instrucción
obtenida es exactamente igual a la conseguida usan- UPDATE. Puede tomar los siguientes valores:
do el asistente. Además es posible que cometamos • All: Se incluirán los valores originales de
algún error al escribir el código, mientras que el todos los campos.
asistente no los comete. • Key: Se incluirá sólo la clave primaria.
Como vemos, el DataAdapter sólo nos deja la posi- • Modified: Se incluirá la clave primaria más
bilidad de incluir en la cláusula WHERE de las ins- los valores originales de los campos modi-
trucciones UPDATE y DELETE o bien la clave pri- ficados.
maria, o bien todos los campos. No tenemos las otras • TimeStamp: Se incluirá la clave primaria más
alternativas que se mencionan en este artículo. Además el valor original del campo TimeStamp si es
en la cláusula SET de la instrucción UPDATE, sólo que existe.
podemos incluir todos los campos, no tenemos la
opción de incluir sólo los modificados. • UpdateColumns: Determina qué campos apa-
Por otra parte, ADO.NET sólo da soporte para recerán en la cláusula SET de la instrucción
la detección del conflicto de concurrencia, no hay UPDATE. Puede tomar los siguientes valores:
nada que nos ayude a gestionarlo, por lo que ten- • All: Se incluyen todos los campos.
dremos que escribir nosotros mismos el código • Modified: Se incluyen sólo los campos modi-
necesario. ficados.
El código de ejemplo del fuente 1 muestra como
gestionar conflictos de concurrencia, refrescando • DeleteCriteria: Determina los campos a incluir
el registro si ha sido modificado y eliminándolo si en la cláusula WHERE de la instrucción DELE-
ha sido eliminado. TE. Puede tomar los siguientes valores:
Como vemos, gestionar los conflictos de concu- • All: Se incluirán los valores originales de
rrencia no es trivial y repetir el mismo código una y todos los campos.
otra vez para cada caso es muy laborioso y pesado. • Key: Se incluirá sólo la clave primaria.
<<dotNetManía

Una buena alternativa a los DataAdapters que vie- • TimeStamp: Se incluirá la clave primaria más
nen incluidos en .NET Framework, es escribir nues- el valor original del campo TimeStamp si es
tro propio DataAdapter que no tenga estas limita- que existe.

24
<< dnm.ado.net

public void Guardar(DataTable Empleados)


{
// creamos un adapter para realizar la actualización
SqlDataAdapter Adapter = new SqlDataAdapter(“SELECT * FROM Empleados”, this.cn);

// usamos un command builder para configurar los comandos de actualización


SqlCommandBuilder CommandBuilder = new SqlCommandBuilder(Adapter);
Adapter.UpdateCommand = CommandBuilder.GetUpdateCommand();
Adapter.InsertCommand = CommandBuilder.GetInsertCommand();
Adapter.DeleteCommand = CommandBuilder.GetDeleteCommand();

// este comando nos sirve para refrescar un registro


SqlCommand Resync = new SqlCommand(“SELECT * From Empleados WHERE IdEmpleado=@IdEmpleado”, this.cn);
Resync.Parameters.Add(“@IdEmpleado”, SqlDbType.Int);

try
{
Adapter.Update(Empleados);
}
catch ( DBConcurrencyException ex )
{
// Nuestra respuesta a un conflicto va a ser refrescar el registro
Adapter.SelectCommand = Resync;
Resync.Parameters[“@IdEmpleado”].Value = ex.Row[“IdEmpleado”, DataRowVersion.Original];

// el método Fill buscará el registro en el DataTable


// por clave primaria (IdEmpleado) y lo “refrescará”
if ( Adapter.Fill(Empleados) == 0 )
// la causa del conflicto es que ha sido eliminado (Fill devuelve cero registros)
{
if ( ex.Row.RowState == DataRowState.Deleted )
{
// en este punto tenemos un conflicto de concurrencia
// al eliminar un registro porque ha sido eliminado.

// Eliminamos definitivamente el registro


ex.Row.AcceptChanges();
// ignoramos el conflicto y seguimos con la actualización
Guardar(Empleados);
}
else
{
// en este punto tenemos un conflicto de concurrencia
// al modificar un registro porque ha sido eliminado

// Eliminamos el registro
// y volvemos a lanzar la excepción
ex.Row.Delete();
ex.Row.AcceptChanges();
throw ex;
}
}
else
{
// la causa del conflicto es que ha sido modificado

// Si el conflicto ha sido al eliminar el registro


// Fill ya lo habrá “recuperado” y refrescado.
// Aparecerá el registro con el error

// Si el conflicto ha sido al modificar el registro


// Fill lo habrá “refrescado”. Y aparecerá el registro
// con el error

// sólo hay que volver a lanzar la excepción


throw ex;
}
}
<<dotNetManía

Fuente 1. Ejemplo de gestión de conflictos de concurrencia

25
<< dnm.ado.net

• ConflictUpdatingChangedAction: • Delete: Elimina definitivamen- El SqlRanger.SqlAdapter genera auto-


Determina la acción a realizar en te el registro del DataSet. máticamente los comandos de actualiza-
caso de un conflicto de concu- • Insert: Vuelve a insertar el re- ción y el ResyncCommand, no siendo nece-
rrencia al actualizar un registro gistro en la base de datos. sario proporcionárselos. Para ello hace
porque haya sido modificado des- • NoAction: No hace nada. uso del SqlRanger.CommandBuilder.
de la última vez que se leyó. Puede
tomar los siguientes valores: • ConflictDeletingChangedAction:
• NoAction: No hace nada. Determina la acción a realizar en Conclusión
• ResyncAllValues: Refresca todos caso de un conflicto de concu-
los valores del registro, volvién- rrencia producido al eliminar un La concurrencia es un tema proble-
dolo a leer de la base de datos. registro porque haya sido modi- mático en ADO.NET dada su natura-
• ResyncOriginalValues: Refresca los ficado desde la última vez que se leza desconectada. Existen varias opcio-
valores originales del registro, leyó. Puede tomar los siguientes nes para detectar y tratar los conflictos
leyéndolo de la base de datos. valores: de concurrencia. Cada una de estas
• NoAction: No hace nada. opciones tiene sus ventajas e inconve-
• ConflictUpdatingDeletedAction: • ResyncAllValues: Refresca el nientes y es necesario elegir cuidadosa-
Determina la acción a realizar en registro, volviéndolo a leer de mente la más adecuada para el sistema
caso de un conflicto de concurren- la base de datos. en cuestión. ADO.NET da soporte
cia producido al actualizar un regis- • ResyncCommand: Comando limitado para la gestión de la concu-
tro porque haya sido eliminado des- parametrizado basado en cla- rrencia, siendo una buena alternativa
de la última vez que se leyó. Puede ve primaria utilizado para escribir nuestro propio DataAdapter para
tomar los siguientes valores: refrescar un registro. superar las limitaciones.

¿Qué es qué?
¿Qué es qué?
¿Qué es Whitehorse? Indy está inmerso en la versión 2.0 de la suite Microsoft System
Center para la que aún no hay fecha prevista de salida, ni tan siquiera
Whitehorse es el nombre en clave del software que se incluirá en una aproximación. La versión actual, la 1.0 llamada System Center 2005
Visual Studio 2005 y que aporta herramientas de diseño model-driven es la primera suite de gestión integrada para el Windows Server System
dirigida a los arquitectos de software, enlazando el modelo conceptual e incluye el System Management Server 2003, Microsoft Operations
al código. Manager 2005 y el nuevo sistema común de reporting.
Tendremos más información en el devdays que se celebrará en San Diego, Se habló de él en el Summit celebrado en Las Vegas el pasado mes de
California entre el 23 y el 28 de Mayo (http://www.microsoft.com/semi- marzo. La web del Summit 2004: http://www2.mms2004.com.
nar/teched2004). En Europa se celebrará en Ámsterdam, Holanda, entre el Más información en Microsoft Watch: http://www.microsoft-watch.com
29 de Junio y el 2 de Julio (http://www.microsoft.com/europe/teched). y en el sito Betanews http://www.betanews.com/article.php3?sid=1079576470
Entretanto puede descargarse un video demostrativo de la web de
MSDNTV en http://msdn.microsoft.com/msdntv
¿Qué es Lonestar?
¿Qué es Laguna? Aparte de un mítico grupo de rock catalán de los años 70, Lonestar es
el nombre en clave de la próxima versión del sistema operativo de Microsoft
En el Microsoft Mobile DevCon Conference 2004 celebrado en para Tablet PC. Si bien se iba a vender como un add-on para los usuarios
San Francisco entre el 23 y el 27 de marzo se habló de “Laguna”, nom- de Tablet PC, finalmente será incluido dentro de Windows XP SP2. Tendrá
bre en clave del SQL Server CE 3.0. Esta versión se verá retrasada igual un nuevo SDK para desarrolladores e integración con Office 2003.
que la versión completa, el SQL Server 2005. Según nuestras noticias,
ambas versiones saldrán juntas, si bien la versión beta 1 de Laguna esta-
rá disponible cuando esté la beta 2 de Yukon. ¿Qué es Windows XP Reloaded?
La web del Mobile DevCon Conference 2004 está en: Windows XP Reloaded es el nombre en clave para la versión de
http://www.microsoftmdc.com. Windows XP que hará de puente entre la actual y Longhorn.
Puede ver información de la versión actual de SQL Server CE 2.0
en: http://www.microsoft.com/sql/ce.
¿Qué es Symphony y Harmony?
Symphony es el nombre en clave de la próxima versión de Windows
¿Qué es Indy? XP Media Center Edition el cual está basado en XP SP2. Una versión
Indy es el nombre en clave de una nueva herramienta de gestión previa a Windows XP Media Center Edition 2004. Harmony es el nom-
desarrollada por Microsoft Research y que se comercializará por la divi- bre en clave del próximo Windows XP Media Center Edition 2004.
<<dotNetManía

sión Enterprise Management de Microsoft. Simula un centro de datos Incluirá soporte para High Definition Televisión, soporte para múl-
empresarial derivado del modelo de hardware, software y los sistemas tiples sintonizadores, soporte para diferentes formatos de grabación de
de servidores del cliente. vídeo y radio.

26 noticias.noticias.noticias.noticias
Por Mario del Valle y
Miguel Katrib
Grupo Weboo
Universidad de La Habana

El poder de la reflexión en .NET


Componentes y Reflexión
antes de .NET

<< Entre otras razones .NET supera a tecnolo- Las tecnologías orientadas a componentes
gías de componentes precedentes por la como COM y CORBA utilizan lenguajes de
transparencia con la que integra código y Definición de Interfaces (IDLs) para especifi-
car tipos. Pero los IDLs se basan sólo en las sig-
metadatos favoreciendo con ello la metapro-
naturas de los métodos y no incluyen más infor-
gramación. Este trabajo muestra cómo usan- mación semántica que la que se puede deducir
do reflexión (reflection) se define un conver- de los tipos y nombres de los métodos y de sus
sor de tipos que permite a partir de un obje- parámetros.
to, el cual comparte una misma funcionalidad Java alivia la limitación anterior porque la
noción de tipo definido por un interface1 está
con un interface, obtener un objeto proxy
incluida en el propio lenguaje de programación
equivalente en funcionalidad al original pero Java. Sin embargo, la tecnología Java tiene las
que garantiza ser subtipo de dicha interface. debilidades siguientes:
De este modo el objeto proxy puede ser uti-
lizado como si estáticamente hubiese decla- • Debido a su enfoque monolingüístico,
una componente en Java sólo se puede
rado que implementa el tipo interface. Con
usar por otra componente Java. No hay
ello se facilita la adaptabilidad del software y

<<
una forma simple de conectar una com-
la factorización de código ya existente para ponente Java con una componente escri-
poder aprovechar una funcionalidad común. ta en otro lenguaje o viceversa.
• Un buen aporte de Java es que permite
La solución propuesta permite ilustrar ade- incluir información extra en una compo-
más la existencia de un peligroso agujero de nente por vía de determinados convenios
en la escritura de comentarios especiales.
seguridad en el sistema de tipos de .NET, el Pero el mecanismo de reflexión de Java
cual lamentablemente no es controlado por no ofrece recursos para recuperar esta
el CLR.Esta falla permitiría la escritura de códi- información que se ha incluido en una
go malicioso aún ejecutando bajo el supuesto componente en forma de comentarios.
modo seguro del código administrado. Los desarrolladores deben conocer y tra-
bajar directamente con la forma en que
internamente estos comentarios están den-
tro de un fichero Java byte code. De modo
que un cambio en esta forma de repre-
sentación implicaría cambios en las apli-
caciones que utilizan estos comentarios.
<<dotNetManía

1 Para evitar confusiones hemos mantenido el término en inglés interface para referirnos a una de las formas de tipo en .NET. Lamentablemente
éste término es malinterpretado y usado incorrectamente en castellano cuando en ocasiones se escribe “interfase” o cuando se usa “interfaz” con
el que muchos lectores identifican el concepto de interfaz gráfica de usuario (GUI).

27
<< dnm.plataforma.net

Componentes y Reflexión cionalidad que pueda trabajar con cual- o


quiera de estos tipos de comportamiento
en .NET “similar”? C c = new C();
Las componentes de software en Supongamos que tenemos dos tipos ...
.NET se basan en el concepto de B y C que tienen un subconjunto de NewMethod(c);
ensamblado (assembly). métodos f1, f2, … fn comunes a ambos
• Un ensamblado en .NET es neu- pero desafortunadamente estos tipos B Los principales defectos de esta solu-
tral desde el punto de vista del len- y C no fueron concebidos como cla- ción son el alto nivel de dependencia y
guaje. Un ensamblado .NET se ses derivadas de una clase base común el bajo grado de escalabilidad debido a
puede utilizar de modo simple des- A (o como implementaciones de un tipo la replicación de código que esto impli-
de otro ensamblado con indepen- interface común IA). ca. Si queremos que un nuevo tipo D
dencia del lenguaje fuente en que class B{ con funcionalidad similar a la de B y C
haya sido escrito cada uno. public T1 f1(); pueda usarse como parámetro de
• Un ensamblado en .NET contiene ... NewMethod habría que escribir un nuevo
código y metadatos. Estos metada- public Tn fn(); NewMethod con un código similar al de
tos pueden ser extraídos de la com- //...other methods los ya existentes sólo para poder acep-
}
ponente mediante los recursos de tar un parámetro del nuevo tipo D.
class C{
reflexión que el propio .NET ofre- public T1 f1();
ce. De modo que las aplicaciones ... Solución 2: Escribir un único método
que extraen y procesan la informa- public Tn fn();
que haga una selección múltiple
ción inmersa en un ensamblado en ...//other methods
forma de metadatos no dependen } Otro enfoque es escribir un único
de cambios en el formato físico en ¿Cómo implementar una nueva fun- NewMethod que se base en que el pará-
que se representan estos metadatos. cionalidad NewMethod que sea capaz de metro formal está declarado estática-
• .NET introduce los atributos, una trabajar con objetos que tengan esta fun- mente como del tipo raíz Object y lue-
nueva creación para que los desa- cionalidad común f1, f2, … fn inde- go aplicar internamente la funcionali-
rrolladores puedan añadir sus pro- pendientemente si los objetos son de dad correspondiente según el tipo del
pios metadatos. Los atributos son a tipo B o de tipo C ? parámetro real en ejecución
fin de cuentas objetos y por tanto
void NewMethod(Object x){
pueden gozar de muchos de los Solución 1: Replicar la nueva funciona- ...
beneficios que el modelo Orientado
lidad para cada uno de los tipos B y C if (x is B)
a Objetos soporta. ((B)x).f1();
Como en .NET disponemos de else if (x is C)
Con el presente trabajo comenzare- sobrecarga de métodos la solución más ((C)x).f1();
mos a ir descubriendo el uso de la refle- tradicional fuerza a reescribir la nueva ...
xión en .NET y la utilidad de los atri- funcionalidad reescribiendo el mismo if (x is B)
butos y lo que la mezcla de ambos pue- código para usar cada uno de los tipos ((B)x).fn();
de significar para potenciar las capaci- ( B y C en nuestro ejemplo). else if (x is C)
((C)x).fn();
dades de metaprogramación de .NET
void NewMethod(B x){ }
...
Factorizando tipos en .NET x.f1();
Pero esta solución tiene también un
...
alto grado de dependencia y baja escala-
Una tarea frecuente en programa- x.fn();
bilidad. Si se desea incorporar un nuevo
ción consiste en reproducir un com- }
tipo D hay que reprogramar el NewMethod
portamiento similar mediante diferen- ya existente (para lo cual habría que dis-
tes implementaciones. Si el desarrolla- void NewMethod(C x){
poner del código fuente) para introducir
dor puede prever esta situación lo usual ...
internamente las nueva alternativa
debe ser entonces definir un tipo raíz x.f1(); if (x is D)
(sea definido por una clase o por un ... ((D)x).fn();
interface en .NET) y definir los dife- x.fn();
rentes tipos que heredan (o implemen- }
tan) del tipo raíz. Si bien esta variante de solución no
Pero qué podemos hacer si varios Esta nueva funcionalidad se debe replica código como la anterior, es inefi-
tipos ya existentes tienen un comporta- invocar entonces en la forma ciente debido a las preguntas para deter-
<<dotNetManía

miento común pero no han sido defini- B b = new B(); minar el tipo que dinámicamente tendrá
dos con una tal raíz común. ¿Qué hacer ... el objeto que se pasa como parámetro y
si queremos incorporar una nueva fun- NewMethod(b); a las operaciones de conversión o mol-

28
<< dnm.plataforma.net

deo (casting) para poder interpretar al parámetro formal De este modo el código cliente interesado en usar
como del tipo deseado. Pero es más, este enfoque no es la funcionalidad NewMethod para un objeto de tipo B
aplicable si D fuese un tipo creado dinámicamente en que tiene la funcionalidad expresada por IA debe
tiempo de ejecución porque no dispondríamos de una seguir el siguiente patrón
definición estática de D para colocar estáticamente el
segmento de código anterior dentro de NewMethod. B b = new B();
...
Una solución basada en reflexión IA a = (IA)Caster.Cast(b, typeof(IA));
NewMethod(a);
Una mejor solución se basa en crear dinámica-
mente usando reflexión (lo que se verá en la sección La Figura 1 nos ilustra este escenario
siguiente) un tipo proxy que emule al original pero
que sí especifique definir al tipo interface que expresa
la comunalidad. Es decir, una vez que el desarrolla-
dor interesado detecte que hay un comportamiento
similar en los tipos B y C debe definir entonces un
tipo IA que exprese este comportamiento común
interface IA{
T1 f1();
...
Tn fn();
}

El nuevo código NewMethod que quiere aprovechar


esto común debe escribirse basado en que el paráme-
tro formal sea del tipo interface IA
void NewMethod(IA x){
x.f1();
...
Figura 1
x.fn();
}
Usando reflexión y las capacidades de generación de
El problema que hay que resolver es cómo lograr código que ofrece .NET, el método Cast crea dinámi-
que los objetos de tipo B o C, o de un nuevo tipo D camente un tipo IAProxyFor_B que implementa IA y
que pueda entrar en escena más adelante, puedan ser que actúa como proxy de la funcionalidad común que el
pasados como parámetros a este método aún cuando tipo B tiene con IA. El tipo IAProxyFor_B es generado
el tipo de estos no indique implementar IA. con un patrón cuyo código IL equivaldría a un código
A fin de cuentas no debería ser el código de NewMethod fuente C# como el que se muestra a continuación
quien tiene que cargar con esa responsabilidad. Si que-
remos pasarle un x a NewMethod debería ser el código que class IAProxyFor_B : IA{
llama el que pueda indicar algo así como: interprétame a B realTarget;
éste x como de tipo IA aún cuando el tipo estático de x no public IAProxyFor_B(B x){
hubiese sido definido como que implementa a IA. realTarget=x;
Para lograr esto definimos un método Cast. El }
método Cast recibe como primer parámetro el obje- public T1 f1(){
to original y como segundo parámetro el tipo interfa- return realTarget.f1();
ce como el que se desea que el primer parámetro sea }
interpretado. El método Cast creará dinámicamente ...
un tipo proxy que emula al tipo del objeto original public Tn fn(){
pero que indica implementar al tipo interface y devol- return realTarget.fn();
verá como respuesta el tal objeto proxy. }
class Caster{ }
public static object
Cast(object x, Un ejemplo real en las Windows Forms
<<dotNetManía

Type interfaceType){
... Un escenario común en las GUIs es hacer una
} selección de un elemento entre varios de una lista.
}

29
<< dnm.plataforma.net

Habitualmente se usa para este fin un ComboBox o un Si lo que se quiere es aplicar este método con un
ListBox. Suponga que queremos un método ComboBox, bastaría con hacer:
Configure que pueda trabajar tanto para un ComboBox
como para un ListBox. Habría que escribir dos ComboBox combo = new ComboBox();
copias muy similares del tal método que sólo difie- ...
ren en el tipo del parámetro (Fuente 1) Configurate((IListControl)Caster.Cast(combo,
En un caso como este sería conveniente tener una typeof(IListControl)));
interfaz IListControl que “factorizara” el comporta-

void Configure (ComboBox control){


control.BeginUpdate();
control.SelectedIndexChanged += new EventHandler(someMethod);
control.Items.Add(“Default”);
control.Items.Add(“Auto”);
control.Text = “Default”;
control.Sorted = true;
control.EndUpdate();
}

void Configure (ListBox control){


control.BeginUpdate();
control.SelectedIndexChanged += new EventHandler(someMethod);
control.Items.Add(“Default”);
control.Items.Add(“Auto”);
control.Text = “Default”;
control.Sorted = true;
control.EndUpdate();
}

Fuente 1

miento común de ComboBox y ListBox que nos inte- Para el ListBox lo mismo:
resa utilizar:
ListBox list = new ListBox();
interface IListControl{ ...
object SelectedItem{ Configurate ((IListControl) Caster.Cast(list.
get; set; typeof(IListControl)));
}
int SelectedIndex {
get; set; Emisión de código IL usando reflexión
}
IList Items{ get;}
y Emit
string Text {get; set;} Otra de las potencialidades de .NET combina-
bool Sorted { get; set; } das con la reflexión son los recursos para generar
void BeginUpdate(); código dinámicamente en tiempo de ejecución,
void EndUpdate(); código que incluso puede ser ejecutado a su vez
void Refresh(); durante de la propia ejecución de quién lo creó (lo
event EventHandler que es el caso del tipo proxy explicado anterior-
SelectedValueChanged; mente). Para esto último .NET tiene en su libre-
event EventHandler ría un namespace Reflection y dentro de este a su
SelectedIndexChanged; vez el namespace Emit. Ilustraremos en esta sección
} cómo usando estos recursos el método castTo pue-
De este modo sólo habría que escribir un único de generar el tipo proxy del que hablamos en las
un método Configure: secciones anteriores.
Para generar un tipo dinámicamente primero
<<dotNetManía

void Configure (IListControl


control){ habría que generar un ensamblado donde colocar al
//... tal tipo (Fuente 2)
}

30
<< dnm.plataforma.net

Luego a través de este objeto los métodos del proxy. Note que Luego con cada methodBuilder
asmBuilder se genera un módulo y este método recibirá como pará- se emitirá el código IL correspon-
dentro del módulo el tipo deseado metros el tipo interface al que se diente al cuerpo del método. Las ins-
quiere forzar la conversión (cast), el trucciones (Fuente 5) generan el

AppDomain domain = AppDomain.CurrentDomain;


AssemblyName strongName = new AssemblyName();
strongName.Name = assemblyName;
asmBuilder = domain.DefineDynamicAssembly(strongName, access);

Fuente 2

modBuilder = objeto de tipo TypeBuilder para código IL para poner en la pila el


asmBuilder.DefineDynamicModule( emitir el código dentro del tipo que objeto original realTarget envuelto
moduleName); vamos a “rellenar” y el objeto de por el proxy. Y las instrucciones
tipo FieldInfo que se ha crea-
Un bosquejo del método castTo, do para contener la información de OpCode callCode =
que es el que realizará la operación la variable de instancia que dentro OpCodes.Call;
de conversión, se muestra en el del proxy referirá al objeto original.
if (coreMethod.IsVirtual)
Fuente 3 Note que se hace un bucle en el
callCode=OpCodes.Callvirt;
Por razones de espacio no des- que se recorren todos los métodos
cribiremos la implementación del del tipo interface para ir emitiendo

static object castTo(object target, Type interfaceType)


{
Type proxyType =
TypeBuilder proxyTypeBuilder =
modBuilder.DefineType
(
interfaceType.Name + “ProxyFor_” + target.GetType().Name,
TypeAttributes.Class | TypeAttributes.Public,
typeof (object), //Base type
new Type[] {interfaceType} //Implemented interface types
);
FieldInfo realTarget =
proxyTypeBuilder.DefineField(“realTarget”, target.GetType(), FieldAttributes.Private);
ConstructorInfo ctor = EmitCtor(proxyTypeBuilder, realTarget);
EmitMethods(interfaceType, proxyTypeBuilder, realTarget);
proxyType = proxyTypeBuilder.CreateType();
return Activator.CreateInstance(proxyType, new object[] {target});
}

Fuente 3

método EmitCtr que es el encar- los métodos correspondientes, a tra- generator.EmitCall(callCode,


gado de generar el código corres- vés del proxyTypeBuilder, dentro realMethod, null);
pondiente al constructor del tipo del nuevo tipo proxy generator.Emit(OpCodes.Ret);
proxy que se está creando. A través del objeto proxyType- generan el código IL que hará la
Veamos con más detenimiento Builder de tipo TypeBuilder se llamada al método original a través
<<dotNetManía

la implementación del método emitirá el código de los métodos del objeto que estará en el tope de la
EmitMethods (Fuente 4) que es el correspondientes al nuevo tipo que pila y el código IL para retornar a su
método que generará cada uno de se está generando. vez al regresar de esta llamada.

31
<< dnm.plataforma.net

static void EmitMethods(Type interf, TypeBuilder proxyTypeBuilder,


FieldInfo realTarget)
{
MethodInfo[] methods = interf.GetMethods();
foreach (MethodInfo mi in methods)
{
Type[] argsTypes = getTypesOf(mi.GetParameters());
MethodBuilder methodBuilder =
proxyTypeBuilder.DefineMethod(mi.Name,
MethodAttributes.Public | MethodAttributes.Virtual, mi.ReturnType,
argsTypes);
MethodInfo realMethod = realTarget.FieldType.GetMethod(mi.Name, argsTypes);
ILGenerator generator = methodBuilder.GetILGenerator();
generator.Emit(OpCodes.Ldarg_0);
generator.Emit(OpCodes.Ldfld, realTarget);
for (int i = 0; i < argsTypes.Length; i++)
generator.Emit(OpCodes.Ldarg, i+1);
OpCode callCode = OpCodes.Call;
if (realMethod.IsVirtual) callCode = OpCodes.Callvirt;
generator.EmitCall(callCode, realMethod, null);
generator.Emit(OpCodes.Ret);
}
}

Fuente 4 Generación de cada uno de los métodos del tipo proxy creado por el conversor

MethodInfo realMethod = realTarget.FieldType.GetMethod(mi.Name, argsTypes);


ILGenerator generator = methodBuilder.GetILGenerator();
generator.Emit(OpCodes.Ldarg_0);
generator.Emit(OpCodes.Ldfld, realTarget);
for (int i=0; i < argsTypes.Length; i++) generator.Emit(OpCodes.Ldarg, i+1);

Fuente 5

¿Una solución más eficiente? class IATwinOf_B : IA{ Las capacidades del Emit permi-
/*... The same variables as ten generar un tipo (IATwinOf_B) con
Ciertamente esta solución, para apro- in B las mismas variables y los mismos
vechar una comunalidad vía proxy, impli- ... nombres que otro tipo (B). Pero para
A constructor to do
ca una llamada extra porque por cada lla- duplicar los métodos de B en
the copy from B
mada de la forma x.f() dentro de */
IATwinOf_B hace falta poder “copiar”
NewMethod el proxy llamará al target.f() public T1 f1(){ el código IL de los métodos origina-
del objeto que ha sido “envuelto” por el /* ... The same IL les de B en los métodos correspon-
proxy Pero este pequeño precio en ren- code as the IL dientes (los mismos nombres y la mis-
dimiento será compensado con la adap- code for f1 in B ma signatura) de IATwinOf_B.
tabilidad del código resultante. */ Desafortunadamente, parece que
Para evitar esta llamada extra se } argumentando protección de derechos
podría intentar crear un tipo que haga public Tn fn(){ de autor, Microsoft no incluye en las
/* ... The same IL
las veces de un duplicado del tipo B en capacidades de reflexión ninguna vía
<<dotNetManía

code as the IL
lugar de un tipo que haga de proxy de code for fn in B
para hacer un tal “cut and paste” del
B. El objeto duplicado sería una “copia” */ código. Este no es un argumento muy
que sí implementaría la interface IA } convincente porque la inclusión de una

32
<< dnm.plataforma.net

capacidad tal en la reflexión podría estar ción Ret en el IL, el tipo del objeto que class Account
controlada personalizando la política de va a estar en el tope de la pila coincida {
seguridad de código. De hecho no tie- con el tipo de retorno del método den- private int balance;
ne que considerarse una violación de tro del cual está dicha operación Ret. public int Balance
derechos de autor que un programador Note en la descripción de la sección {
aplicase una facilidad similar a un anterior que el tipo del objeto que que- get{ return balance;}
ensamblado generado por él mismo o dará en el tope de la pila es el tipo del }
por otro programador de su propio objeto devuelto por el método original. //...other methods
equipo o empresa que le haya concedi- Es este método original a quien se lla- }
do tal privilegio. ma según el código generado con
Claro el lector puede pensar que si Definimos también un tipo con la
se tienen tales privilegios entonces tam- generator.EmitCall(callCode, misma variable pero pública
bién pueda disponerse del código fuen- realMethod, null);
te original de B y entonces porqué no class UnprotectedAccount
reescribir B para indicar que imple- Sin embargo el Ret se ha generado {
menta a IA dentro del método emitido a través de public int balance;
}
class B: IA{
MethodBuilder methodBuilder = Se define ahora un tipo con un
/*...the same source text
proxyTypeBuilder.DefineMethod método que recibe un objeto Account y
as in the previous B
(mi.Name, lo devuelve
*/
MethodAttributes.Public |
}
MethodAttributes.Virtual, class Naive{
En contra de esta opción puede mi.ReturnType, public Account
decirse que no es lo mismo ceder dere- argsTypes); ReturnMyself(Account x){
chos de autor para que nos dupliquen el return x;
código IL que para que nos usen el fuen- y que como se indica tiene como tipo }
te2 ya que esto último muestra más fácil- de retorno el tipo mi.ReturnType que es }
mente la lógica utilizada. Pero permitir el tipo de retorno del método corres-
hacer cambios en el fuente, por simple pondiente en el tipo interface. De modo Con un conversor como el que se ha
que fuesen estos cambios, es dejar una que si en la interface y en el objeto original propuesto anteriormente en este traba-
puerta abierta a otras modificaciones y dos métodos difieren sólo en el tipo de retor- jo se podría utilizar un tipo Malicious
por tanto contrario al principio de “ocul- no esto no se detecta. para recibir un objeto Account y devol-
tar información” que una buena pro- Esto significa un serio agujero de ver el mismo objeto pero ¡interpretado
gramación orientada a objetos debe pro- seguridad en el sistema de tipos de como UnprotectedAccount!
mulgar. Además de la cascada de recom- .NET, aún ejecutando bajo el supues-
pilaciones que esto pude provocar. to modo seguro (safe) del código admi- interface Malicious{
nistrado (managed code). El ejemplo a UnprotectedAccount
Un agujero de seguridad en el continuación muestra como aprove- ReturnMyself(Account x);
chando esta debilidad se podría ¡acce- }
sistema de tipos de .NET der a las partes privadas de un objeto!
Lamentablemente el CLR de .NET Suponga que tenemos un tipo Account Si se ejecuta el Fuente 6 se podría
no controla, a la hora de hacer la gene- en el que la variable de instancia balan- acceder de esta forma a la variable pri-
ración JIT, que al encontrar una opera- ce es privada: vada balance del objeto original.

Account myAccount = new Account(1000);


Naive innocent = new Naive();
Malicious hacker = (Malicious) Caster.Cast(innocent, typeof(Malicious));
UnprotectedAccount theSameAccount = hacker.ReturnMySelf(myAccount);
theSameAccount.balance -= 999;
Console.WriteLine(“My Balance is “ + myAccount.Balance);

Fuente 6
<<dotNetManía

2 Aunque las capacidades de la propia reflexión nos permiten prácticamente reproducir el texto fuente de un ensamblado también hay ya
utilitarios para ofuscar el código IL y dificultar tal reproducción

33
<< dnm.plataforma.net

static bool CheckConformance(Type implementingType, Type interfaceType)


{
if (!interfaceType.IsInterface)
throw new ArgumentException(“Type parameter must be an interface type”);
foreach (MethodInfo method in interfaceType.GetMethods())
{
bool present = false;
foreach (MethodInfo implMethod in implementingType.GetMethods())
{
if (method.ToString().Equals(implMethod.ToString()))
{
present = true; break;
}
}
if (!present) return false;
}
return true;
}

Fuente 7 Verificación de que un tipo implementa todos los métodos existentes en un tipo interface

if (realMethod.ReturnType != mi.ReturnType)
throw new Exception(“Invalid casting. Methods have different returntypes:”
+ mi.ReturnType.Name + “, “ + realMethod.ReturnType.Name);

Fuente 8

¡y lo que se escribirá será! zarse para ahorrar trabajo de réplica de programación.


Muy probablemente, con el ánimo de no inundar la
My Balance is 1 BCL con demasiadas interfaces que expresen todas
las factorizaciones posibles, tales interfaces no fueron
Realmente en nuestro conversor Caster este pro- incluidas en la BCL. La solución mostrada en este tra-
blema no tiene por qué ocurrir si antes de invocar bajo permite a cada programador lograr el efecto de
a EmitMethods para emitir el código IL para los la tal factorización sin necesidad de que esto estuvie-
métodos, se verifica que el tipo que se está emi- se preconcebido en el diseño original de la BCL (tal
tiendo pueda considerarse como que implementa y como se ilustró para el ejemplo de las Windows
el tipo interface (ver método CheckConformance en Forms).
Fuente 7) verificando también que coincidan los Con este artículo mostramos a su vez la poten-
tipos de retorno de los métodos. Obviamente este cialidad de la reflexión y de la generación de tipos
no sería el caso del tipo Naive y del tipo Malicious en tiempo de ejecución. Esta capacidad nos permi-
porque ambos métodos ReturnMySelf difieren en te hacer metaprogramación al poder implementar y
el tipo de retorno. aplicar patrones, como el ejemplificado para la fac-
El problema también podría haberse solucionado torización de tipos, de modo transparente para el
si incorporamos antes de generar el IL de los méto- programador.
dos un código como se muestra en el Fuente 8. Para lograr lo anterior no hay que cometer ningu-
Pero en ambas soluciones esta verificación queda na violación de tipos como la que se ha ilustrado en este
a voluntad del programador y no del CLR, por lo que trabajo. Sin embargo, como se ha explicado, el CLR
lamentablemente se puede escribir un conversor ¡que no verifica, ni exige que el código generado verifique,
pueda impunemente cometer la violación! Y esa no que no se cometa esta violación. Esperamos que esta
es la máxima que pretende .NET con el código admi- falla sea solucionada antes que programadores malin-
nistrado. tencionados hagan un uso inadecuado de la misma.
La combinación del uso de atributos para incor-
Conclusiones porar metadatos en un ensamblado y la capacidad del
reflexión para recuperar y analizar los mismos, gene-
<<dotNetManía

Las Windows Forms y en general gran parte de rando incluso código al vuelo en tiempo de ejecución,
la BCL (Basic Common Library) de .NET están pla- forman un potente recurso de metaprogramación que
gadas de situaciones de este tipo que podrían factori- será ilustrado en futuros trabajos.

34
Suscripción a dotNetManía
❑ Deseo suscribirme a dotNetManía por un año (11 ejemplares) y beneficiarme de la oferta del 10% de descuento por un
importe total de 60€ para España; o por 75€ para el resto de Europa; o por 90€ para el resto del mundo (IVA incluido).

❑ Deseo suscribirme a dotNetManía por un año (11 números) por un importe de 45€ por ser estudiante (IVA incluido).
Aporto fotocopia del carné de estudiante o sello del centro académico (IMPRESCINDIBLE). OFERTA VÁLIDA SÓLO
PARA ESTUDIANTES RESIDENTES EN ESPAÑA.
IMPORTES VÁLIDOS HASTA NUEVA OFERTA

DATOS DE FACTURACIÓN

CIF/NIF . . . . . . . . . . . . . . . . . . . . .Empresa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Nombre y apellidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Dirección . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Población . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Código Postal . . . . . . . . . . . . . . . . . . . Provincia . . . . . . . . . . . . . . . . . . . . . . . . .
Teléfono . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fax . . . . . . . . . . . . . . . . . . . . . . . . . . . email . . . . . . . . . . . . . . . . . . . . . . . . . . . .

DATOS DE ENVÍO (sólo si son distintos de los datos de facturación)

CIF/NIF . . . . . . . . . . . . . . . . . . . . .Empresa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Nombre y apellidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Dirección . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Población . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Código Postal . . . . . . . . . . . . . . . . . . . Provincia . . . . . . . . . . . . . . . . . . . . . . . . .
Teléfono . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fax . . . . . . . . . . . . . . . . . . . . . . . . . . . email . . . . . . . . . . . . . . . . . . . . . . . . . . . .

FORMA DE PAGO
❑ Talón nominativo a nombre NETALIA, S.L. Usted autoriza a la mecaniza-
ción de estos datos. El res-
❑ Giro postal a nombre NETALIA, S.L.
ponsable y destinatario de
❑ Transferencia bancaria a nombre de NETALIA, S.L. a: éstos es Netalia, S.L. Usted
La Caixa tiene derecho a acceder a sus
Número de cuenta 2100 4315 48 2200014696 datos, modificarlos y cance-
(Indique su nombre en la transferencia) larlos cuando lo desee. Sus
datos no serán cedidos en nin-
❑ Domiciliación Bancaria guna de las formas posibles a
terceras partes y no se utiliza-
Indique su número de cuenta:
rán más que para el buen fun-
cionamiento de su suscripción
❑ Tarjeta de crédito a la revista dotNetMania y
❑ VISA ❑ MASTERCARD para informarle de las activi-
Número de su tarjeta: dades comerciales que realice
Fecha de caducidad: / (Imprescindible) la editorial Netalia, S.L. Si no
desea recibir información
comercial de esta empresa
Firma y sello (imprescindible) marque la casilla siguiente ❑

a de de 20

❑ Nº1 ❑ Nº2

Envíe este formulario por email a la dirección C/ Robledal, 135


suscriptores@dotnetmania.com, o al fax (34) 91 499 13 64 28529- Rivas Vaciamadrid
También puede enviarlo por correo postal Madrid (España)
a la siguiente dirección:
Así se quedó Juanita
Book esperando que
le publicaran su libro
(foto: Ramírez, 1893)

Hemos necesitado
que pase más de un
siglo pero ahora, en el
2004, ya podemos
ofrecerte la solución
+ rápida, económica
y eficaz para que tu
libro (sea cual sea la
materia tratada) o tu
tesina vea la luz sin
necesidad de esperar
otros tantos años.

Desde una tirada de


100 ejemplares la
solución + profesio-
nal y económica para
ediciones cortas y/o
personalizadas.

nuevosescritores
c/ Collado Bajo, 13 • 28053 Madrid • ✆ 914 770 185 • Fax: 914 773 152
autores@nuevosescritores.com
www.nuevosescritores.com
Por Luis Miguel Blanco
Software Arquitect
Alhambra-Eidos

Introducción a GDI+

La llegada de la tecnología .NET ha venido acompañada de GDI+ (Graphics Device


Interface), que como su nombre deja entrever, se trata de la nueva generación
del API gráfico de Windows, adaptado a la plataforma .NET Framework.

<< GDI+ auna potencia y sencillez, cualidades aprecia-


das por todo programador, gracias a una estu-
Para comenzar, escribiremos el código del
fuente 1, que dibujará un rectángulo en el for-
penda jerarquía de clases, bien organizada en un mulario.
conjunto de espacios de nombres, que facilita al
desarrollador su trabajo a la hora de localizar y
utilizar los tipos de la plataforma que deben inter-
venir en las operaciones gráficas de sus aplica- Imports System.Drawing
‘ ....
ciones. ‘ ....
Con GDI+ podemos generar una figura sobre ‘ evento Click de un botón:
un formulario y la impresora, por poner dos ejem-
plos de dispositivos diferentes, utilizando bási- ‘ coordenadas
Dim pntUbicacion As New Point(80, 45)
camente el mismo conjunto de clases. Ello se debe
a que GDI+ es un interfaz de programación inde- ‘ tamaño
pendiente del dispositivo sobre el que se crea el Dim szMedidas As New Size(100, 50)
gráfico, por lo que resuelve internamente las com-
‘ zona para el dibujo
plejidades del dispositivo sobre el que vayamos a Dim recArea As New Rectangle(pntUbicacion, szMedidas)
generar nuestro gráfico, proporcionando al pro-
gramador un modo transparente de trabajo. ‘ color de la figura
Lo que aprendamos sobre GDI+ para un len- Dim oColor As Color = Color.ForestGreen
guaje y contexto de trabajo determinado, lo ‘ pincel
podremos aplicar en otro contexto diferente y Dim penPincel As New Pen(oColor, 4)
también distinto lenguaje, siempre y cuando el
lenguaje a utilizar pertenezca a la plataforma ‘ superficie del formulario para dibujar
Dim gphSuperfDibujo As Graphics = Me.CreateGraphics()
.NET, ya que GDI+ es una jerarquía de clases de
.NET Framework, por lo que no está ligado a ‘ dibujar un rectángulo
ningún lenguaje concreto, sino al entorno de eje- gphSuperfDibujo.DrawRectangle(penPincel, recArea)
cución de .NET.
‘ liberar recursos
gphSuperfDibujo.Dispose()
Vamos a dibujar
<<dotNetManía

Y ya sin más preámbulos, pasemos directa-


mente a crear nuestro primer dibujo utilizando
GDI+. Fuente 1

37
<< dnm.plataforma.net

Si ponemos el código del fuente 1 en un botón res que representan la anchura y altura respecti-
del formulario, el resultado tras su ejecución será vamente.
similar a la figura 1.
Dim szMedidas As New Size(100, 50)

El área de dibujo
Para dibujar una figura en un formulario, pri-
meramente debemos delimitar un área en la super-
ficie del formulario, dentro de la cual realizaremos
nuestro dibujo.
Con figuras simples, esta región consiste en una
zona rectangular dentro de nuestro formulario, que
definiremos mediante un objeto de la clase
Figura 1 Rectangle, pasando a su constructor los objetos Point
y Size creados anteriormente, que servirán para
decirle al rectángulo cuál es su posición y tamaño.

Diseccionando el dibujo pieza a pieza Dim recArea As New Rectangle(pntUbicacion, szMedidas)


Para que todo quede claro punto por punto,
vamos a ir describiendo el proceso que hemos lle-
vado a cabo, hasta la consecución de nuestro rec-
tángulo en el formulario.
El pincel y la paleta de colores
Ya que nos hemos convertido en artistas digi-
El espacio de nombres para las clases tales, en lugar del pincel y la paleta tradicionales,
en nuestro caso utilizaremos clases como material
gráficas de dibujo (una de las ventajas es que no nos man-
En el comienzo o cabecera del editor de códi- charemos de pintura).
go debemos importar el espacio de nombres Para la paleta de colores disponemos de la
System.Drawing, el cual alberga las clases, enume- estructura Color, que define en su lista de miem-
raciones, y demás tipos de la plataforma que nece- bros los colores que podemos utilizar al dibujar una
sitaremos para la manipulación de gráficos. figura, como vemos en la figura 2.

La ubicación del gráfico


El primer paso que vamos a dar para crear
nuestra figura en el formulario, consiste en indi-
car las coordenadas en que dicha figura será mos-
trada.
Esto lo conseguiremos mediante la clase Point,
a la que deberemos pasar en su constructor los valo-
res que representan los puntos x e y en el plano de
dibujo del formulario.

Dim pntUbicacion As New Point(80, 45)

El tamaño del gráfico Figura 2


Al igual que establecemos una posición, tam-
<<dotNetManía

bién debemos hacer lo propio respecto a las


dimensiones de la figura. Para ello nos valdremos En cuanto al pincel, se encuentra representado
de la clase Size, pasando a su constructor los valo- por la clase Pen, a cuyo constructor tenemos que

38
<< dnm.plataforma.net

pasarle un tipo Color, y un valor numé-


rico que establece el grosor del trazo Dim gphSuperfDibujo As Graphics = Me.CreateGraphics()
con el que vamos a dibujar.

Dim oColor As Color = Color.ForestGreen Una vez obtenido este objeto, a


Simplificando – resumiendo
Dim penPincel As New Pen(oColor, 4) través de los métodos que comienzan la operación de dibujo
por el nombre Draw, indicaremos qué
figura queremos pintar. La tabla 1 En el ejemplo anterior, hemos cre-
El lienzo. La unión de todos muestra alguno de los métodos dis- ado por separado cada uno de los obje-
ponibles. tos integrantes de nuestra operación
los materiales
Llegados a este punto tenemos Método Tipo de figura
todo lo preciso para dar rienda suelta
DrawRectangle Rectángulo
a nuestra actividad ciberartística. ¿Qué
nos falta? Pues de igual modo que un DrawEllipse Elipse
pintor clásico necesita un lienzo sobre
DrawCurve Curva
el que pintar, nosotros también pre-
cisamos este elemento clave en todo DrawLine Linea
proceso de dibujo. DrawPolygon Polígono
En nuestro caso, el lienzo será la
superficie del formulario. Sin embar- DrawString Cadena de texto en modo gráfico
go, no podemos tomar directamente Tabla 1
el formulario y empezar a pintar en
él. ¿Y por qué no?, se preguntará. Pues
porque en primer lugar tenemos que Para una referencia más extensa, de dibujo. Si bien ésta sería la mejor
seleccionar sobre qué tipo de lienzo consulte la documentación de .NET técnica de trabajo a efectos didácticos,
queremos pintar. Framework. una aproximación mucho más cerca-
Para ayudar a comprender mejor En el ejemplo anterior hemos na a una codificación real, sería la ins-
este concepto, volvamos al ejemplo del dibujado un rectángulo mediante el tanciación en línea de algunos obje-
pintor tradicional. Supongamos que método Graphics.DrawRectangle, pa- tos en el momento de ser pasados
nuestro pintor ya tiene todo lo necesa- sando como parámetros los objetos como parámetros a los métodos de
rio en cuanto a color, pincel, motivo del Pen y Rectangle, que utilizará el obje- otros objetos. Con ello ahorraremos
dibujo, etc. A partir de aquí, puede pin- to Graphics como tipo de pincel y área líneas de código, consiguiendo el mis-
tar en un lienzo de tela, una pared (si de dibujo respectivamente. mo resultado y rendimiento.
es un artista del graffiti), una valla publi-
citaria, etc. Como vemos, hay muchas gphSuperfDibujo.DrawRectangle(penPincel, recArea)
superficies que pueden representar la
base o lienzo de su dibujo.
En nuestro caso ocurre algo simi- Las operaciones gráficas en Para apreciar esta diferencia, el
lar, con los mismos materiales, nues- Windows hacen un consumo intensi- código del fuente 2 muestra la mis-
tra superficie de dibujo puede ser un vo de recursos del sistema, por lo que ma operación de dibujo que el
formulario, la impresora, etc., por lo es altamente recomendable que una ejemplo del fuente 1, pero aplican-
que en primer lugar, tenemos que vez finalizada la creación de nuestra do esta técnica. El único cambio en
seleccionar el tipo de superficie, y lue- figura, liberemos los recursos que este caso, reside en que vamos a
go pintar sobre ella. están siendo utilizados llamando al dibujar una elipse en lugar de un
La superficie sobre la que dibuja- método Graphics.Dispose. rectángulo.
remos, recibe en Windows el nom-
bre técnico de contexto de dispositivo
gráfico, y en la plataforma .NET, está
representada por la clase Graphics, por GDI+ es un interfaz de programación independiente
lo que necesitamos un objeto de este del dispositivo sobre el que se crea el gráfico, por lo que resuelve
tipo para poder crear nuestro gráfi-
co. Más en concreto, lo que precisa- internamente las complejidades del dispositivo sobre el que
mos es el objeto Graphics que repre- vayamos a generar nuestro gráfico, proporcionando
<<dotNetManía

senta la superficie del formulario, y al programador un modo transparente de trabajo


que obtendremos mediante el méto-
do Form.CreateGraphics.

39
<< dnm.plataforma.net

‘ Superficie del formulario para dibujar


Dim gphSuperfDibujo As Graphics = Me.CreateGraphics()

‘ Dibujar un rectángulo
gphSuperfDibujo.DrawEllipse(New Pen(Color.ForestGreen, 4), _
New Rectangle(New Point(25, 45), New Size(200, 40)))

‘ Liberar recursos
gphSuperfDibujo.Dispose()

Fuente 2

El resultado lo apreciamos en la figura 3. tros alpha (transparencia), rojo, verde y azul res-
pectivamente; o también el método FromName, en
el que pasamos como parámetro una cadena con el
nombre del color a usar, como vemos en los siguien-
tes ejemplos.

Dim oColor As Color


oColor = Color.FromArgb(150, 60, 120, 170)
oColor = Color.FromName(“Brown”)

Estilos de trazo
Figura 3
Por defecto, al dibujar con un objeto Pen, se uti-
liza una línea continua para trazar la figura. Sin
embargo, mediante la propiedad DashStyle, pode-
La clase Rectangle dispone de un constructor en mos variar el estilo de línea, consiguiendo que esté
el que podemos pasar directamente los valores compuesta por guiones, puntos, etc.
numéricos correspondientes a la posición y tama- Las propiedades StartCap y EndCap, por otro
ño, sin necesidad de crear un objeto Point ni Size, lado, permiten que el comienzo y final de línea sea
como muestra la siguiente línea de código. diferente de una línea estándar, pudiendo aplicar
un efecto de recuadro, redondo, romboide, etc.
New Rectangle(25, 45, 200, 40) Como comprobará, si escribe este código de ejem-
plo, es muy sencillo asignar estas propiedades, ya
Respecto al color, aunque el medio más senci- que al tratarse de enumeraciones, el editor de códi-
llo de seleccionarlo es eligiendo uno de los nom- go, gracias al Intellisense, nos muestra la lista con
bres de color de la estructura, también podemos los valores admisibles.
usar el método FromArgb, en el que pasamos los En el código del fuente 3 dibujamos una línea con
valores numéricos correspondientes a los paráme- algunas de las variaciones que hemos comentado.

‘ crear pincel y aplicarle estilo de línea


Dim penPincel As New Pen(Color.DarkCyan, 7)
penPincel.DashStyle = Drawing.Drawing2D.DashStyle.Dash
penPincel.StartCap = Drawing.Drawing2D.LineCap.DiamondAnchor
penPincel.EndCap = Drawing.Drawing2D.LineCap.RoundAnchor

‘ obtener superficie del formulario y dibujar una línea


Dim gphSuperfDibujo As Graphics = Me.CreateGraphics()
gphSuperfDibujo.DrawLine(penPincel, 25, 50, 200, 50)
<<dotNetManía

gphSuperfDibujo.Dispose()

Fuente 3

40
<< dnm.plataforma.net

Figura 4
Figura 6

El resultado de la ejecución del Para crear una curva, el proceso es


fuente 3 lo vemos en la figura 4. igual, pero empleando el método
Graphics.DrawCurve, como vemos en
Polígonos y curvas el código del fuente 5.

Para dibujar una figura de este tipo,


al ser más compleja de generar, no Dim oGraphics As Graphics = Me.CreateGraphics()
podemos especificar un rectángulo
como área de dibujo, sino que tenemos oGraphics.DrawCurve(New Pen(Color.Brown, 4), _
que utilizar un conjunto de objetos New Point(){New Point(20,75),New Point(50,15),New Point(100,60)})
Point contenidos en un array, que usa- oGraphics.Dispose()
remos para establecer las coordenadas
por donde pasará el trazo del pincel al
dibujar la figura. En el fuente 4 se Fuente 5
muestra un ejemplo de polígono.

‘ array de objetos Point con las coordenadas del polígono método Form.Invalidate, que borra las
Dim pntPuntos(4) As Point figuras que hayamos dibujado en la
pntPuntos(0) = New Point(25, 70) ventana.
pntPuntos(1) = New Point(50, 40)
pntPuntos(2) = New Point(75, 70) Me.Invalidate()
pntPuntos(3) = New Point(60, 90)
pntPuntos(4) = New Point(40, 90)
El evento Paint.
Dim gphSuperfDibujo As Graphics = Me.CreateGraphics() Refrescando zonas ocultas
gphSuperfDibujo.DrawPolygon(New Pen(Color.DarkMagenta, 3), _ del formulario
pntPuntos)

gphSuperfDibujo.Dispose() Cuando el total o parte del gráfi-


co que hemos dibujado en el formu-
Fuente 4 lario queda tapado por otra ventana,
el área oculta se dice que ha quedado
En la figura 4 vemos el gráfico En la figura 6 se muestra la curva invalidada. Esto significa que la región
generado. obtenida. del gráfico que se ha tapado no es
mantenida en memoria por el formu-
lario para una posterior visualización,
Borrado de los elementos de manera que cuando volvamos a
mostrar dicha zona de la ventana, la
gráficos porción del gráfico habrá sido borra-
Después de haber realizado da. La figura 7 muestra esta situación.
varias pruebas, a buen seguro que Este comportamiento permite al
nuestro formulario está repleto de sistema operativo evitar un excesivo
figuras, por lo que posiblemente nos consumo en recursos gráficos, pero
interesará limpiar su superficie sin deja en manos del programador la
<<dotNetManía

tener que finalizar y ejecutar nue- responsabilidad de ocuparse de que


vamente el proyecto. Para ello, lo tales elementos se muestren en el
Figura 5
que debemos hacer es llamar al formulario.

41
<< dnm.plataforma.net

En nuestro ejemplo, por lo tanto, vamos a escri-


bir el procedimiento manipulador para este even-
to, y trasladaremos al mismo el código que tenía-
mos en el botón del formulario, como vemos en el
código del fuente 6.
Una vez escrito este código, volveremos a eje-
cutar el programa, comprobando esta vez cómo el
gráfico del formulario se mantiene gracias a que se
vuelve a pintar cada vez que una de sus zonas que-
da oculta, por muy pequeña que sea.
Como consecuencia añadida, ya no necesitare-
mos el botón del formulario para efectuar el dibu-
jo, puesto que gracias al evento Paint, el gráfico será
constantemente pintado.

Figura 7
Y terminamos
Bien, pues esto ha sido todo, en este artículo
hemos hecho una pequeña introducción a GDI+,
Lo que debemos hacer ante esta circunstancia, el API de programación gráfica de la plataforma
es un refresco o repintado del gráfico en el formu- .NET Framework, describiendo algunas de sus
lario. Seguidamente explicamos cómo llevar a cabo principales características. También hemos descri-
esta operación. to los principales objetos implicados en una ope-
Cuando una región del formulario que había ración de dibujo, y efectuado unas pruebas demos-
estado oculta vuelve a mostrarse, se produce en ese trativas de la potencia y facilidad de programación
formulario el evento Paint, de esta forma sabemos de este conjunto de clases. Le invito a que como
que el objeto está solicitando que se vuelvan a dibu- ejercicio, experimente con otros métodos de los
jar aquellos elementos gráficos que podrían haber objetos comentados, para que vaya adquiriendo sol-
quedado borrados. tura en la gestión de gráficos con .NET.

Private Sub Form1_Paint(ByVal sender As Object, ByVal e As


System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
Dim gphSuperfDibujo As Graphics = Me.CreateGraphics()
gphSuperfDibujo.DrawRectangle(New Pen(Color.ForestGreen, 4), _
New Rectangle(New Point(25, 45), New Size(200, 40)))
gphSuperfDibujo.Dispose()
End Sub

Fuente 6

ASP.NET Resource Kit

Ya puede descargar el ASP.Net Resource Kit desde la página http://www.asp.net.


Este kit contiene herramientas, tutoriales y ejemplos para ayudar a los nuevos desarrolladores a apren-
der ASP.NET y para los desarrolladores que ya usen ASP.NET, el kit les ofrece controles y componen-
<<dotNetManía

tes .NET totalmente gratuitos, descuentos para formación en ASP.NET así como oportunidades de
hosting ASP.NET.

42
noticias.noticias.noticias.noticias
Por Miguel Egea
SQL Server MVP
portalsql.com

SQL-Server. Diseñar la estrategia de copias


de seguridad y restauraciones
Todos los sistemas necesitan una salvaguarda, pero aquellos que contienen
datos importantes mucho más aún. En una base de datos suele guardarse infor-
mación muy viva y casi siempre trascendental para el negocio que sustentan.

<< La cantidad de información que una persona está dispuesta Tipos de copias
a perder en función de lo que eventualmente suce-
da es la respuesta a contestar para diseñar nuestra Existen tres tipos de copias de seguridad en
política de copias de seguridad. SQL-Server, las copias de seguridad completas, las
Esto parece sencillo, pero no lo es en absoluto. copias de diferencias y las copias del log:
Imaginemos un momento una empresa que factu-
re 1 millón al año, si sigue un horario normal tra- • Copias de seguridad completas: Las copias de
bajará 51 semanas, 5 días a la semana; esto supone seguridad completas realizan una copia de todos
una facturación al día de más o menos 3920 6 día. los datos, bien sea de una base de datos comple-
¿Estaría esta empresa dispuesta a perder la factura- ta, bien del fichero que se especifique. Esta ope-
ción de un día? ¿y de una hora?. Generalmente una ración se puede realizar 'en caliente', si se hace
empresa con esa facturación es una pequeña empre- mientras hay otros usuarios modificando la base
sa, cuanto más importante sea el volumen de nego- de datos, el proceso de copia se encarga de ano-
cio mucho más importante será tener una adecua- tar el puntero del log en el inicio de la copia y al
da política de copias de seguridad. final de ésta, guardando en el mismo conjunto
Incluso algunas veces, los departamentos de de copias la información que se ha incorporado
informática estamos seguros de tener esas copias de durante el proceso. Esto se hace ágilmente en el
seguridad, pero, ¿las hemos probado?, ¿hemos res- momento de la recuperación, ya que las exten-
taurado esa información para saber que la cinta no siones de datos son restauradas incluso aunque
está rota, que contiene lo que esperamos? tengan un estado 'erróneo'; posteriormente se
La política de copias de seguridad va más allá de aplican los cambios registrados en el log duran-
simplemente guardar un fichero. Debemos incluir te el proceso de backup y se obtiene una imagen
dentro de nuestro plan de sistemas las posibles cau- fiel del momento en que terminó la copia.
sas de catástrofe y verificar si estamos listos ante ellas. • Copias de seguridad diferenciales: Las copias
En cualquier caso de lo que vamos a hablar en de seguridad de diferencias guardan todas las
estas líneas es de cómo organizar las copias de segu- extensiones que han sido modificadas desde la
ridad y las restauraciones en nuestros servidores última copia de seguridad completa. Son por
SQL-Server, a comprender cuales son los modelos tanto un estupendo mecanismo para aquellos
de copia que nos ofrece la base de datos, a diseñar datos que no crecen pero si se modifican muy
una estrategia de copias de seguridad adecuada a frecuentemente. Hay muchos datos que cum-
<<dotNetManía

nuestro hardware y a contemplar el plan de restau- plen estas premisas, tarifas de artículos, tablas
ración que tenemos que implementar en caso de de acumulados de almacén, información de
catástrofe. cambio de divisas, etc.

43
<< dnm.servidores.sql

• Copias de seguridad del Log: El solidado la información en los ficheros La estrategia de recuperación ante una
tercer tipo de copias de seguridad no de datos. pérdida consistiría en restaurar la copia de
está disponible en todas las circuns- Sin embargo, no podrá recuperar la seguridad completa más reciente (vere-
tancias. Por ejemplo, la base de datos información en el momento de fallo; mos ejemplos con la opción no recovery),
master ofrece —generalmente— un solamente le valdrá la última copia de después restauraremos la copia de dife-
error al hacer esta copia de seguri- seguridad que tenga para recuperar la rencias más reciente también —aunque
dad. Esto es debido a que solamen- información. existan varias no se tomará más que la más
te se pueden hacer copias de seguri- En este modo no pueden hacerse reciente— y sobre esta copia de diferen-
dad del log de transacciones cuando copias de seguridad del log de transac- cias restauraremos todos las copias del log
el modo de recuperación es comple- ciones; obtendremos un error si lo de transacciones en el mismo orden en el
to o de registro masivo. intentamos. que se hayan guardado.
El procedimiento que tendríamos Es importante que no se ejecute la
El log de transacciones es una estruc- que seguir para realizar una restauración instrucción backup log <database> with
tura secuencial en la que se va guardando dependerá del tipo de copias que haya- truncate_only; si se ejecuta esta instruc-
la información de modificaciones solicita- mos hecho, pero pasará necesariamente ción necesitamos una copia de seguri-
das al motor. Periódicamente la informa- por restaurar la última copia de seguri- dad completa inmediatamente después
ción modificada —que permanece sola- dad completa y restaurar la última copia o no podremos seguir esta estrategia.
mente en memoria— es volcada a disco, de diferencias que hayamos efectuado. Completo: El modo de recupera-
esto se produce inmediatamente después Puede establecerse este modo eje- ción completo guarda toda la informa-
de lo que en SQL-Server se llaman pun- cutando la siguiente instrucción: ción (incluidas las operaciones masivas)
tos de comprobación checkpoint. Sin embar-
go, aunque el sistema sufriese una caída de
Alter Database <Nombre de BD> Set Recovery SIMPLE
tensión, esa información no se habría per-
dido. Ésta está cuidadosamente guardada
en el log y en el proceso de restauración Registro masivo: El formato de en el log de transacciones, esto hace que
que SQL lanza inmediatamente después recuperación de registro masivo no la política de copias debe ser adecuada
de una caída no prevista, se vuelven a con- sobrescribe el log de transacciones, por para evitar que en un momento deter-
solidar o rechazar los cambios que se pro- lo que permite recuperación ante erro- minado podamos perder información y
dujeron. Tal y como veremos más adelan- res de los discos o medios en donde se para evitar que el log de transacciones
te tener backups del log de transacciones estén guardando los datos. Guarda crezca de forma desmesurada.
no es solamente una garantía de recupe- menos información en ciertas opera- La estrategia de restauración en el
ración de la información —incluso al pun- ciones masivas del tipo Select Into, bcp, caso del modo de recuperación comple-
to de ruptura—, sino una operación bulk insert y operaciones sobre los ta puede ser la misma que hemos pro-
imprescindible para evitar que nuestro campos de tipo Text e Image (campos puesto para el modo de registro masivo.
archivo de log crezca desmesuradamente. blob). Existen comandos que nos muestran
En caso de una catástrofe se podría la situación de llenado del log y el espa-
Modos de recuperación recuperar toda la información menos cio que tiene ocupado. A través de este
las operaciones masivas, que tendrían comando podemos comprobar si es
El modo de recuperación marca la que volver a ser incorporadas de forma necesario hacer una copia de seguridad
cantidad y tipo de información que SQL- manual. del Log. El comando es:
Server guarda en el log de transacciones La estrategia de copias de seguridad
DBCC SQLPERF ( LOGSPACE )
y tiene grandes implicaciones en las polí- constaría de copias de seguridad com-
ticas de copias de seguridad, sobre todo pletas, copias diferenciales y copias de Este comando ofrece resultados
para determinar la información que sere- log de transacciones. como los que aparecen en la Tabla 1.
mos capaces de restaurar y el tiempo
máximo de pérdida de información. Base de Datos Tamaño en Mb % usado Status
Microsoft SQL-Server 2000 tiene
tres modos de recuperación: master 2.7421875 35.541309 0
Sencillo: Si tiene establecido el tempdb 0.4921875 44.694786 0
modo de recuperación sencillo, no cre-
cerá su log de transacciones; es equi- model 0.4921875 53.57143 0
valente a tener establecida la opción msdb 2.2421875 36.193378 0
Trun. Log on chkpt en la versión 7.0, e
implica que la información almacena- pubs 0.7421875 40.921051 0
<<dotNetManía

da en el log puede ser sobrescrita en el Northwind 0.9921875 40.748032 0


momento que sea necesario si un pun-
to de comprobación (checkpoint) ha con- Tabla 1

44
<< dnm.servidores.sql

También puede ser importante conocer cual es Políticas de copias


la transacción activa más antigua, esta transacción
activa más antigua marca el comienzo de la parte del Las copias de seguridad son del tipo de cosas que
fichero de log que no puede sobrescribirse. El siempre se dan por supuestas; generalmente las perso-
comando que vamos a ver a continuación informa nas se extrañan de que se pierda información ante una
de la transacción más antigua, de la transacción de catástrofe y se preguntan cómo no existían las copias o
replicación no entregada más antigua. cómo nadie había comprobado que eran buenas.
El comando es Lo cierto es que la realidad luego nos lleva a otras
cosas, el día a día nos lleva a problemas que en apa-
DBCC OPENTRAN (‘Northwind’) riencia son más urgentes que comprobar las copias
o revisar si el sistema las está haciendo correcta-
Y nos ofrece la información que podéis ver a con- mente, la cinta no está rota, etc.
tinuación. Creo que es claro que nadie nos disculpará si esas

Información de transacción para la base de datos ‘Northwind’.


Transacción activa más antigua:
SPID (Id. de proceso de servidor) : 51
UID (Id. de usuario) : -1
Nombre : user_transaction
LSN : (25:180:1)
Hora de inicio : Dic 13 2003 4:41:53:543PM

Comprobar el modo de recuperación copias no están, así que si estáis ejerciendo esa res-
de una base de datos ponsabilidad, aseguraros de forma periódica de que
realmente hay copias y de que realmente éstas son
Para comprobar cual es el modo de recuperación buenas. No se puede garantizar de otra forma.
actual de una base de datos puede usar el administra- Una buena política de copias puede suponer la res-
dor corporativo en las propiedades de la base de datos tauración con carácter periódico (a menudo). Un
(ver figura 1) entorno de preproducción en el que se restauren estas
copias puede cumplir una doble misión: garantizar las
pruebas de integración en el entorno real y garanti-
zar que las copias de seguridad cumplirán su objetivo
en caso de ser necesarias.

Diseñando la estrategia
La estrategia de copias dependerá de cuánta infor-
mación esté dispuesto a perder, cuánta información
como máximo podría aceptarse como pérdida. Hay sis-
temas en los que recuperar la información de un día
de trabajo es aceptable y posible, sin embargo, hay otros
en los que solamente 30 minutos de información supo-
nen pérdidas importantísimas a la compañía.
Por tanto, la estrategia tiene que estar diseñada
Figura 1. Comprobar el modo de para cubrir los requerimientos de seguridad y puede
recuperación no ser puramente técnica sino también física. Por ejem-
plo, de nada servirán las copias de seguridad en unas
cintas en la estantería de encima del servidor ante un
incendio.
También puede comprobar el modo de recupera- Los libros en pantalla de SQL-Server también pue-
ción de la base de datos ejecutando desde cualquier den ayudarnos en el diseño de esta estrategia pues con-
aplicación (por ejemplo en analizador de consultas) la tienen una batería de preguntas que vienen muy al
instrucción: hilo de la cuestión.
<<dotNetManía

select DatabasePropertyEx(‘Northwind’,’Recovery’)

45
<< dnm.servidores.sql

El modo de recuperación idóneo fichero de transacciones no crezca des- proceder al reparto todo el día.
para nuestra compañía también es una mesuradamente. Cada una de las transac- Seguramente la mayoría de las transac-
decisión que está en función de esa estra- ciones se registran en el log y el espacio ciones se ejecutan en una hora, y el res-
tegia. Si es aceptable hacer solamente que usan no es marcado como rehusable to del día son mayormente consultas.
una copia de seguridad al día, por ejem- hasta que se salva con una copia de segu- Quizá entre las 9 y las 10 el log crezca
plo por la noche, cuando nadie está en ridad de Log. Por tanto, hay que estable- mucho y, por tanto, necesite copias más
la oficina, y no hay problemas en recu- cer frecuentes copias de seguridad de éste. frecuentes, por ejemplo, cada 10 minu-
perar la información que se inserta, qui- Pero, ¿qué significa frecuente? La ver- tos. Sin embargo, el resto del día bas-
zá el modo sencillo sea válido. Si por dad es que no hay una regla, todo depen- taría con una copia cada 2 horas (inclu-
ejemplo la base de datos en cuestión es de de la cantidad de información que se so menos), ¿Cómo determinar esto?
una base de datos para cálculos tempo- modifique o inserte, además no hay una Quizá una buena estrategia podría
rales en la que se inserta y borra mucha única respuesta a esta pregunta. ser la siguiente, crear un procedimien-
información pero no tiene más impor- Imaginemos una empresa de ventas to almacenado como el del fuente 1
tancia porque es información transito- en la que los pedidos se introducen (obtenido de http://www.portalsql.com).
ria, simple es un buen mecanismo ya que todos entre las 9 y 10 de la mañana para Ver fuente 2.
no obliga a ninguna política de copias
del log y éste no crece de forma des- Use pruebas
controlada. go
Si esto no es admisible entonces hay if databasepropertyex(‘Pruebas’,’recovery’)<>’FULL’
que ir al modo de recuperación completo ALTER DATABASE Pruebas SET RECOVERY FULL
o registro masivo. Para distinguir entre go
éstos hay dos cuestiones: la velocidad en — Creamos una tabla en la base de datos de pruebas, para que exista
la restauración y el tamaño de las copias. aunque
Si el modo de recuperación es de re- — no tenga datos en el primer momento de la restauración
CREATE TABLE TablaPruebas(id int identity(1,1),
gistro masivo, la restauración de copias
Descripcion char(30),
en las que se hayan creado índices nece- FechaHora datetime default getdate())
sitará volver a crearlos (sólo se almace- go
na el acto de hacerlos, no la información BACKUP DATABASE PRUEBAS TO DISK =’C:\BackupDePruebas.bak’
que han generado), por tanto tardará go
potencialmente más en la restauración. — Ahora creamos registros para insertar dentro de nuestra base de
Si el modo de recuperación es com- datos
pleto se guarda toda la información mo- Declare @i int
dificada. Por lo tanto, no será necesario SET @i=1
— hacemos un bucle hasta 200
volver a generar los índices para hacer
while @i<=200
la restauración, sin embargo, la copia de begin
seguridad tendrá todos esos datos modi- —
ficados y lógicamente será más grande. INSERT INTO TablaPruebas (Descripcion) values
(‘ El valor de @i es ‘ + cast(@i as char(3)))
Un ejemplo de copias — en el elemento 100 hacemos un backup de log
— lo vamos a hacer en el mismo fichero. Es más claro
Para realizar este ejemplo vamos a — hacerlo en ficheros diferentes
ejecutar las instrucciones para realizar if @i=100
BACKUP log PRUEBAS TO DISK =’C:\BackupDePruebas.bak’
las copias dentro del propio código. Esto
set @i=@i+1
no es lo habitual, generalmente para el end
proceso de realización de copias de segu- go
ridad lo que existe es una tarea progra-
mada con una frecuencia determinada, — vamos a borrar una tabla
frecuencia que además va en función de declare @Nombretransaccion char(20)
la cantidad de información y la distri- set @Nombretransaccion =’Borrar TablaPruebas’
bución temporal de la entrada de ésta. begin tran @NombreTransaccion with mark
Vamos a partir del código del fuente drop table Tablapruebas
Commit
1 en el que suponemos que existe una base
go
de datos llamada pruebas. declare @nombre varchar(100)
En el caso de los modos de recupera- set @nombre=’Segunda copia de lpg’
<<dotNetManía

ción de registro masivo y completo es muy BACKUP LOG PRUEBAS TO DISK =’C:\BackupDePruebas.bak’ with name=@nombre
importante hacer copias de seguridad lo
suficientemente frecuentes para que el Fuente 1

46
<< dnm.servidores.sql

if not object_id(‘backupwhennecesary’) is null


drop proc backupWhenNecesary
go
create proc backupWhenNecesary (@file sysname)
as
begin
— primero que no se produzcan salidas no deseadas—
set nocount on
— Necesitamos la tabla y la ruta en la que hacer el backup —
— podría ser a cinta directamente, pero en mi portatil no —
— tengo systema de cintas, así que,no puedo probarlo —
declare @tabla sysname
Declare @fileabs sysname
— Creamos una tabla temporal para guardar el resultado de —
— DBCC —
create table #temp (nombre sysname,tam float,pct float,status int)
insert into #temp exec(‘DBCC sqlperf(logspace)’)
— Usaremos un cursor
declare cr Cursor for
select nombre from #temp where pct>75
and DATABASEPROPERTYEX(nombre, N’RECOVERY’)<>’SIMPLE’
— 75 porciento de uso, si queréis más o menos,...
— el modelo de recuperación si es simple no permite
— hacer backup de log, y nosotros no queremos que nuestro
— procedimiento almacenado falle :-D
open cr
fetch next from cr into @tabla
while @@fetch_status=0
begin
— construyo de forma dinámica el nombre del fichero en
— donde guardaremos la copia de seguridad

— modificamos este trozo de código el día 13 de agosto de 2003


— El código nos lo propone el maestro Fernando Guerrero y con esta —— modificación guardamos ficheros
— de log independientes, en lugar de todo en un solo fichero.
set @fileabs=@file
+ ‘_’
+ @tabla
+ ‘_’
+ select
replace(
replace(
replace(
replace(
convert(varchar(25), getdate(), 121)
, ‘-’, ‘’)
, ‘ ‘, ‘_’)
, ‘:’, ‘’)
, ‘.’, ‘’)
+’.trn’
— fin modificación
— ejecutamos la copia
exec sp_executesql N’backup log @p1 to disk= @p2 ‘,N’@p1 sysname,
@p2 sysname’,@tabla,@fileabs
— a la siguiente bd.
fetch next from cr into @tabla
end
— cerramos
close cr
— liberamos
deallocate cr
— y borramos nuestras tablas...
drop table #temp
end
go
<<dotNetManía

Fuente 2

47
<< dnm.servidores.sql

Este procedimiento almacenado podemos pro- Vamos a realizar nuestra restauración:


gramarlo para que se ejecute cada 10 minutos. El Podríamos comenzar usando el comando Restore
propio procedimiento comprobará si debe hacer la Database como sigue:
copia de seguridad del log de transacciones o no. De
esta forma el proceso de restauración tendrá un restore database pruebas
número variable de ficheros de copia pero tendre- from disk=’C:\BackupDePruebas.BAK’
with norecovery

Sin embargo, si intentamos entrar en esa base


de datos obtendremos un mensaje de error que nos
La política de copias de seguridad va más allá dirá que la base de datos se encuentra en proceso de
de simplemente guardar un fichero. Debemos restauración y que no puede ser usada. A nosotros
nos interesa comprobar paso a paso lo que va hacien-
incluir dentro de nuestro plan de sistemas do el proceso de restauración así que vamos usar
las posibles causas de catástrofe y verificar otra cláusula diferente para la restauración: la cláu-
sula StandBy.
si estamos listos ante ellas A esta cláusula hay que especificarle un nombre
de fichero. En ese fichero introducirá todas las tran-
sacciones que no estén confirmadas ni rechazadas en
el momento de la restauración, seguro que una res-
mos solamente los necesarios para mantener la segu- tauración de un fichero de log posterior confirmará
ridad evitando que el log de transacciones crezca des- o rechazará la mayor parte de ellas. La base de datos
mesuradamente. no permitirá modificaciones pero sí consultas.

La restauración restore database pruebas


from disk=’C:\BackupDePruebas.BAK’
En este momento comenzaremos con el proceso de with standby=’c:\standby.undo’
go
restauración de copias de seguridad. Como el modelo use pruebas
de copias que hemos elegido es completo, tendremos go
que restaurar en el orden adecuado. Además hemos guar- select * from pruebas..tablapruebas
dado todas las copias de seguridad en el mismo fichero,
por lo que tendremos además que ver cual es el conte- En esta sentencia podréis comprobar que la tabla
nido de ese fichero y diseñar la estrategia de copias: pruebas existe y que no tiene registros. Vamos a res-
Para comprobar el contenido en cuanto a copias taurar la siguiente copia de seguridad; en este caso será
del fichero de backup nos sirve el siguiente comando: una copia de seguridad del Log. En el ejemplo y por
simplificar no hemos usado copias diferenciales, si exis-
RESTORE HEADERONLY FROM tiesen, solamente hay que restaurar la última de ellas.
DISK=’C:\BackupDePruebas.BAK’
restore log pruebas
Algunas veces necesitamos restaurar los ficheros from disk=’C:\BackupDePruebas.BAK’
de la copia en otros servidores que no tienen la mis- with standby=’c:\standby.undo’,
ma configuración de unidades de disco. Esto impide file=2
que la primera restauración se haga con un simple go
restore, necesitando usar la cláusula with move. Esta select * from pruebas..tablapruebas
cláusula necesita los nombres de los ficheros de base
de datos, tanto lógicos como físicos. Para comprobar En este momento tendremos 100 registros en la
cuales son los nombres lógicos y saber cual era la ruta tabla Tablapruebas, ya que se corresponde con ese
en los ficheros físicos (ahora será nueva) podemos momento intermedio en el que solamente se habían
usar esta otra instrucción: insertado 100 registros.

RESTORE FILELISTONLY FROM DISK=’C:\BackupDePruebas.BAK’ WITH FILE=1

La cláusula with file sirve para indicar de cual de Ahora, podríamos seguir restaurando el resto de Logs,
<<dotNetManía

las diferentes copias de seguridad que se han guarda- cambiando simplemente el número de file. Sin embargo,
do en el mismo fichero queremos conocer los fiche- en nuestro caso, la restauración se habría hecho justo des-
ros que contiene. pués de un drop table, es decir ¡no tendríamos nada!

48
<< dnm.servidores.sql

restore log pruebas


from disk=’C:\BackupDePruebas.BAK’
with recovery,
file=3,
stopbeforemark=’Borrar TablaPruebas’
go
select * from pruebas..tablapruebas

Fuente 3

Por todo esto, lo que vamos a hacer es restaurarlo La sintaxis de Backup Database y de Restore natu-
hasta justo el momento antes de haber borrado la tabla. ralmente permiten salvar o restaurar un solo fichero
Esto puede hacerse de varias formas: se puede o un grupo de ficheros.
averiguar la hora exacta a la que se hizo el borrado No obstante, este modelo tiene una complejidad
y restaurar hasta ese momento con la cláusula stopat. administrativa bastante grande. Por ejemplo , para
Sin embargo, a mi personalmente me parece más realizar una restauración completa, hay que seguir los
interesante marcar las transacciones (como hemos siguientes pasos:
hecho en el script) y restaurar hasta la marca. Si las
aplicaciones se desarrollan pensando en esta funcio- 1. Realizar una copia de seguridad del log de tran-
nalidad es muy útil. En un momento determinado sacciones tal y como esté en este instante.
podríamos restaurar hasta la creación de un núme- 2. Restaurar cada uno de los ficheros de base de datos.
ro de cliente o de factura, por ejemplo. 3. Restaurar cada uno de los Logs de transacciones
Vemos como se haría en el fuente 3. empezando por el inmediatamente posterior al
De esta forma podéis comprobar que existen toda- grupo de ficheros más antiguo restaurado.
vía los doscientos registros que acabamos de generar. 4. Restaurar el log que acabamos de salvaguardar
recuperando la base de datos.

Es decir, tenemos que guardar y administrar todos


las copias de seguridad del log de transacciones des-
de al menos la última copia del fichero que menos se
modifica.
Todo esto puede minimizarse naturalmente con
copias de seguridad de diferencias de archivos.

Recuperación al punto de fallo


Si nuestro modo de recuperación es Completo y el
disco duro falla u ocurre alguna catástrofe que per-
mita hacer un backup del log, es posible restaurar la
base de datos en otro servidor sin perder ninguna infor-
mación.
Los pasos serían realizar un backup del log con la
Dividir en filegroups cláusula WITH NO_Truncate, que permite realizar copias
En la mayoría de las organizaciones los datos no de seguridad del log cuando la base de datos está daña-
tienen la misma frecuencia de modificación. da y a continuación recuperar la base de datos tal y como
Generalmente, simplificando, se pueden dividir en hemos venido explicando durante todo el artículo.
tres tipos los datos en cuanto a lo que se modifican:
Nunca o rara vez, de vez en cuanto y muy a menudo. Conclusión
Puede ser una buena idea plantearse políticas de
copias de seguridad completas o de diferencias por file- SQL-Server nos ofrece una variedad bastante
groups, determinando la periodicidad de cada una de las importante de mecanismos para realizar y restaurar
copias en función de lo que se modifican. Esto puede copias de seguridad. Dada la trascendencia de las
<<dotNetManía

permitir que nuestras copias ocupen mucho menos espa- copias, es importante diseñar una estrategia de recu-
cio y que sin embargo no tengamos riesgos grandes de peración ante errores que sea adecuada a los proble-
pérdida de información. mas que pueden presentarse.

49
Por Jordi Rambla
Regional Director de Microsoft
certia.ramblainf.com

El Señor Arquitecto
<< Parece que la arquitectura está de mo- recibirá explicaciones verbales y, en bas- de TIC, y justifica la visión que muchos
da. En eventos como el último PDC de tantes casos, incompletas y poco o nada directivos tienen de que la informática es
Microsoft se dedican tracks específicos, y cuantificadas. A pesar de que alguien tie- inmovilista, lenta y poco profesional.
hasta una matinal completa (el Architecture ne la imagen completa de los sistemas de Este es el punto en que aparece el con-
Symposium), aparecen newsletters, revis- la empresa, pocos o nadie, tienen una cepto de arquitectura del software, enten-
tas, secciones en revistas, webs, libros, visión de la Solución software de la dida como: “la estructura o estructuras del
documentos extensos y demás artilugios empresa. La mayúscula en “Solución” sistema, lo que comprende elementos soft-
comunicativos. Hasta en la trilogía Matrix pretende resaltar que el conjunto de apli- ware, las propiedades de esos elementos
aparece la figura del Arquitecto, un ele- caciones propias o adquiridas sobre las visibles externamente y la relación entre
mento endiosado y de discurso rocambo- que se asienta un negocio son, en el fon- ellos”. (…) “Central, entre estos concep-
lesco. ¿A qué se debe toda esa artillería? do, más importantes que sus motores base tos, es la noción de que las arquitecturas
¿Hemos de escondernos en la trinchera de datos, sus sistemas operativos o sus consisten en estructuras separadas y coor-
hasta que pase la tormenta, o ese bom- comunicaciones. ¿Por qué esta falta de dinadas y que cada una de estas estructu-
bardeo sirve para allanar el camino hacia consciencia del valor de estos activos y de ras ofrece un punto de apoyo para la inge-
el combate con nuestro enemigo virtual? lograr que funcionen tan bien engrasados niería de sistemas.” (…) “La visión del sis-
Los problemas y las soluciones a estas como el hardware o los sistemas? tema que tiene el arquitecto es abstracta,
propuestas por la arquitectura no son nue- Una de las consecuencias de la falta de decantando los detalles de implementación,
vos, los que es nuevo es el concepto. El “mapas” de nuestro software es que la insi- algoritmos y la representación de los datos
concepto nos enfrenta a tener otra pers- nuación de realizar cambios en las solucio- y concentrándose en el comportamiento e
pectiva sobre esos problemas; lógicamen- nes provoque respuestas de dos tipos: o interacción entre las ‘cajas negras’ que cons-
te, una perspectiva más rica y que nos per- pánico o inconsciencia. La reacción de páni- tituyen los elementos.” Estas descripciones
mite avanzar con mayor rapidez y acierto, co consiste en argumentar que todo es muy pueden leerse en diferentes puntos del libro
en comparación con los enfoques que usá- difícil y complicado y que, en definitiva, de Bass, Clements y Kazman y otras simi-
bamos anteriormente. “no se puede hacer”. Alternativamente, la lares en artículos como los del reciente
respuesta se dilata creando una comisión Microsoft EMEA Architects Journal.
Delineando que estudie el asunto. La comisión suele Citando de nuevo el libro de Bass,
enfrentarse al problema de la no-docu- Clements y Kazman: “La arquitectura es el
la arquitectura mentación de las aplicaciones, la ausencia primer artefacto que se puede analizar para
Las aplicaciones actuales se conciben de aquellos que las crearon y la dificultad determinar el grado en que se alcanzarán los
para resolver una problemática específi- de interrelacionar sistemas que nunca han atributos de calidad, al tiempo que sirve
ca y se adaptan a la infraestructura y cono- contemplado la integración como priori- como plano general del proyecto. Una arqui-
cimientos que existen en la empresa. Esas dad (de acuerdo, no seamos tan radicales, tectura sirve como vehículo de comunica-
aplicaciones son como islas, que tienden pongamos que está en el nivel 3 de priori- ción, es la manifestación de las primeras deci-
“ferrys”, con un horario y una capacidad dad). Conclusión: si puede hacerse, será siones de diseño y es una abstracción reuti-
de carga, a otras aplicaciones en forma de caro y/o lento. lizable que puede transferirse a nuevos sis-
volcados de datos hacia ficheros, tablas La reacción de inconsciencia o rambis- temas”. Es decir, la misión de un arquitec-
compartidas y demás artefactos. Sin mo (derivado de Rambo, héroe popular to consiste en producir papel (virtual, si usted
embargo, haga una prueba, solicite usted conocido por su arrojo, paciencia, senti- quiere, pero papel al fin y al cabo). Por
a cualquier departamento de TIC el dia- miento de abandono y locuacidad) se carac- supuesto, huelga decir que sólo necesitará
grama de los nodos de la red, routers, ser- teriza por intentar descubrir, sobre la mar- un mapa cuando la estructura software a ges-
vidores, rangos de IPs, con los anchos de cha, en qué afecta el cambio, ya realizado, al tionar sea amplia, no lo necesitará para ir a
banda que los interconectan, y lo tendrá resto de la estructura software y luego apli- comprar el pan cada mañana.
<<dotNetManía

en un momento. Pregunte por las aplica- car, no siempre con presteza, una solución Esos mapas tienen varias lecturas,
ciones, el volumen de datos que inter- de emergencia. En resumen, ninguna de las igual que los mapas de carreteras reales.
cambian entre ellas, y con el exterior, y dos respuestas supone un buen servicio a la El software tiene una dimensión de infor-
los mecanismos utilizados para ello, y sólo empresa que mantiene a ese departamento mación, una dimensión de seguridad, una

50
<< dnm.arquitectura

dimensión de rendimiento y disponibili- su experiencia, los sistemas preexistentes y beneficio claro y de retorno inmediato que
dad, otra de gestionabilidad y facilidad de los sistemas futuros. reciba una empresa de adoptar el concep-
mantenimiento, una dimensión humana to de arquitectura a su instalación.
(usuarios y desarrolladores), otra históri- Dibujando al arquitecto Ser arquitecto no es cosa fácil, su tarea
ca… Son el equivalente al plan de empre- consiste en conciliar requerimientos que,
sa o al presupuesto general de esta, pero En las organizaciones actuales, las per- en la mayoría de los casos, son antagóni-
centrado en la Solución software. Deberá sonas que asumen parte de esa responsa- cos. Deseamos más seguridad y más ren-
definir los grandes bloques, sus responsa- bilidad son los directores de TIC, los ana- dimiento, menor coste de implementación
bilidades, sus requerimientos operativos, listas, los responsables de sistemas, de pero mayor calidad del trabajo, por ejem-
sus interfaces con el resto de bloques y con seguridad y de comunicaciones, por ejem- plo. El arquitecto juega a encontrar la
el exterior, y su evolución. Observe que plo; pero ninguno de ellos lo hace como solución que optimice el valor de todas
no se menciona para nada la solución esco- tarea principal ni con una visión comple- estas variables.
gida para la implementación. Cuando, en ta del problema. De ahí vamos entrevien- Por otra parte, los conocimientos nece-
un plan de empresa, definimos la necesi- do la necesidad de esa figura, alguien que sarios son variados y, aunque no debe ser
dad de un departamento comercial, no no tenga que gestionar equipos humanos, un experto en todos los ámbitos, cuanto más
explicitamos qué marca de vehículo, móvil presupuestos y el día de un departamen- sepa y mayor experiencia tenga, mejor podrá
o agenda utilizará. to, como corresponde al director de TIC; realizar su tarea. Idealmente, un arquitecto
La arquitectura es, probablemente, el alguien que no es especialista en un domi- debería tener conocimientos de negocio y
fruto de la profesionalización del software nio o área funcional concreta como un gestión empresarial, de análisis funcional,
que mayor retorno de la inversión (ROI) analista; o que tenga una visión mono- de tecnologías de desarrollo, de estándares,
generará para la empresa, previniendo los cromática de la solución como un res- de sistemas, comunicaciones y bases de
males mucho antes de que aparezcan. De ponsable de sistemas o de seguridad. datos, de seguridad, de dispositivos inteli-
nuevo, igual que el plan de empresa o pre- Esta figura aún es, sin embargo, poco gentes, de “cálculo de estructuras”, de explo-
supuesto, supone una referencia básica para visible y poco concreta en las empresas. tación de la solución, de… ¿es necesario que
la toma de decisiones de gestión. ¿Cuántas veces un contertuliano le ha siga?, creo que ya se hace una idea, ¿ver-
entregado una tarjeta en la que rezara el dad? Puesto que se trata de una “ciencia”
Otro sentido para título de “arquitecto de software”? abstracta, es posible que esta sea un área en
¿Ninguna? No le haré la misma pregunta la que los informáticos licenciados con cier-
la calidad sobre los “ingenieros de software”, pues eso tos conocimientos de negocio (¿un máster?)
Cuando hablamos de control de cali- nos llevaría a otra discusión que, créame, puedan iniciar una carrera profesional con
dad del software solemos asociar el con- sería mucho menos ilustrativa. Es mucho mayor claridad que la que ofrecen las figu-
cepto con el número de bugs que tiene. Sin más fácil concretar la labor de un arqui- ras clásicas de las TIC.
embargo, cuando decimos que “un soft- tecto que la de un ingeniero. A pesar de la aparente juventud del
ware tiene calidad” abarcamos aspectos El arquitecto obliga a ver la TI desde concepto de arquitectura en la industria,
mucho más ricos, como la facilidad de uso, dos perspectivas: la de la infraestructura y no lo es tanto en los entornos algo más
la amplitud de sus funcionalidades, el ren- la del negocio, cada “caja negra” ejerce una académicos y podemos localizar biblio-
dimiento, la estabilidad, la facilidad de ins- función en el conjunto global, al igual que grafía, propuestas de métodos, herra-
talación, etc. Estos son los conceptos, a cada departamento ejerce una función en mientas y métricas para llevar a cabo esa
menudo relegados, que la arquitectura el conjunto de la empresa. Es una figura tarea tan amplia. Le recomiendo que visi-
aporta al software. que incorpora la estrategia global del nego- te la página web del reputado Software
Es difícil confeccionar una lista exhaus- cio en las TI. Engineering Institute de la Universidad
tiva de todos los requisitos que debería cum- Por otra parte, el arquitecto obligará Carnegie-Mellon, dispone de un área
plir una aplicación más allá de sus requeri- a considerar seriamente las métricas de las dedicada al estudio de la arquitectura.
mientos funcionales (lo que debe hacer la aplicaciones o el SLA (Service Level
aplicación), entre ellos podemos contem- Agreement, entendido como carga, tiem- Más allá de la teoría
plar: el rendimiento, la robustez, la dispo- po de respuesta, disponibilidad… de cada
nibilidad, la seguridad, la posibilidad de aplicación). Puesto que esos requeri- Realizar esta presentación teórica de
monitorizar o gestionar su funcionamien- mientos forman parte de su cuestionario lo que es la arquitectura y de lo que hace
to, la facilidad para depurarla, la compati- inicial a los que propongan cada necesi- un arquitecto, era necesaria para estable-
bilidad con la plataforma, la utilización de dad. Además, incorporará las aplicaciones cer un marco, para ir perfilando con mayor
recursos como disco, memoria o ancho de críticas (ERP, CRM, producción, SCM…) claridad el ámbito de actuación y dotar de
banda, la facilidad para modificarla, la faci- en una visión global con un objetivo valor al concepto.
lidad de uso y la interoperatividad con otros común; lo que no es baladí, pues estas apli- En próximos artículos atacaremos
sistemas internos y externos. ¿Olvidamos caciones son “reyes de Taifas”, ejerciendo aspectos más prácticos tales como la arqui-
<<dotNetManía

algo?, probablemente sí. Además, el arqui- una cierta tiranía en su área de influencia. tectura orientada a servicios (SOA), las
tecto deberá contemplar los aspectos de Plantear a priori como encajarán en el res- guías de arquitectura de Microsoft, los pat-
negocio como el time-to-market, el presu- to de la arquitectura y como se relaciona- terns, los “tiers & layers”, las aplicaciones
puesto, los recursos humanos disponibles y rán con las demás, será quizá el primer de ejemplo, etc.

51
Por Octavio Hernández
C# .NET MVP
Grupo Danysoft

Crystal Enterprise v10


Una potente plataforma de servicios de informes
Business Objects, líder en el área de Business Intelligence, acaba de lanzar las primeras versio-
nes bajo su égida de los productos Crystal, adquiridos a Crystal Decisions. A continuación pre-
sentaremos Crystal Enterprise 10 [CE10], el hermano mayor de una familia que también inclu-
ye a Crystal Analysis y al ampliamente conocido Crystal Reports.

<< CE10 es una arquitectura común ad hoc tanto de informes "tradicionales"


para el acceso a datos, generación de infor- como de informes analíticos.
mes y entrega de información que per-
mite responder con rapidez a las necesi- A continuación veremos de una mane- Planiificación
dades de desarrollo de informes o aplica- ra resumida las principales ventajas que Las operaciones comunes, tales como
ciones. Ha sido diseñado para integrarse ofrece CE10 a sus categorías de usuarios: la impresión o planificación de informes,
sin fisuras con las inversiones en datos, clientes finales, diseñadores de informes, han sido simplificadas con la introduc-
aplicaciones e infraestructura web exis- desarrolladores y administradores. ción de nuevas características, como los
tentes sin exigir un nuevo conjunto de calendarios o la impresión DHTML.
estándares y procesos. Integra de una for- Para usuarios finales
ma unificada las características de todos Para el diseñador de informes
los productos Crystal para satisfacer las CE10 pone al alcance del usuario
diversas necesidades de los usuarios, des- final amplias posibilidades para el dise- CE10 ofrece una gran fluidez entre
de la generación de informes de calidad ño y ejecución de informes tradicionales informes y fuentes de datos a través de
hasta el análisis profundo de los datos. y analíticos. Los usuarios avanzados y las Vistas de Negocio (Business Views),
Adicionalmente, ofrece amplias facilida- analistas podrán también utilizar CE10 el Repositorio de Crystal y a través de
des para la planificación de la generación como repositorio centralizado para el nuevas características de navegación de
de informes, su distribución automática, acceso a los datos a través de los cuales informes.
el despliegue de informes a través de la conducir los análisis, crear hojas de cál-
infraestructura web de la organización, y culo e informes de calidad y compartir Acceso a datos simplificado
la administración del control de acceso la información a través de la empresa. Las Vistas de Negocio, una novedad
por parte de los usuarios a los informes. CE10, ofrecen una nueva capa de abs-
Todo ello permitiendo aprovechar los Integración con Microsoft Office tracción que simplifica el proceso de
recursos disponibles en su empresa, pues- Ofrece diferentes puntos de integra- conexión a las fuentes de datos de la
to que a) es capaz de acceder a práctica- ción con Office, y permite almacenar y empresa. Mediante las Vistas de Negocio
mente todas las fuentes de datos del mer- gestionar ficheros Excel, Word y es posible además integrar datos prove-
cado a través de más de 30 tecnologías de PowerPoint, manteniendo una única nientes de diferentes fuentes.
acceso diferentes; b) ofrece interfaces para fuente centralizada de información en Repositorio integrado
acceder a todas sus funcionalidades des- diferentes proyectos. de componentes de informes
de los más diversos lenguajes y marcos de Diseño y ejecución directos A través del Repositorio de Crystal,
<<dotNetManía

trabajo de programación; y c) está dispo- de informes y cubos las Vistas de Negocio ofrecen también
nible no sólo para Windows, sino tam- CE10 ofrece un amplio rango de un acceso centralizado a los componen-
bién para Solaris y AIX. posibilidades para el diseño y ejecución tes de informes comunes, lo que hace

52
<< dnm.laboratorio.net

posible compartir componentes útiles Seguridad caciones Java que pueden ser planifi-
con otros diseñadores de informes. CE10 extiende la funcionalidad del cados para su ejecución periódica o des-
Hiperenlace de informes Directorio Activo y LDAP para dar sopor- pués de la ocurrencia de un evento.
Usted podrá utilizar hiperenlaces en te a un conjunto más amplio de escena- • Auditoría: Las nuevas posibilidades
los informes de Crystal Reports o Crystal rios de seguridad. ponen a disposición de los administra-
Analysis (ficheros .RPT y .CAR) para • Directorio Activo (modo nativo): dores un registro histórico de la inte-
conectar la información almacenada en Permite autenticar a usuarios CE10 racción de los usuarios con los objetos
diferentes informes y facilitar la navega- ante un servidor de Directorio Activo. y de la utilización del sistema.
ción a los usuarios finales. • LDAP (SSL): La extensión para Acceso, seguridad y gestión de datos
LDAP ofrece un canal de comunica- Las Vistas de Negocio, un servicio
Para el desarrollador ción seguro entre CE10 y un servidor de metadatos que forma parte de CE10,
de directorio, a través del cual se rea- permiten gestionar fácilmente la gene-
CE10 permite aprovechar todas las lizarán todas las peticiones de autenti- ración de informes contra múltiples fuen-
posibilidades de la plataforma de Crystal cación y autorización de CE10. tes de datos de diferente naturaleza y al
Enterprise con cambios y rediseño míni- Gestión de objetos mismo tiempo abstraer y organizar los
mos en las aplicaciones. Las novedades CE10 aumenta su capacidad para datos para los usuarios finales, gestio-
de esta versión permiten acelerar la cre- centralizar información crítica y distri- nando la eficiencia de consultas y segu-
ación de nuevas aplicaciones y simplifi- buirla de un modo consistente. ridad a nivel de datos.
car la migración de aplicaciones creadas • Objetos de hiperenlace: Mecanismo Soporte para múltiples plata-
para los componentes más pequeños de estándar para acceder a la información formas
la plataforma, por ejemplo Crystal almacenada en sistemas externos. CE10 le permite una amplia flexibi-
Reports. • Paquetes (packages) de objetos: Per- lidad en la elección de sistemas operati-
miten planificar, asegurar y gestionar vos, plataformas y lenguajes:
Controles de servidor .NET informes y aplicaciones relacionadas • Sistemas operativos: Soporte comple-
CE10 ofrece controles visuales y no como si fuera un único objeto. to para todas las funciones de servidor
visuales que contiene la lógica para las • Soporte para objetos de terceros: (incluyendo generación de informes y
operaciones comunes como la autenti- Permite distribuir información adicio- cubos) en Windows, Solaris y AIX.
cación, el listado de carpetas o la visua- nal asociada a los informes operativos • El escritorio web de CE10: La inter-
lización de informes. Es posible mani- • Asistente de publicación unificado: faz web estándar soporta ahora los
pular dichos controles en tiempo de dise- Permite publicar simultáneamente a entornos COM y Java.
ño e incorporarlos fácilmente a las apli- CE10 diferentes objetos, tales como
caciones. informes, documentos de Office y otros Conclusiones
Migración y escalado de aplicaciones ficheros.
Es posible utilizar CE10 para cen- Administración de sistemas CE10 dota a la empresa de una
tralizar y escalar aplicaciones indepen- CE10 permite descentralizar la admi- potente arquitectura unificada para satis-
dientes existentes creadas utilizando cual- nistración. Por ejemplo, se puede dele- facer las necesidades de información a
quier producto de la familia Crystal. gar o automatizar tareas específicas. todos los niveles. Recomendamos su eva-
• Administración delegada: Permite al luación a todos aquellos que necesiten
Para los administradores administrador del sistema distribuir las una plataforma de este tipo para garan-
tareas de administración a administra- tizar la disponibilidad de la información
de sistemas
dores de aplicaciones o elementos espe- a sus usuarios, y en particular a los cien-
CE10 ayuda a los administradores a cíficos de la organización. tos de empresas que actualmente utili-
simplificar su trabajo mediante la dele- • Notificaciones: Son disparadores a nivel zan Crystal Reports como herramienta
gación de tareas y la automatización de de objetos, diseñados en primer lugar para de generación de informes en sus apli-
las operaciones periódicas. CE10 tam- permitirle capturar los fallos críticos de caciones.
bién ofrece soporte multiplataforma, una ejecución o notificar a los usuarios que tie- Para más información consulte con
<<dotNetManía

gestión de datos completa y posibilida- nen a su disposición nueva información. DANYSOFT, VAR Business Objects,
des de auditoría detallada de utilización • Objetos de programa (program en http://www.danysoft.com o el
del sistema. objects): son ejecutables, scripts o apli- 902.123.146.

53
<< dnm.biblioteca.net

dnm.biblioteca.net

C# al descubierto
Joseph Mayo
Editorial: MCGraw-Hill
Nº de páginas: 784
ISBN: 84-205-3477-3
Publicación: 2002

Uno de los mejores libros sobre C# que hemos visto. Recorre de forma exhausti-
va todas las características del lenguaje, desde las estructuras básicas del lenguaje, has-
ta el uso de código inseguro, integración con COM+ o consideraciones de rendimiento.
Analiza igualmente, el uso de C# con algunas de las librerías más importantes
del BCL, tales como ADO.NET y ASP.NET, acceso a ficheros del sistema y

<<
Serialization, uso de bibliotecas de red, características de localización, manejo de
ficheros de recursos, XML, Atributos y Reflection. También revisa los mecanismos
principales que deben seguirse en la depuración de aplicaciones, y algunos aspec-
tos de la ejecución, como el funcionamiento del Recolector de Basura, el propio
CLR (Common Language Runtime), o el despliegue final de la aplicación. En suma
una completa obra para abordar el desarrollo con C# de cualquier proyecto serio.

Arquitectura de aplicaciones para .NET


(Diseño de apicaciones y servicios)
Microsoft
Editorial: MCGraw-Hill
Nº de páginas: 142
ISBN: 84-481-3981-X
Publicación: 2003

Obra de referencia sobre la arquitectura de aplicaciones .NET realizada por la


propia empresa distribuidora del producto. Recorre la arquitectura de aplicaciones
y servicios y su integración correcta en el sistema, abordando todas las capas de la
aplicación, y explicando la forma en que deben de ser interconectadas, evitando
errores comunes, y abundando en las llamadas “buenas prácticas”.
Revisa, igualmente, las más importantes características de seguridad a tener en
cuenta, (directivas de seguridad, administración operativa y comunicaciones), fina-
<<dotNetManía

lizando con un análisis de la implementación física y los requisitos operativos.


Especialmente recomendable para Jefes de Proyecto y Arquitectos de Software.

54
dnm.comunidad.net
<< dnm.comunidad.net

Concurso de creación de páginas Web


con ASP.NET
Microsoft Ibérica ha puesto en marcha el primer concurso para la creación de sitios web
con ASP.NET.

<< El plazo de presentación de proyectos Premios • 3er premio: una película DVD. Un
comenzará el 1 de abril y finalizará el Visual Basic .NET 2003 Standard.
15 de junio. Para participar en esta ini- Sólo por participar, todos los con- Suscripción gratuita a una de las revis-
ciativa, los interesados deben utilizar cursantes que cumplan los requisitos y tas patrocinadoras durante un año.
.NET Framework y cualquier herra- cuyos sitios web sean considerados váli-
mienta de desarrollo como Visual Studio dos, recibirán como regalo dos entra- Requisitos técnicos
.NET o WebMatrix y apoyarse, si así lo das de cine.
desean, en los Starter Kits ASP.NET. Una vez terminado el plazo de pre- • 100% código manejado. El código
Los participantes pueden presentar sentación, un jurado compuesto de una del servidor estará implementado
sus trabajos en cualquiera de las seis cate- persona de cada empresa de alojamiento, 100% en código manejado .NET, per-
gorías habilitadas al efecto: Comercio una de cada revista colaboradora y dos mitiéndose el uso de cualquier len-
electrónico, Portal, Comunidad, In- personas de Microsoft revisarán de for- guaje para su generación. Se podrá uti-
formes, Control de tiempos y Categoría ma individual durante una semana los lizar cualquier versión del .NET
libre (no recogida en ninguna de las cin- sitios participantes, valorando su origi- Framework (1.0 o 1.1). No existen res-
co categorías anteriores). Por otra parte, nalidad y calidad y eligiendo los tres mejo- tricciones en el uso de técnicas de code-
varias empresas de alojamiento web pro- res en cada una de las seis categorías. behind en las páginas ASP.NET, y pue-
porcionarán alojamiento gratuito a los Posteriormente se reunirá el jurado den incluirse también controles o
participantes durante tres meses (desde al completo, se revisarán los 18 sitios librerías externas, siempre que se pro-
la fecha de inicio del concurso y hasta 15 elegidos por cada jurado y sobre ellos porcione el código fuente de las mis-
días después de terminado el plazo de se realizará una votación conjunta y se mas y éste sea también .NET.
inscripción), y una oferta especial con decidirá quiénes son los ganadores. Esta • Herramientas de desarrollo. No es
objeto de que sigan manteniendo sus decisión se anunciará a partir del vier- obligatorio el uso de una herramien-
sitios ASP.NET una vez finalizado el nes 25 de junio en la web de la campa- ta de desarrollo. Si se desea utilizar
concurso. También colaborarán varias ña en MSDN Online y se comunicará una, se podrá elegir entre cualquiera
publicaciones técnicas, las cuales ofrece- a través de la newsletter para desarrolla- de las existentes, como WebMatrix o
rán información del concurso y partici- dores de Microsoft, en los sitios web de Visual Studio .NET 2002 / 2003.
parán en la elección de los ganadores. las empresas de alojamiento, y en las • Acceso a datos. La aplicación servi-
revistas, sitios web y newsletters de las dora no tendrá disponible ninguna
Mecánica del concurso publicaciones patrocinadoras. base de datos como SQL Server o
Habrá tres premios por categoría: Access, pero se podrán utilizar fiche-
El desarrollador debe inscribirse • 1er premio: una consola de videojuegos ros auxiliares de texto o XML para
como concursante en la web Xbox más un juego, mando a distancia almacenar información persistente.
http://www.microsoft.com/spanish/msdn para ver DVDs en la Xbox y una pelí- • Código cliente. No se utilizarán com-
/concuasp en el plazo indicado. Una vez cula DVD. Un Visual Studio .NET ponentes en cliente que el usuario deba
inscrito se enviarán sus datos a una de las 2003 Enterprise Developer. Alojamiento descargar, del tipo ActiveX o similares.
empresas de alojamiento web, la cual le gratuito ASP.NET con una de las El HTML generado por la aplicación
dará de alta como concursante. Desde ese empresas patrocinadoras durante un web puede utilizar cualquier tecnolo-
momento dispondrá de un plazo máximo año. Suscripción gratuita a una de las gía presente en Internet Explorer 6:
de 15 días para que comience a crear su revistas patrocinadoras durante un año. –HTML y DHTML
sitio web (en caso de no hacerlo se le dará • 2º premio: un juego para Xbox y una –Hojas de estilo CSS
de baja) y de otro plazo máximo de 30 película DVD. Un Visual Studio –Scripting
días desde el alta para terminarlo. Cada .NET 2003 Professional. Alojamiento –Data Binding
desarrollador sólo puede participar con gratuito ASP.NET con una de las –Comportamientos
<<dotNetManía

un sitio web por cada categoría. Por otra empresas patrocinadoras durante un Para más información:
parte, para poder participar, el concur- año. Suscripción gratuita a una de las http://www.microsoft.com/spanish/ms
sante debe residir en España. revistas patrocinadoras durante un año. dn/concuasp.

55
<< dnm.opensource

Fernando Nogueras

Un framework en .NET: datnet


Cualquier ayuda para que nuestro trabajo sea más fácil y rápido nos es gra-
tamente bienvenida. Si además beneficia a la calidad de nuestros proyectos y
nos provee una base útil para reutilizar en todos nuestros trabajos, pues mejor
que mejor

<< Un framework es una especie de plantilla que nos sirve Hay numerosos frameworks en Java, como el
como punto de partida para crear nuestra aplicación. archiconocido struts, que implementa el patrón MVC
Los frameworks se basan en la idea de “Trabaja sólo (Model View Controller) y que se usa sobre todo para
una vez y reutiliza, aunque la primera vez tardes un construir aplicaciones Web, y me consta que es utili-
poco más”. Hay varios tipos de frameworks pensados zado en muchos entornos profesionales.
para aplicaciones con distintos objetivos. Los más La comunidad .NET es algo más joven que la de
comunes son los frameworks para la construcción de Java y aún presenta pocas alternativas en esta mate-
aplicaciones distribuidas, pues es esta arquitectura la ria, aunque poco a poco se empiezan a ver sus frutos
que puede englobar mayor tipo de situaciones y ser- y Microsoft va ‘soltando’ herramientas con código
vir para un mayor número de usos. libre, como los Application Blocks, que aunque no son
frameworks completos, sí que nos facilitan determi-
nadas tareas concretas.
datnet es un framework para construir aplicacio-
nes distribuidas en la plataforma .NET. Si bien aún
está en fase de desarrollo, el proyecto es bastante
maduro y puede utilizarse perfectamente para nues-
tro trabajo cotidiano, aunque al principio tendríamos
que pelearnos un poco con la instalación para “echar-
lo a andar”, pues la documentación y los tutoriales
escasean en este proyecto. Echo de menos una guía
de iniciación o Quick Tour.
Su arquitectura se basa en el uso de .NET
Remoting, Web Services, independencia del origen de
datos,… y en patrones de diseño bien conocidos, como
Façade, Command, Controller o MVC.
A continuación vamos a comentar brevemente la
arquitectura de una aplicación basada en datnet:
El framework ideal sería, en mi opinión, aquel que Los clientes (formularios Windows, páginas ASP,
te permita solamente preocuparte de desarrollar la Smart Devices, etc...) se comunican con un Controller,
lógica de negocio y la interfaz de usuario, sin tener en un Command o un Business Logic:
cuenta pormenores relativos a la plataforma o de si la a. Controller: Controla el flujo de la aplicación,
capa de acceso a datos está en el mismo equipo o en encargándose de hacer las llamadas pertinentes
un servidor de Hong Kong. Y que, por descontado, a la lógica de negocio y manteniendo el estado.
nos permita cambiar de un tipo de aplicación Web a b. Command: Cada comando se corresponde con
otra tipo Windows o a una para un smartPhone, sin una acción o caso determinado que puede rea-
<<dotNetManía

tener que desarrollar una sola línea de código adicio- lizar el usuario en la interfaz grafica.
nal. ¡Ah!, y su tiempo de aprendizaje tiene que ser de c. Business Logic: Capa común con las clases repre-
2 a 3 horas máximo. sentativas del mundo real o lógica de negocio.

56
<< opensource

Se utiliza el gateway para establecer no nos interesen para adaptarlo a nues- aumentar su cuantía en los próximos
la comunicación entre uno de los obje- tros requerimientos. Por ejemplo, meses. Aprovecho para instar al lector
tos explicados anteriormente y la lógi- podemos utilizar el Microsoft User a que se baje la última versión, la insta-
ca del servidor, utilizando unos objetos Interface Application Block para contro- le y se pelee con su código. Desde
especiales llamados DTO que encapsu- lar el flujo de nuestra aplicación y lla- dotNetManía seguiremos prestando
lan la información a enviar. mar a los objetos Command a través de especial atención a proyectos como éste
El gateway llama al Remote Service él o simplemente crear nosotros mis- que hacen más fácil la vida al progra-
directamente o bien, opcionalmente, a mos la interfaz de usuario y que esta se mador, y pedimos a los participantes de
través de un servicio web (Service ocupe de llamar a los Commands. estos proyectos que se esmeren en hacer
Dipatcher). En la página del proyecto podemos una documentación fácil y completa del
El Remote Service se encarga de ver consultar documentación más extensa proyecto, para que todo su esfuerzo se
que mensaje le llega y de generar la lla- sobre la arquitectura y algunos diagra- vea recompensado y la comunidad de
mada a los métodos correctos de la lógi- mas de secuencia que nos aclararán el programadores no se aburra al intentar
ca del servidor (Server Logic). funcionamiento de la misma, mostran- utilizarlo, por ser demasiado compleja
Una de las características más atrac- do la secuencia que se produce cuando su puesta en marcha.
tivas de datnet es que es un framework se hace una llamada al sistema. Página del proyecto:
bastante extensible, esto es debido a que Datnet es una buena base para aden- http://datnet.sourceforge.net/
está bien modularizado de forma lógi- trarse en el mundo de los frameworks Desde aquí puedes bajar los fuentes:
ca y podemos añadir o quitar partes que en .NET, que a buen seguro veremos http://sourceforge.net/projects/datnet

Rocketinfo RSS Reader, un lector RSS gratuito basado en la Web

Rocketinfo combina búsqueda avanzada y tecnología de aplicabilidad con el emergente formato


RSS en una potente heramienta de contenidos.

Búsqueda, suscripción, lectura y rastreo de noticias


e información
• Cuenta privada gratuita
• Sin desacargarse software
RocketInfo, un proveedor de soluciones de búsque- • Cientos de fuentes RSS, Atom y Weblog
da y contenido de noticias ha anunciado el lanzamiento • Cree sus canales RSS con sus propias palabras cla-
del Rocketinfo RSS Reader, un lector RSS basado en la ve
Web que provee acceso a las noticias y a la información • Suscripciones a grupos de noticias
desde fuentes RSS, Atom y Weblogs, incluyendo la base • Soporte de RSS 0.91, 1.0, 2.0 y Atom
de datos de noticias de Rocketnews.
El lector RSS Rocketinfo Reader aprovecha las ven- Plataformas soportadas
tajas de la creciente popularidad de RSS y Atom para dar
acceso actualizado a las noticias de cientos de fuentes • Todos los sistemas operativos con un explorador
tales como CNN, la BBC, CNET y el New York Times. compatible
Los usuarios pueden seguir y leer las últimas noticias de • Internet Explorer 4 o superior
todos ellos desde sus fuentes favoritas. Construido bajo • Netscape 6.0 o superior
la experiencia de la compañía en tecnologías de búsqueda • Mac Safari
en background, el Rocket RSS Reader también ofrece • Opera 7.11+
la habilidad de crear búsquedas a través de palabras cla- • Konqueror 3.0+ (Linux)
ve y guardarlas como canales RSS o grupos de noticias.
El lector hace fácil encontrar fuentes RSS o añadir fuen- Si quiere saber algo más sobre RSS puede ver el
tes de noticias o weblog que estén disponibles en cual- artículo “Intercambiando contenidos en RSS con
<<dotNetManía

quier versión de RSS o Atom. ASP.NET” de Jorge Serrano, en el número 1 de


dotNetManía.

noticias.noticias.noticias.noticias 57
<< dnm.desvan
Marino Posadas
noticias.noticias
la búsqueda de soluciones que van, desde las passwords
temporales (que solo duran 60 segundos y son generadas
por el sistema), hasta la autenticación federada vía Internet.

Usuario y Password no son suficientes: según se comen- ¿Cuánta información nuestra o de nuestras compañías
tó en la pasada RSA Security Conference (http://infor- hay en Google?
mationweek.securitypipeline. com/news/18201171) sobre
seguridad, las viejas formas de autenticar están empe- Esa es la pregunta que se hace Scott Granemann, que ha
zando a mostrar debilidades que debieran de ser supera- hecho pruebas concluyentes al respecto, según podemos
das mediante nuevas tecnologías. La solución podría estar leer en su artículo “The perils of Googling”, publicado
en tarjetas inteligentes: Smart Cards (pequeños disposi- en The Register: http://www.theregister.co.uk/content/
tivos que se pueden “pinchar” en un ordenador y que 55/36142.html. Granemann se pregunta hasta dónde se
garantizan la identidad de éste). Empresas como RSA puede llegar con páginas como http://www.google.com/
Security Inc y VeriSign Inc, colaboran con Microsoft en advanced_search (búsqueda avanzada).

documentos en la red Utilidades del mes


MZ-Tools 3.0: Software gratuito para versiones VB5, VB6 y
Interesante artículo de Brad Abrams acerca de VBA que añaden nuevas características que se echan de
Platform/Invoke y la forma de llamarlo en menos en el IDE: copiar y pegar controles con su código
C# (http://blogs.msdn.com/brada/archive/ asociado, buscar procedimientos, adición automática de
2004/02/28/81586.aspx). gestores de error, conversión de ámbito de variables, etc.
(disponible en http://www.mztools.com/)
Escuela Murciana de .NET: Llamamos así a 3 SharpToolbox: Exhaustiva lista de utilidades para Visual
sitios Web de primera calidad regidos por 3 Studio .NET agrupadas por categorías (dependiendo de
colaboradores de DotNetManía: Miguel los espacios de nombres). Las hay Freeware, Shareware y
Egea, Salvador Ramos y Eladio Rincón (por comerciales. (http://sharptoolbox.madgeek.com/)
orden alfabético).
Internet Connection Speedometer: herramienta web para
Sitio Web de Miguel Egea: medir la velocidad de la conexión a Internet (tiene una
Colaborador de varias curiosa interfaz gráfica). Accesible en
revistas, ponente habitual http://promos.mcafee.com/speedometer/test_0150.asp
en muchos congresos y
eventos Microsoft, Miguel lleva ya años al Blogs del mes
frente de este estupendo sitio:
http://www.portalsql.com/ DevHawk: http://www.devhawk.net muy buen sitio con una
lista impresionante de enlaces de calidad, además de artí-
Sitio Web de Salvador Ramos: culos, trucos, etc.
http://www.helpdna.net/ Asíduo colaborador
de varias revistas, y gran DevDaysBloggers: http://devdaysbloggers.net sitio dedicado al
conocedor de las bases de RSS. Contiene herramientas, "aggregators", enlaces, etc.
datos, sus noticias y artícu- NuDitAddIn: Sitio Web de Jamie Cansdale. Excelente, en cuan-
los son de lectura reco- to a trucos de código fuente en .NET y multitud de sugeren-
mendada. cias interesantes. (http://weblogs.asp.net/nunitaddin)
Sitio Web de Eladio Rincón IUnknown: Sitio Web de John Lam, con interesantes refle-
(http://eladio.europe.webmatrixhosting.net/) xiones sobre el código fuente en .NET.
Excelente sitio especializado (http://www.iunknown.com)
<<dotNetManía

en SQL-Server y su trata-
miento desde la programa- Martin Fowler: Similar al anterior, el Martin Fowler's Bliki
ción en .NET. Multitud de artículos y buenas (http://martinfowler.com/bliki) es un depósito de ideas sobre
referencias. desarrollo.

58