Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos...

60
El real valor de las certificaciones del mundo informático (de sus realidades, mitos y proyección) opinión nº3 abril 2004 • Precio: 6,00 (España) 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 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 Crystal Enterprise v10 datNet Concurso de creación de páginas Web con ASP.NET Laboratorio Crystal Enterprise v10 Open Source datNet Comunidades Concurso de creación de páginas Web con ASP.NET Equivalencia de instrucciones 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 Equivalencia de instrucciones 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 dotNetManía dotNetManía www.dotnetmania.com Dedicada a los profesionales de la plataforma .NET Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System

Transcript of Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos...

Page 1: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

El real valor de las certificaciones del mundo informático (de sus realidades, mitos y proyección)opinión

nº3 abril 2004 • Precio: 6,00 € (España)

Visual Studio 2005 y SQL Server 2005Whidbey y Yukon ya tienen nombre

El poder de la reflexión en .NETGeneración de tipos en tiempo de ejecución

Visual Studio 2005 y SQL Server 2005Whidbey y Yukon ya tienen nombre

El poder de la reflexión en .NETGeneración de tipos en tiempo de ejecución

LaboratorioCrystal Enterprise v10

Open SourcedatNet

ComunidadesConcurso de creación de páginas Webcon ASP.NET

LaboratorioCrystal Enterprise v10

Open SourcedatNet

ComunidadesConcurso de creación de páginas Webcon ASP.NET

Equivalencia de instruccionesde C# y VB .NET (y III) •Configuración deaplicaciones Web de ASP.NET• Gestión de concurrencia enADO.NET • Introducción aGDI+ • SQL-Server. Diseñar laestrategia de copias deseguridad y restauraciones •El Señor Arquitecto

Equivalencia de instruccionesde C# y VB .NET (y III) •Configuración deaplicaciones Web de ASP.NET• Gestión de concurrencia enADO.NET • Introducción aGDI+ • SQL-Server. Diseñar laestrategia de copias deseguridad y restauraciones •El Señor Arquitecto

dotNetManíadotNetManíawww.dotnetmania.com Dedicada a los profesionales de la plataforma .NET

Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System

Page 2: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve
Page 3: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

Por supuesto, la noticia del mes es el retraso quesufrirán los lanzamientos de Whidbey y Yukon quese trasladan a mediados del 2005 y que saldrán almercado conjuntamente bajo los nombres VisualStudio 2005 y SQL Server 2005. Algunos usuarioshan mostrado su malestar al respecto, puesto quehabían pagado por el programa Software Assurancedurante tres años sin recibir ninguna actualizaciónprincipal a cambio. Luego están los que se preocu-pan por el soporte de las versiones actuales que pue-den terminar de ofrecerse con poca diferencia conlas versiones nuevas. Otros opinan que lo mejor esque el software salga al mercado cuando realmenteesté listo y que esto es mejor aunque haya que espe-rar algo más. Pero es que todo esto afecta a tantascosas que sería mejor que estos chicos de Microsoftafinasen más, si bien es cierto, que yo me encuentroentre los que opinan que los lanzamientos precipi-tados para cumplir fechas son a la larga peores paralos usuarios.

Acabamos de recibir la noticia de la multa decasi 500 millones de euros (la más alta impuestahasta ahora por este organismo) que la ComisiónEuropea ha impuesto a Microsoft por supuestoabuso de posición dominante en el mercado euro-peo. Ahora se iniciará una nueva, larga y aburridabatalla legal, por supuesto. Esto viene después deque Steve Ballmer hiciera un viaje inesperado aBruselas, cancelando su keynote en el Summit elmiércoles 17, en la que se especulaba que habríauna demo de Indy, para intentar llegar a una sali-da negociada que finalmente no fue posible.¿Tendremos un Windows europeo distinto del res-

to? ¿Esta Comisión no debería ser más dura conotros monopolios de hecho que sufrimos los usua-rios de manera sangrante? ¿Lo han hecho en bene-ficio de los usuarios o de los competidores deMicrosoft? Me consta que los fabricantes de RealPlayer, Real Networks están muy satisfechos.Personalmente a mí me importa poco si Windowslleva o no Windows Media Player, de todas formasyo uso Winamp, pero un sistema operativo debeser capaz de abrir el máximo tipo de archivos posi-ble. ¿Harán lo mismo con los visualizadores deotros tipos de archivos? ¿Es mejor para los usua-rios un sistema operativo incapaz de abrir archi-vos en aras a que la competencia pueda vender susvisores?

No quisiera terminar sin tener un sentidorecuerdo para las víctimas y sus familiares y ami-gos del atentado cometido por seres humanos enMadrid el 11 de marzo. Extraña palabra la palabra“humanidad” que suele usarse como aglutinadorade todos los buenos sentimientos que sólo loshumanos podemos sentir. Me pregunto si tambiéndebería servir para aglutinar todo lo malo que sólolos humanos podemos hacer. Sólo un humano pue-de ser tan despiadado. ¿Fue, pues, éste un acto de“humanidad”? Cómo me avergüenza pertenecer ala misma especie animal que alguno de mis con-géneres. No debemos olvidar tampoco a los muer-tos en Nueva York, en Irak, en Afganistán, en Pales-tina, en Israel, y en tantos sitios donde mueren ino-centes y no tan inocentes a manos de asesinos lega-les o ilegales ¿en nombre de quién? Desde luegono en mi nombre.

dotN

etM

anía

<<

3

No en mi nombre<<

dnm.editorial<<dnm.editorial

EditorPaco Marín ([email protected])

AdministraciónPilar Pérez ([email protected])

Asesor Técnico/CoordinaciónMarino Posadas ([email protected])

PublicidadJuan Manuel Urraca ([email protected])

Redactores y ColaboradoresAlejandro Mezcua, Angel Esteban,Antonio Quirós, Antonio Rojo, DavidCarmona, Eladio Rincón, Francisco

Charte, Fernando Guerrero, FernandoNogueras, Guillermo ‘guille’ Som, IvánGonzález, Jesús López, Jordi Rambla,Jorge Serrano, José Manuel Alarcón, JuanTorres, Liborio López, Luis Miguel Blan-co, Marino Posadas, Miguel Egea, MiguelKatrib, Pablo Abbate, Pedro Gómez,Pedro Pozo, Pepe Hevia, Salvador Ramos

Diseño y MaquetaciónÉride Diseño GráficoTel.: (34) 91 477 48 [email protected] • www.eride.net

EditaNetaliac/ Robledal, 13528529 Rivas-Vaciamadrid (Madrid)Tf. (34) 91 6667477Fax (34) 91 4991364

ImprimeGráficas Vallehermosowww.graficasvallehermoso.com

Depósito LegalM-3.075-2004

[email protected]

[email protected]

Nuevos [email protected]

Page 4: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

3dnm.sumario

El real valor de las certificaciones del mundo informático 8-10(de sus realidades,mitos y proyección)

El mundo de las certificaciones IT, casi desde su aparición ha generadocontroversia, entusiastas y detractores.

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

Configuración de aplicaciones Web de ASP.NET 16-19En versiones anteriores de la tecnología ASP, la configuración de aplicaciones Webse realizaba de forma muy distinta. En este artículo damos un breve repaso a lasopciones principales de configuración de ASP.NET

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

El poder de la reflexión en .Net 27-34Este trabajo muestra cómo usando reflection se define un conversor de tipos quepermite a partir de un objeto, el cual comparte una misma funcionalidad con uninterface, obtener un objeto proxy equivalente en funcionalidad al original peroque garantiza ser subtipo de dicha interface.

Introducción a GDI+ 37-42La llegada de la tecnología .NET ha venido acompañada de GDI+ (GraphicsDevice Interface), que como su nombre deja entrever, se trata de la nuevageneración del API gráfico de Windows, adaptado a la plataforma .NETFramework.

SQL-Server.Diseñar la estrategia de copias de seguridad y restauraciones 43-49Todos los sistemas necesitan una salvaguarda, pero aquellos que contienen datosimportantes mucho más aún. En una base de datos suele guardarse informaciónmuy viva y casi siempre trascendental para el negocio que sustentan.

El Señor Arquitecto 50-51Parece 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 bombardeosirve para allanar el camino hacia el combate con nuestro enemigo virtual?

Crystal Enterprise v10 52-53Business Objects, líder en el área de Business Intelligence, acaba de lanzar las primerasversiones bajo su égida de los productos Crystal, adquiridos a Crystal Decisions. En esteartículo presentamos Crystal Enterprise 10 [CE10], el hermano mayor de una familiaque también incluye a Crystal Analysis y al ampliamente conocido Crystal Reports.

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

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

Open Source 56-57dataNet

Desván 58dnm

.sum

ario

Page 5: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

Entre

gaes

tecu

pón y ob

tendrá

s

507

de de

scuen

toal

inscri

birte

a nues

tros pro

gramas

Page 6: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

dotN

etM

anía

<<

6

dnm.noticias<<dnm.noticias

Whidbey y Yukon ya tienen nombre: Visual Studio 2005

y SQL Server 2005

En el número anterior de dotNetManía ya ade-lantábamos como rumor el retraso que sufriríaWhidbey, según palabras del “padre” de ASP.NET2.0, Scott Guthrie. Pues bien, ya no es un rumor.El día 10 de marzo, Microsoft hizo público el retra-so que sufrirán tanto Whidbey como Yukon, quepasan de estar listos antes de terminar el 2004 aestarlo en el primer semestre de 2005. Fue elmomento para asignarles su nombre comercial:Visual Studio 2005 y SQL Server 2005.

Según fuentes de Microsoft, “Microsoft hatomado la decisión de retrasar la entrega de estosproductos para poder llegar a ofrecer los altísi-mos requerimientos que nos han pedido nuestrosclientes”.

Según Tom Rizzo, Director of ProductManagement for SQL Server, hemos decidido sacaruna beta 2 de Yukon y una beta 1 de Whidbey haciamediados de 2004 y finalmente una beta 3 deYukon para finales de 2004 que no estaba previs-

ta. Ambos productos van a estar estrechamenteintegrados, se lanzaron a la vez.

El soporte completo de SQL Server 7 y SQLServer 2000 termina en el año 2005, por lo que elretraso en la salida de la nueva versión de SQLServer, significa que habrá menos tiempo para lamigración. ¿Supone este retraso en la salida deYukon, un retraso igual en la fecha tope de sopor-te de las versiones anteriores? Según el citado TomRizzo, Microsoft está considerando una amplia-ción de este soporte.

Además, esto puede tener, a nuestro juicio, unclaro efecto dominó. Longhorn, la siguiente ver-sión de Windows, sufrirá posiblemente un retra-so en su salida, al igual que puede ocurrir con elOffice 12, la versión de Office para este sistemaoperativo. Hay que tener en cuenta que este sis-tema operativo usará a Yukon para gestionar losdatos del sistema. Así mismo, las nuevas versionesde productos como SharePoint Portal Server,Content Management, Commerce Server depen-den estrechamente de ASP.NET 2.0 e igualmen-te se pueden ver afectados.

Claro que hay fuentes que aseguran que elretraso es precisamente porque una buena partede los desarrolladores de Yukon están trabajandoen WinFS, y no sería de extrañar pues la salida deLonghorn es vital para la compañía y empieza aespecularse que podría irse hasta el 2007.

Oficialmente, Microsoft sólo reconoce el posi-ble retraso de Orcas que estaría disponible un parde años después de la salida de Whidbey, segúnafirma Ari Bixhorn, Visual Studio Lead ProductManager, en una entrevista concedida a eWeek.

no

ticia

s.n

oti

cia

s.n

oti

cia

s.n

oti

cia

s.n

oti

cia

s.n

oti

cia

s

Page 7: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

dnm.noticias<<

Nuevas versiones de WindowsWindows 2003 R2 para 2005

Microsoft ha confirmado su intención de lanzar Windows 2003R2, una actualización que evolucionará al actual Windows 2003Server 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óngold 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 .NETFramework 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 Longhorninstalado.

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 nuevoWindows Security Center que centrali-zará la configuración de seguridad y queincluye incluso protección antivirus; unnuevo firewall que reemplaza al actualICF (Internet Connection Firewall) conpolíticas de grupo integradas en elActive Directory; una nueva versión deRPC para protección contra ataques enla red;un bloqueador de popups y un

gestor de descargas en el también nuevo Internet Explorer junto con mejoras de seguridad en elOutlook 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 MediaPlayer; y otros cambios.

La RC1(Release Candidate 1) de Windows XP SP2 ya está disponible y los betatesters registradospueden descargarla desde http://www.microsoft.com/sp2preview. Puede obtener más informaciónen el MSDN en http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnwxp/html/secu-rityinxpsp2.asp

dnm.noticias

Page 8: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

dotN

etM

anía

<<

8

De sus realidades y de sus mitos

Cuando estaba en la universidad, una de las cosasque siempre tuve muy claras era la del hecho de bus-car una certificación IT avalada. Cuando rendí mi pri-mer examen, hace ya varias líneas de código = ), la ver-dad estaba demasiado nervioso. Como cualquier neó-fito, compartí mi tensión , con mis parceros (amigos)y mi familia, hablándoles de lo que para mí en eseentonces implicaba un espléndido reto. Al final delexamen todo salió bien (es un momento que aúnrecuerdo con sonrisa en el rostro), llamé a mi familiay le escribí a mis amigos del suceso… Varios de uste-des se preguntarán porqué esta introducción de índo-le tan personal; pues bien así de importante fue parami rendir mi primer examen de certificación, pero conel correr de los días dicha ilusión fue al traste…

"..Las certificaciones IT, desafortunadamente, noson tan importantes como crees, es más, fue un dife-renciador algún tiempo, pero con los días se ha con-vertido en toda una farsa.", me repitió mi maestra deconstrucción de software. Lo curioso es que para esosdías en Colombia (hace siete años aproximadamente),la cantidad de certificados era mucho menor, e inclu-so, ella viajó a Estados Unidos para tomar la capacita-ción debida, pues no existía en el país ese tipo de entre-namiento aun. Le pregunté por qué razón afirmaba talcuestión, "... Willy, verás en estas URL's los exáme-nes están a la venta…", la verdad no podía creerlo, no

podía creer que después de invertir cerca de 500 dóla-res en una semana de educación técnica (demasiadodinero para las economías "latam" en esos días e inclu-so hoy) y pagar 80 dólares aproximadamente por elexamen, alguien vendiera la prueba por 200 dólaresaproximadamente (mucho más que para esos días elsalario promedio para un desarrollador no sumaba másde 220 dólares mensuales en el mejor de los casos aeste lado del charco), quedé realmente desilusionado,y entendí que nunca las certificaciones equivaldrían osuperarían las ingenierías por dos razones: una de ellas,la que acabo de relatar; y la siguiente, porque las tec-nologías tienen una duración muy corta, en cambio,cuando eres ingeniero, tus bases "ingeniériles" duranpara siempre (aunque la verdad es que hoy me lleva-ría un rato recordar la metódica de solución a las trans-formadas de fourier =P).

Con ello y otros bemoles, seguí igual tomando miscursos técnicos y rindiendo mis exámenes (incluso per-dí el 70-300, un examen de arquitectura de .NET enel primer intento, hace sólo algunos meses). A estasalturas usted se puede preguntar ¿porqué seguir rin-diendo estas pruebas, que pareciere que día a día, estu-vieren más y más a la venta por unos pocos dólares?(La verdad es que me asombra el nivel de fidelidad deesos documentos; es tal el descaro, que salen hasta lascapturas de pantalla). ¿Porqué rendir una prueba quetiene un coste tan alto, si las respuestas están a la ven-ta por un valor con el cual podría comprar el examen

El real valor de las certificaciones del mundo informático (de sus realidades,

mitos y proyección)

Por Willy Marroquín Visual Basic MVPwillydev.net

<<

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 deeste tema, así que ¡allí vamos!

Page 9: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

completo? -Cuando hago referencias a ellos, no merefiero a las pruebas de preparación o a los libros quese escriben sobre tema, desde luego-. Ojalá las multi-nacionales IT que tienen que ver con estos procesos decertificació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 desus exámenes, hacen llegar una especie de certificadoimpreso 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 debolsas de empleo de las personas que certifican o la pro-moción de dichas personas por algún tipo de canal, cosaque ha día de hoy no sucede y parece que se divise (esteúltimo comentario es una generalidad, desde luego, porestos lados, las personas de Microsoft, están retoman-do el tema con toda la fuerza que amerita).

Una perspectiva mundial y los certificados

Recientemente una de las publicaciones másimportantes en el tema, MCPMag.com, publicó elresultado de su estudio de salarios con respecto a losprofesionales certificados (no sólo de Microsoft, sinode 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

han pasado a ser necesidad por solicitud de los emple-adores y una tendencia al aumento de sus salarios…entonces ¿qué es lo inclusive de esta encuesta? Bueno,dicha labor de recolección de información, sólo se lle-vó acabo en Estados Unidos, ¿y el resto de nosotrosdonde quedamos? ¿Será que nuestras economías pue-den equipararse en proporción a salarios…? La res-puesta evidentemente es no. Lo que implicaría que elcoste de dicho tipo de educación fuere proporcional-mente ajustada. No son lo mismo 100 dólares enEstados Unidos que en Latam...

dotN

etM

anía

<<

9

dnm.opinion<<

Figura 1. Reporte de Certificados a Febrero de 2004

Figura 2. Reporte de MCP's en los últimos nueve meses

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

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

Page 10: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

Desde luego las variables macroeco-nomías influyen localmente, pero si se vecon detenimiento el coste de este tipo deformación IT, no sólo debería ser ajus-tada localmente, sino después de ajusta-da, reducirse por lo menos a la mitad. Lajustificación de esta premisa está en quesomos nosotros los IT (me refiero a todoel gremio, pero con más fuerza a los desa-rrolladores de software) quienes hace-mos que las plataformas permanezcany/o se difundan, ello debido a nuestrainclinación hacia la misma (llámese comose llame), pues si no hay productos parala plataforma X o Y, ésta pierde su posi-cionamiento.... pero bueno ello daría paraotro escrito de esta saga.

Debido al crecimiento de las certi-ficaciones como requisito, se hace cadavez más importante la intervención dela industria, para que estas credencialesconserven (o en algunos casos recupe-ren) su buen nombre.

Una buena alternativa, pudiere ser elhecho de exigir un tiempo comprobable

con la tecnología antes de rendir la prue-ba de certificación de la misma y con ellosustentar la credencial en caso de rendirpositivamente la prueba. A día de hoy,algunas compañías, mantienen esta mecá-nica. Esto permite mantener la credibi-lidad en la credencial y en consecuenciadel profesional que decide tomarlas y melleva al siguiente punto de este escrito...

¿Contrataría usted a unprofesional sin experiencia de campo y con certificacionesa su haber?

Esta es la misma pregunta que debe-rían hacerse las personas que se lograncertificar de una manera, cómo decir-lo… "poco ortodoxa".

Si me hicieran esta pregunta, mi res-puesta sería un contundente JAMÁS (¿dequé me sirve un experto de diploma, sien realidad tengo un fiasco como emple-ado?). Desde mi perspectiva, es sencilla-

mente inconcebible que un profesionaldiga tener credenciales que lo habilitancomo experto en un frente tecnológicoy que no posea experiencia. Si usted esempleador, es muy buena idea enterarsedel Skill de cada certificación, y con ellodeterminar si es equiparable lo uno conlo otro. Es notorio que la certificación esun diferenciador, pero no lo será pormucho tiempo, pasará a ser un requisito(así se puede leer en la encuesta deMCPMag que recomendaba unas líneasarriba), aunque bueno fuera que reco-brara su estatus de credibilidad.

A pesar de esta posición un pocoescéptica (y desde luego desde una pers-pectiva muy personal y ya para rematarestas líneas), usted debe tener en cuen-ta que las certificaciones son buena idea,pero aún mejor idea es conocer a fon-do las tecnologías para ser un real exper-to… así no te certifiques. Nos vemos enun próximo articulo… debo seguir estu-diando para rendir mi próxima certifi-cación =).

dotN

etM

anía

<<

10

dnm.opinion<<

noticias.noticias.noticias.noticias

Con motivo del Silicon Valley Speaker Series,en marzo de 2004, Microsoft presentóBizTalk® Server 2004. BizTalk es una solu-ción de integración líder en la industria ymiembro del Windows Server System™. Lasaplicaciones creadas con BizTalk Server 2004corren bajo .NET Framework, lo cual per-mite a los clientes automatizar y administrarprocesos empresariales complejos al integraraplicaciones, socios comerciales y emplea-dos con el núcleo de organización de proce-sos altamente escalable de BizTalk Server.BizTalk Server 2004 ayuda a incrementar laproductividad de los trabajadores con infor-mación, los profesionales en TI y los desa-rrolladores a través de herramientas especí-ficas para desarrollar, administrar y accedera los procesos empresariales en entornosfamiliares tales como Microsoft OfficeSystem y Visual Studio® .NET 2003.

“En la actualidad, las empresas se enfren-tan a retos importantes para administrar yautomatizar los procesos empresariales cadavez más desconectados. BizTalk Server 2004permite a los clientes administrar y automa-tizar sus procesos empresariales, al tiempoque brinda a los usuarios herramientas paradiseñar, implementar y supervisar estos pro-cesos en tiempo real”, dijo Ted Kummert,

vicepresidente corporativo del Grupo deServidores E-Business de Microsoft. “Losprimeros usuarios han obtenido gran valorde sus soluciones BizTalk Server 2004, y eldía de hoy nos emociona poder ofrecer losmismos resultados a más clientes”.

Nuevas características que organi-zan y administran los procesos empre-sariales de principio a fin Además de lascapacidades de integración de aplicacionescontenidas en las versiones anteriores,BizTalk Server 2004 brinda nuevas capaci-dades que permiten a las empresas admi-nistrar y aplicar reglas a los procesos empre-sariales, conectarse con los socios comer-ciales y analizar el estado de los procesosempresariales en forma más efectiva. Lasnuevas funciones incluidas en BizTalkServer 2004 incluyen lo siguiente:

• Administración de procesos empresa-riales (BPM). Ofrece una máquina demensajes y organización muy escalable concapacidad BPM de nivel empresarial,incluyendo soporte para Business ProcessExecution Language (BPEL), un nuevoestándar para enlazar los procesos empre-sariales entre los socios comerciales, lasaplicaciones y los usuarios empresariales.

• Integración en Visual Studio .NET2003. Permite a los desarrolladores cre-ar, organizar y administrar los procesosempresariales a través de un ambiente dedesarrollo integrado y muy productivo.

• Supervisión de actividad de estado(HAT). Permite a los administradoressupervisar y administrar el estado de susprocesos empresariales dentro de susambientes BizTalk Server.

• Entrada única empresarial. Optimiza elproceso de verificación de entrada de losusuarios Windows y no Windows que acce-den a las aplicaciones de giro empresarial.

• Máquina de normas empresariales muyescalable. Permite a los analistas empre-sariales crear normas y políticas flexiblesy de mejor respuesta en torno a los pro-cesos empresariales.

• Supervisión de actividad empresarial(BAM). Ofrece a los trabajadores coninformación supervisión en tiempo real delos procesos empresariales a través deherramientas conocidas como MicrosoftOffice Excel o Microsoft Office SharePointPortal Server 2003.

• Integración en Microsoft OfficeSystem. Permite el análisis de procesos ydatos.

Microsoft lanza BizTalk Server 2004

Page 11: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

dotN

etM

anía

<<

11

Instrucciones de decisión y operadoresde comparación

En algunas de estas instrucciones se utilizanexpresiones que devolverán un valor verdadero(true) o falso (false).

En esas expresiones podemos utilizar cualquierade los operadores condicionales mostrados en latabla 8. También podemos formar expresiones múl-tiples usando los operadores condicionales mos-trados en esa misma tabla.

En la tabla 9 se muestran algunos ejemplos decómo usar las instrucciones de selección o de tomasde decisiones según usemos if... else o switch...case / Select Case.

En los comentarios se indican algunas de laspeculiaridades de C# y de Visual Basic .NET.

Las instrucciones para realizar buclesLas instrucciones para realizar bucles nos per-

miten iterar un número determinado (o indeter-minado) de veces sobre una parte del código. Elcódigo lo incluiremos dentro de dicho bucle.

En C# el código a usar en un bucle puede seruna sola instrucción, terminada con un punto ycoma, o un bloque de código, incluido dentro deun par de llaves.

En VB .NET los bucles siempre estarán dentrode un bloque de código bien delimitado, es decir,

<<

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

Por Guillermo ‘Guille’ SomVisual Basic MVP desde 1997www.elguille.info

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

Tabla 8. Instrucciones (operadores) de comparación

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

Page 12: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

dotN

etM

anía

<<

12

dnm.lenguajes.net<<

habrá una parte inicial y otra instruc-ción que marcará el final de dicho bucle.

En la tabla 10 podemos ver cómocrear bucles for, do, while así como algu-nos aspectos a tener en cuenta, ya que

Constructores,destructores y cómo invocar a los constructores de una clasey de la clase base

Los constructores son el punto deinicio de las clases o tipos de datos, sien una clase no definimos un cons-tructor, se creará uno predetermina-do que simplemente asignarán unvalor inicial a los campos (variables)que la clase contiene. También pode-mos crear nuestros propios construc-tores, de forma que puedan recibirparámetros para asignar valores a cier-tos campos de nuestra clase. Inclusopodemos crear distintas versiones delos constructores para permitir dife-rentes formas de instanciar (o crear)nuevos objetos.

En Visual Basic .NET un cons-tructor se define por medio de un pro-cedimiento (Sub) llamado New. En C#el constructor será un procedimien-to “especial” que se llama igual que lapropia clase (o tipo) que estamos defi-niendo.

Por otro lado, un destructor se uti-liza cada vez que destruimos un obje-to, en .NET Framework se llamafinalizador, de hecho, en Visual Basic.NET se utiliza como destructor unasobrecarga del método Finalize decla-rado en la clase Object. En C# el des-tructor se define usando el nombrede la clase precedida con ~. Un des-tructor se llamará cuando un objetodeje de estar en “ámbito” o se asigneun valor nulo a la variable. Hay quetener en cuenta que en .NET losobjetos no se destruyen inmediata-mente, sino que cuando dejan de ser

Tarea a realizar C# VB .NET

Toma de decisiones con if if(a != b) <código>; If a <> b Then <código>

Toma de decisiones con if if(a > b){ If a > b Thencon varias instrucciones <código> <código>

} End If

Instrucción if que si se if(a > b) If a > b Thencumple haga una cosa y si no <código> <código>se cumple, haga otra, else Elseusando varias líneas <código> <código>

End If

Varias instrucciones if... else if(a != b) If a <> b Thenasociadas a otro if. <código> <código>

else ElseIf b > i AndAlso a> b Then

if(b > i && a > b){<código>

<código>Else

}<código>

End If

Varias instrucciones if anidadas. if(a != b) If a <> b Thenif(b > i) If b > i Then

<código>; <código>else End If

<código>; Else<código>

End If

En C# no se distingue entre un if de simple línea o multilínea, pero si queremos usar varias instrucciones enlugar de una sola acabada con un punto y coma, las incluiremos dentro de un bloque entre un par de llaves {}.

En VB .NET podemos crear un bloque If multilínea acabándola con End If, tanto en el bloque If como en el blo-que Else o ElseIf podemos indicar una o más líneas con instrucciones. Si no se indica End If se tomará como unainstrucció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.

Seleccionar entre varias switch(<expresión>){ Select Case <expresión>opciones usando switch... case <constante1>: Case <valor1>

<código> <código>break;

case <constante2>: Case <valor2>, <valor3>case <constante3>: <código>

<código> Case <valorA> To <valorB>break; <código>

default: Case Is <expresión><código> <código>break; Case Else

} <código>End Select

En C# sólo se pueden usar valores constantes con cada cláusula case. Podemos anidar una tras otra indicandovarios 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 devalores usando To o un valor condicional usando Is. Esos valores no tienen porqué ser constantes, pueden sertambién expresiones.

Tabla 9. Instrucciones de decisión <<

Page 13: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

dotN

etM

anía

<<

13

dnm.lenguajes.net<<

“útiles”, el recolector de basura (reco-lector de objetos no usados) se encar-ga de ellos y será el propio GC(Garbage Collector) se encargará dedestruirlo, aunque esa destrucción no

se hará inmediatamente, este punto esimportante ya que si nuestro objetomantiene recursos externos éstos nose liberarán inmediatamente, en esoscasos, es recomendable definir unmétodo al que llamemos de formaexplícita para liberar esos recursos jus-to cuando ya no los necesitemos.

Los constructores siempre llama-rán a un constructor de la clase deri-vada, si no lo indicamos expresamen-te, el compilador intentará llamar aun constructor sin parámetros. Encaso de que la clase base no tenga defi-nido un constructor sin parámetros,tendremos que realizar nosotros esallamada, indicando el constructor ade-cuado, si no lo hacemos se produciráun error de compilación.

Por otra parte, los destructoressiempre llaman al método Finalize dela clase base, de forma que se destru-yan todos los objetos creados. En estecaso no es necesario que lo llamemosde forma explícita.

En la tabla 11 podemos ver cómodefinir los constructores y destructo-res, así como la forma de invocar aotra sobrecarga de un constructor dela misma clase e incluso de la clase dela que se deriva.

Tarea a realizar C# VB .NET

Bucle for for(<inicio>; <final>; For <contador> =<incremento>) <inicio> To <final>

<código> <código>Next

Bucle for infinito for(;;) ; For i = 0 To 0 Step 0: Nota: Espero que a nadie en su Nextsano juicio se le ocurra hacer esto

Bucle for con incremento for(int i = 0; i<10; i For i = 0 To 9 Step 2distinto 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 -2a 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 entreun 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 Elsepodemos indicar una o más líneas con instrucciones. Si no se indica End If se tomará como una instrucciónen una sola línea.

Bucle sin condición de término do{ Do<código> <código>

}while(true) Loop

Bucle con una condición después do{ Dode cada iteración, se repetirá <código> <código>mientras se cumpla la condición }while(<expresión>) Loop While <expresión>

Bucle con una condición al principio while(<expresión>) Do While <expresión><código>; <código>

Loop

While <expresión><código>

End While

Bucle que continúe la ejecución do{ Dohasta que se cumpla <código> <código>la condición }while(! <expresión>) Loop Until <expresión>

Bucle que continúe la ejecución while(! <expresión>){ Do Until <expresión>hasta que se cumpla la condición, <código> <código>realizando la comprobación } Loopal principio del bucle

Salir de un bucle do o while break; Usar Exit seguida deltipo de bucle:Exit Do para Do... LoopExit While para While...End While

En C# los bucles do se utilizan con una instrucción while al final del bucle, esta instrucción es la que seencarga de comprobar si el bucle debe seguir ejecutándose o no. Si queremos que el bucle se repita indefi-nidamente podríamos usar una expresión que siempre devuelva un valor verdadero. En Visual Basic .NET podemos usar la instrucción While o la instrucción Until, en C# no existe la ins-trucción Until, pero se puede simular usando un while en el que se niega la expresión usada.En VB .NET se puede usar While como instrucción asociada a Do... Loop o como instrucción indepen-diente, en ese caso el final del bloque del código se indicará con End While.

Tabla 10. Instrucciones de bucles

Page 14: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

dotN

etM

anía

<<

14

dnm.lenguajes.net<<

Definir clases abstractas y selladas, miembros abs-tractos y virtuales, redefinir y ocultar métodos

Las clases abstractas son clases quesólo se pueden utilizar para derivarnuevas clases, no se podrán usar paracrear nuevos objetos. Una clase abs-tracta puede contener métodos y pro-piedades normales así como abstrac-tos, los métodos abstractos sólo sedefinen como en las interfaces: sincódigo que los hagan operativos.

Por otro lado los métodos virtua-les son los que podremos redefinir enla clase derivada, para dar la funcio-nalidad adecuada que creamos conve-niente. Las referencias a las instanciascreadas en memoria siempre usaránlas versiones redefinidas de los méto-dos (o miembros) virtuales. Por defec-to, los métodos y propiedades de unaclase no son virtuales, es decir, no sepueden redefinir en las clases deriva-das, sin embargo podemos ocultarlos.Esos miembros ocultados sólo perte-necerán a la instancia de la clase quelos define, no a las referencias obte-nidas a través de tipos de la clase base.

Los miembros abstractos siempreson virtuales.

También podemos definir clasesselladas, lo contrario de las clases abs-tractas, es decir, clases que no se pue-den usar para derivar nuevas clases apartir de ellas.

También podemos ocultar tiposademás de los miembros de una clase.

En la tabla 12 podemos ver unalista de las instrucciones usadas paradeclarar clases abstractas, miembrosabstractos, virtuales, así como las ins-trucciones usadas para ocultar miem-bros y para redefinir los miembrosvirtuales de las clases base.

Por supuesto no se han cubiertotodas las posibilidades sintácticasentre los dos lenguajes más usados dela plataforma .NET, pero espero queal menos ahora tengas una idea bas-tante aproximada de cómo hacer lastareas más comunes tanto en C#como en Visual Basic .NET, de for-ma que en cualquier momento teresulte fácil poder escribir código encualquiera de estos dos lenguajes.

Tarea a realizar C# VB .NET

Definir un constructor de una clase. public Cliente() Public Sub New()En estos ejemplos, supondremos {} End Subque la clase se llama Cliente

Definir un constructor que recibe public Cliente(int id) Public Sub New(id Asun parámetro Integer)

{}End Sub

Definir un destructor o finalizador ~Cliente() Public Overrides Sub{} Finalize()

End Sub

En C# el constructor siempre se llama como la clase.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.

Definir un constructor que llama a otro public Cliente(int id, Public Sub New(id Asconstructor de la propia clase. string nombre) : Integer, nombre As

this(id) String){} Me.New(id)

End Sub

Definir un constructor que llama public Cliente(int id, Public Sub New(id Asa otro constructor de la clase base. string nombre) : Integer, nombre As

base(id) String){} MyBase.New(id)

End Sub

Tabla 11. Constructores y destructores.

Tarea a realizar C# VB .NET

Definir una clase abstracta abstract class Prueba MustInherit Class{} Prueba

End Class

Definir una clase sellada sealed class Prueba2 NotInheritable Class{} Prueba2

End Class

Definir un miembro abstracto abstract void Prueba(); MustOverride SubPrueba()

Definir un miembro virtual virtual void Prueba2() Overridable Sub{} Prueba2()

End Sub

Los miembros abstractos sólo definen el método o propiedad, pero no contienen código que lo defina.

Redefinir un miembro abstracto o override void Prueba() Overrides Sub Prueba()virtual {}

End Sub

Definir un miembro que oculta new void Prueba3() Shadows Sub Prueba3()a otro de la clase base {} End Sub

En VB .NET si se quiere ocultar un miembro virtual, además de usar Shadows debemos usar la instruc-ción Overloads.Nota sobre seguridad: Los miembros declarados como virtual internal (Overridable Friend en VB) en teo-ría sólo se pueden reemplazar en clases definidas en el propio ensamblado, pero esa “restricción” sólo esaplicable a los compiladores de C# y de VB, el CLR no tiene esa restricción, por tanto es teóricamente posi-ble reemplazar esos miembros desde otro ensamblado, al menos por compiladores que no tengan dicha res-tricción. Para más información: /cpguide/html/cpconkeyconceptsinsecurity.htm/cpguide/html/cpconsecurityconcernsforinternalvirtualoverloadsoverridablefriendkeywords.htm

Tabla 11. Constructores y destructores.

Page 15: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve
Page 16: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

dotN

etM

anía

<<

16

ASP.NETesto ha cambiado y nos permite realizaruna configuración de las aplicacionesWeb basada en ficheros en formatoXML. Este sistema de configuración deASP.NET hace uso de dos tipos deficheros de configuración:

1. Configuración del servidor: Que se alma-cena en un fichero denominado machi-ne.config. Este fichero va a representarla configuración por defecto de todaslas aplicaciones ASP.NET existentesen el servidor y se localiza en el direc-torio Windows \Microsoft.NET\Framework\[versión]\config.

2. Configuración de la aplicación: Se almace-na en el fichero web.config. Un servidorWeb puede contener varios ficherosweb.config, cada uno de ellos dentro deldirectorio raíz de cada una de las apli-caciones ASP.NET del servidor. La con-figuración indicada dentro de un fiche-ro web.config sobrescribe los valores espe-cificados en el fichero machine.config.

VentajasEste nuevo mecanismo de configu-

ración que encontramos en la platafor-

ma .NET para configurar las aplicacio-nes Web de ASP.NET, aporta lassiguientes ventajas:

• Valores de configuración en formatolegible: Es muy sencillo abrir unfichero XML y leer o modificar laconfiguración.

• Actualizaciones inmediatas: Lasmodificaciones realizadas en laconfiguración de las aplicacionesse aplican de forma inmediata sinnecesidad de reiniciar el servidorWeb o parar los servicios.

• Configuraciones fácilmente repetibles:Para tener una aplicaciónASP.NET con la misma configu-ración que otra aplicación distin-ta, únicamente debemos copiar losficheros de configuración en eldirectorio de la aplicación corres-pondiente.

• Bloqueo de valores de configuración:Podemos bloquear los valores deconfiguración que deseemos paraque no sean sobrescritos.

• ASP.NET configura de maneraautomática el servidor Web IIS paraque no sea posible que un clienterealice una petición a un fichero

web.config, y de esta forma pueda verla configuración de nuestra aplica-ción ASP.NET

Proceso de obtención de la configuración de unaaplicación Web

A continuación se va a comentar elproceso que sigue la plataforma .NETpara obtener y aplicar la configuraciónfinal de una aplicación ASP.NET.

A la hora de obtener la configura-ción se produce una fusión entre losficheros machine.config y web.config. Losvalores de configuración se heredanentre distintas aplicaciones ASP.NET,siendo el fichero machine.config la con-figuración raíz de la que heredan elresto.

Por lo tanto, en primer lugar tene-mos el fichero machine.config que afec-tará a todas las aplicaciones ASP.NETexistentes en el servidor Web. A los valo-res de configuración indicados en estefichero se le añadirían o sobrescribirí-an los presentes en el fichero web.configque posee un sitio Web, que actúa comouna aplicación ASP.NET.

Configuración de aplicaciones Web de ASP.NET

Por Ángel EstebanSoftware ArquitectAlhambra-Eidos

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 almacenabaen un repositorio binario denominado metabase de Internet Information Server. Se teníaque acceder a las distintas hojas de propiedades que nos ofrecía IIS para poder configu-rar nuestra aplicación.

Pero en la tecnología<<

Page 17: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

Si dentro de este sitio Web tenemosdefinida una aplicación ASP.NET, queofrece su propio fichero web.config, éstese combinaría con el fichero XML pre-sente en el sitio Web predeterminado.Y así podríamos seguir una cadena decombinación de ficheros web.config.

Formato de los ficheros deconfiguración de una aplicación ASP.NET

Tenga a mano el contenido de unfichero machine.config y web.config paraseguir el artículo de forma más senci-lla y conseguir un mayor aprovecha-miento del mismo.

Los ficheros machine.config y el fiche-ro web.config internamente presentan elmismo formato XML. El elemento raízes siempre <configuration>. Dentro deéste podemos encontrar dos seccionesgenerales: Sección de los manejadores ysección de los valores de configuración.

Sección de los manejadores

Identifican las clases de .NETFramework que se utilizarán cuando elsistema de configuración se carga. Estasección se encuentra entre las etiquetas<configSections>. La función de estas cla-ses es la de leer los valores de la secciónde los valores de configuración que lescorresponda.

El atributo name de la etiqueta <sec-tion> define el nombre de la etiqueta delelemento de la sección de los valores deconfiguración del que se va a encargarel manejador, cuya clase especificamosen el atributo type, dentro de este atri-buto además se indica el assembly en elque se encuentra la clase junto con suversión correspondiente.

Si se desea definir manejadores parauna sección de valores de configuraciónque a su vez va a tener varias secciones,las distintas etiquetas <section> irán inclui-das entre las etiquetas <sectionGroup>.

En el fuente 1 se muestra un frag-mento del fichero machine.config que secorresponde con la definición de dosmanejadores para las seccionessessionState y trace, que a su vez perte-necen al grupo <system.web>, también sedefine el manejador para la sección

appSettings. El grupo <system.web> va aser de gran interés, ya que nos va a per-mitir configurar los distintos aspectosde nuestras aplicaciones ASP.NET.

Una vez que se ha declarado la sec-ción de los manejadores no es necesa-rio volver a declararla en los ficherosweb.config, ya que si se encuentran en elfichero machine.config, o en un ficheroweb.config de nivel superior, la hereda-rán de manera automática.

Sección de los valores de configuración

Mientras que la sección de losmanejadores define clases, la secciónde valores de configuración identificalas propiedades que afectan al com-portamiento de la aplicación ASP.NET.En muchos de los casos necesitaremossaber únicamente el significado de laopción que vamos a modificar.

Normalmente los valores de configu-ración de la aplicación ASP.NET no losvamos a indicar en el fichero machine.con-fig, ya que estos valores afectarán a todaslas aplicaciones ASP.NET del servidor,sino que utilizaremos un fichero web.con-fig particular para una aplicación ASP.NETdeterminada. En este fichero web.configheredaremos la sección de los manejado-res indicada en el fichero machine.config.

Tareas de configuraciónmás comunes

Si examinamos detenidamente elfichero de configuración machine.configque tenemos en nuestro equipo, pode-mos encontrar alrededor de treintaopciones de configuración distintas. Eneste artículo no vamos a tratar todasestas tareas de configuración, sino quevamos a ver las más comunes y las quemás se pueden usar en un entorno realde trabajo.

Todas estas opciones de configura-ción se encontrarán dentro de la secciónde los valores de configuración del fiche-ro de configuración correspondiente,que por lo general será el ficheroweb.config.

Configuración general

En esta sección se va a indicar una seriede parámetros de configuración genéri-cos para la aplicación ASP.NET. Para ellose hace uso de la etiqueta <httpRuntime>.Esta etiqueta tiene como más significati-vos los siguientes atributos:

• executionTimeout: En este atributoindicaremos en segundos el tiempode espera que se aplicará a la ejecu-ción de un recurso solicitado. Una

dotN

etM

anía

<<

17

dnm.asp.net<<

<?xml version=”1.0” encoding=”UTF-8” ?>

<configuration><configSections>

<section name=”appSettings”type=”System.Configuration.NameValueFileSectionHandler,System,

Version=1.0.2411.0, Culture=neutral,PublicKeyToken=b77a5c561934e089” /><sectionGroup name=”system.web”>

<section name=”sessionState”type=”System.Web.SessionState.SessionStateSectionHandler, System.Web,Version=1.0.2411.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”

allowDefinition=”MachineToApplication” /><section name=”trace”type=”System.Web.Configuration.TraceConfigurationHandler, System.Web,

Version=1.0.2411.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a” />

</sectionGroup></configSections>

… … … …

</configuration>

Fuente 1. Definición de manejadores para las secciones sesionState y trace

Page 18: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

vez sobrepasado este tiempo deespera la aplicación ASP.NET fina-lizará la ejecución del recurso. Pordefecto es 90 segundos.

• maxRequestLength: Indica en Kb eltamaño máximo de una petición.Por defecto es 4.099 Kb.

• userFullyQualifiedRedirectUrl: Indicasi al cliente se le va a devolver unaURL completa o una URL relati-va. Por defecto es false, por lo quese enviará una URL relativa.

Configuración de la página

Mediante la etiqueta <pages> pode-mos controlar algunos de los compor-tamientos de las páginas ASP.NETpresentes en una aplicación. La eti-queta <pages> puede tener los siguien-tes atributos:

• autoEventWireup: Indica si los even-tos de la página se van a lanzar de for-ma automática. Por defecto es true.

• buffer: Se utilizará para activar odesactivar el búfer de las páginasASP.NET de la aplicación actual.Puede tomar valores true/false.

• enableSessionState: Este atributo per-mite activar o desactivar el estado desesión, es decir, permite o no la uti-lización del objeto Session para alma-cenar información común a la sesiónactual del usuario con la aplicaciónWeb. Puede tomar valores true/false.

• enableViewState: Permite activar odesactivar el mantenimiento auto-mático de los valores de los contro-les Web dentro de los formulariosWeb. Por defecto es true.

Estos atributos se corresponden conlos atributos del mismo nombre de ladirectiva @Page, por lo que utilizandoesta directiva podemos sobrescribir estosvalores de configuración para una pági-na ASP.NET en concreto.

Configuración de la aplicación

En esta sección vamos a poder alma-cenar valores de detalles de configuraciónde la aplicación. Para almacenar estosparámetros dentro del fichero de confi-guración vamos a utilizar pares clave/valor.

Estos valores de configuración defi-nidos en la sección <appSettings> losvamos a poder recuperar en las páginasASP.NET de la aplicación. Esta etiquetade configuración de la aplicación no seencuentra dentro de la sección <sys-tem.web>.

Dentro de la etiqueta <appSettings>tenemos unas subetiquetas <add>.Existirá una etiqueta <add> por cadaparámetro o valor que queremos indi-car en la aplicación, esta etiqueta poseedos atributos: key, que es la clave con laque después vamos a poder acceder aeste parámetro a través de la colecciónAppSettings, y value que va a ser el valorque le vamos a asignar al parámetro.

En el fuente 4 se muestra el frag-mento de un fichero web.config en el quese definen dos parámetros para la apli-cación: Se indica una cadena de cone-xión y una sentencia SQL.

Configuración de la sesión

Desde el fichero de configuraciónde la aplicación ASP.NET tenemos laposibilidad de configurar la forma en laque se va a utilizar el estado de sesiónmediante la etiqueta <sessionState>. Paraello presenta los siguientes atributos:

• mode: Indica el modo de almacena-miento utilizado para el proceso quese corresponde con el estado de lasesión. Los valores que podemosasignar a este atributo son: InProc,el estado de sesión se encuentra enel proceso actual de ASP.NET; Off,el estado de sesión se encuentradesactivado; SQLServer, se utilizaun proceso de SQL Server paraalmacenar el estado; StateServer, seutiliza un proceso en forma de ser-vicio de Windows para almacenarel estado. Por defecto es InProc.

• stateConnectionString: En este atri-buto se indica la dirección IP y elnúmero de puerto utilizados paracomunicarse con el servicio deWindows que ofrece las facilidadesde almacenamiento. Este atributoúnicamente tiene sentido utilizarlocuando el atributo mode tiene elvalor de StateServer.

• sqlConnectionString: Identifica lacadena de conexión de la base dedatos utilizada para almacenar elestado cuando el atributo modeposee el valor SQLServer. Esta cade-na debe incluir la dirección IP y el

nombre y contraseña de usuariopara conectar a la base de datos deSQL Server.

• cookieless: Atributo que indica si elobjeto Session utiliza cookies paraalmacenar el identificador de sesión,o por el contrario no las utiliza y elidentificador de sesión lo va mante-niendo a través del mecanismo deURLs. El mecanismo de URLs seráutilizado cuando el valor de este atri-buto sea true. Por defecto es false.

• timeout: El atributo timeout especifi-ca, en minutos. el intervalo de inac-tividad para el objeto Session. Si elusuario no actualiza o solicita unapágina durante ese intervalo, la sesióntermina. Por defecto es 20 minutos.

dotN

etM

anía

<<

18

dnm.asp.net<<

<configuration><system.web><pages buffer=”true” enableSessionState=”true”

enableViewState=”true” autoEventWireup=”true”/></system.web>

</configuration>

Fuente 2. Ejemplo de uso de la etiqueta <pages>

<configuration><appSettings><add key=”conexion” value=”server=aesteban;database=datos;uid=sa;pwd=”/><add key=”sentencia” value=”select nombre, apellidos,email from

Usuarios”/></appSettings>

</configuration>

Fuente 3. Ejemplo de uso de la etiqueta <appSettings>

Page 19: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

dotN

etM

anía

<<

19

dnm.asp.net<<

Globalización

Los valores indicados en la sección<globalization> nos va a permitir confi-gurar las opciones de codificación y cul-tura. La etiqueta <globalization> nosofrece cinco atributos para indicar diver-sos aspectos de la codificación utilizadaen nuestra aplicación:

• requestEncoding: Mediante este atri-buto podemos indicar la codifica-ción utilizada en cada solicitud. Pordefecto tiene la codificación utf-8.

• responseEncoding: Este atributo tie-ne el mismo significado que el ante-rior pero aplicado a una respuestaenviada al cliente. Por defecto tie-ne la codificación utf-8.

• fileEncoding: Permite indicar el tipode codificación aplicado a los fiche-ros. Por defecto tiene la codifica-ción utf-8.

• culture: Podemos especificar el lugaren el que nos encontramos para quese aplique a las cadenas el idioma ade-cuado, así como también a las fechasy su formato. Por ejemplo, en-USrepresenta al idioma inglés de EstadosUnidos y fr-FR francés en Francia.

• uiCulture: Indica la misma infor-mación que en el atributo anterior,pero se va a utilizar para realizarbúsquedas en las cadenas del idio-ma correspondiente.

Identidad de la aplicación

En la sección <identity> vamos apoder configurar la identidad del pro-ceso que ejecuta ASP.NET en el servi-dor. Para ello esta etiqueta nos ofrecelos siguientes atributos:

• impersonate: Si posee el valor true indi-ca que el proceso de ASP.NET se vaa ejecutar bajo la identidad por defec-

to, el usuario IUSR_NombreServidor,o bien bajo el usuario que nosotros leindiquemos. Por defecto es false.

• name: Este atributo estará disponi-ble cuando el atributo impersonatetenga el valor true, y lo vamos a uti-lizar cuando deseemos indicar unacuenta de usuario de Windows espe-cífica para representar al proceso deejecución de ASP.NET.

• password: En él indicaremos la con-traseña del usuario que se va a uti-lizar en el proceso.

En el fuente 6 se puede observar eluso de esta etiqueta. En este caso se indi-ca que utilice como identidad del proce-so de ASP.NET un usuario de Windows.Si quisiéramos utilizar el usuario de IIS,

le asignaríamos el valor de cadena vacíaa los atributos name y password:

Configuración de trazas

La configuración del mecanismo detrazas que de ASP.NET se hace a tra-vés del uso de la etiqueta <trace> que tie-ne los siguientes atributos:

enabled: Este atributo indica si elmecanismo de trazas se encuentra acti-

vado a o no. Tiene por lo tanto la mis-ma funcionalidad que el atributo de mis-mo nombre de la directiva @Page. Suvalor por defecto es false.

requestLimit: En este atributo indi-caremos el número máximo de peti-ciones HTTP de las que se va a alma-cenar información de trazas. Las tra-zas van a ser almacenadas en un regis-tro de trazas mediante un mecanismocircular en las que permanecerán lasúltimas n peticiones. Por defecto es10.

• pageOutput: Indica si la informaciónde trazas se va a mostrar al final decada página ASP.NET, tal como sehace con las trazas a nivel de pági-na. Por defecto es false.

• traceMode: Este atributo nos permiteindicar el modo de ordenación de losmensajes de trazas en la secciónInformación de seguimiento. Puede pre-sentar los valores SortByCategory ySortByTime. Por defecto es SortByTime.

• localOnly: Indica si la informaciónde trazas se muestra únicamente alos clientes locales o por el con-trario, se muestra también a losclientes remotos. Por defecto esfalse.

Le animo a que siga investigando lasnumerosas posibilidades de configura-ción para las aplicaciones Web que ofre-ce ASP.NET. Lo mejor es empezar porobservar los contenidos de los ficherosde configuración.

<configuration><system.web><globalization requestEncoding=”utf-8” responseEncoding=”utf-8”

culture=”es-ES” uiCulture=”es-ES”/></system.web>

</configuration>

Fuente 4. Ejemplo de la sección <Globalization>.

<configuration><system.web><identity impersonate=”true” user=”aesteban” password=”xxx”/>

</system.web></configuration>

Fuente 5. Ejemplo de la sección <Identity>.

<configuration><system.web>

<trace enabled=”false” localOnly=”true” pageOutput=”false” requestLimit=”10”traceMode=”SortByTime” />

</system.web></configuration>

Fuente 6. Ejemplo de la sección <trace>.

Page 20: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

dotN

etM

anía

<<

20

cual es esa problemática yposteriormente qué alternativas tenemos paratratarla. El problema fundamental que se nosplantea son los conflictos de concurrencia. Unconflicto de concurrencia se produce cuando unusuario modifica un registro de una tabla de unabase de datos y ese registro ha cambiado desdela última vez que lo leyó. Por ejemplo, conside-remos la siguiente secuencia de sucesos:

• Los usuarios A y B leen el registro R1 dela base de datos cargándolo en un DataSet.

• El usuario A modifica R1• El usuario A guarda R1 en la base de datos.• El usuario B modifica R1• El usuario B guarda R1 en la base de datos.

• El usuario B recibe una excepciónDBConcurrencyException, indicando un con-flicto de concurrencia al haber sido modi-ficado R1 desde la última vez que B lo leyó.

Los conflictos de concurrencia no se produ-cen solamente al actualizar un registro porqueotro usuario lo haya modificado, también ocu-rren si el registro ha sido eliminado por otro usua-rio. Asimismo, tienen lugar cuando un usuariointenta eliminar un registro que ha sido modifi-cado e incluso que ha sido eliminado. Con lainserción, sin embargo, es evidente que no se pro-ducen conflictos de concurrencia, ya que es impo-sible que otro usuario pueda modificar un regis-tro que aún no existe en la base de datos. En defi-nitiva, los conflictos de concurrencia pueden pro-ducirse:

• Al modificar un registro• Al eliminar un registro

Y la causa del conflicto puede ser porquedicho registro:

• Ha sido modificado desde la última vez quese leyó.

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

Otro aspecto básico acerca de los conflictosde concurrencia es la forma de detectarlos. Latécnica de detección se basa fundamentalmenteen incluir en la cláusula WHERE de la instruc-ción UPDATE o DELETE el valor original delos campos, es decir, el valor que tenían los cam-pos del registro cuando se leyeron de la base dedatos. Pongamos un ejemplo para aclarar ideas.

Gestión de concurrencia en ADO.NET

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

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 seusa en ADO.NET con sus DataSets y DataAdapters, la problemática es aún mayordebido a la propia naturaleza desconectada del entorno.

Veamos, en primer lugar,<<

Page 21: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

Supongamos que estamos trabajandocon la siguiente tabla en una base dedatos de SQL Server:

El comando UPDATE que detec-ta conflictos de concurrencia sería elsiguiente:

Como veis, están todos los valoresoriginales en la cláusula WHERE deesta instrucción parametrizada. Deesta manera, si ha cambiado algunode los campos, no se cumplirá la con-dición, y por tanto la instrucción noactualizará ningún registro, o lo quees lo mismo, el número de registrosafectados será cero. Solamente la ins-trucción tendrá éxito, o sea, actuali-zará el registro, si éste no ha cambia-do. Así es como ADO.NET detectalos conflictos de concurrencia, con-cretamente un DataAdapter lanzaráuna excepción DBConcurrencyExceptioncuando el comando de actualizaciónafecte a cero registros. Observad queeste comando incluye todos los cam-

pos en la cláusula SET, excepto elIdEmpleado que es autonumérico y portanto de sólo lectura. Esto viene a

suponer que se actualizarán todos loscampos en la tabla, independiente-mente de si se han modificado o no,

lo que implica una falta de optimiza-ción.

Sin embargo, es posible que no nosinterese detectar conflictos de concu-rrencia y que queramos que la actua-lización se lleve a cabo independien-temente de si el registro ha sido modi-ficado o no desde la última vez que seleyó. En ese caso sólo incluiríamos laclave primaria en la cláusula WHERE.La instrucción UPDATE sería lasiguiente:

Aún así, podríamos obtener unconflicto de concurrencia, pero sóloen el caso de que haya sido eliminadoel registro. Un inconveniente de estaopción es que es posible perder modi-ficaciones. Si por ejemplo, los usua-rios A y B leen el empleado 10, elusuario A modifica su nombre y loguarda, y luego B modifica el apelli-do y lo guarda, las dos actualizacionestienen éxito, pero la modificación quehizo A se pierde, ya que el nombre essobrescrito con el valor que leyó B.En ciertos sistemas, esta posible pér-dida de modificaciones es inaceptabley por tanto habría que elegir otraopción.

Otra alternativa sería incluir en lacláusula SET sólo los campos que sehan modificado. De esta manera, aun-que sólo incluyéramos la clave pri-maria en la cláusula WHERE, no seperderían las modificaciones. Tambiénes una opción interesante incluir enla cláusula SET sólo los campos modi-ficados, y en la cláusula WHERE laclave primaria más el valor original delos campos que han cambiado, así elconflicto de concurrencia que detec-taríamos sería en el caso de que otrousuario hubiera modificado alguno delos campos que han sido modificadoso en el caso de eliminación. Por ejem-plo, si los usuarios A y el B leen elempleado 10, el usuario A modifica su

nombre y lo guarda y el usuario Bmodifica su nombre y lo guarda, elusuario B recibe un conflicto de con-currencia. Pero si lo que ocurre es queel usuario A modifica el nombre y elB el apellido, no hay conflicto de con-currencia y las dos actualizaciones tie-nen éxito.

Una última alternativa para la cláu-sula WHERE es incluir la clave pri-maria más el valor original de un cam-po de tipo TimeStamp que por supues-to tendría que formar parte de la tabla.El funcionamiento es equivalente aincluir los valores originales de todos

CREATE TABLE Empleados (IdEmpleado INT IDENTITY(1,1) PRIMARY KEY,DNI VARCHAR(12) NOT NULL UNIQUE,Nombre VARCHAR(50) NOT NULL,Apellidos VARCHAR(50) NOT NULL

)

UPDATE EmpleadosSET DNI=@DNI, Nombre=@Nombre, Apellidos=@ApellidosWHERE IdEmpleado=@Original_IdEmpleado AND DNI=@Original_DNI AND

Nombre=@Original_Nombre AND Apellidos=@Original_Apellidos

UPDATE EmpleadosSET DNI=@DNI, Nombre=@Nombre, Apellidos=@ApellidosWHERE IdEmpleado=@Original_IdEmpleado

Los conflictos de concurrencia no se producen solamente al actualizar un registro porque otro usuario

lo haya modificado, también ocurren si el registro ha sido eliminado por otro usuario

dotN

etM

anía

<<

21

dnm.ado.net<<

Page 22: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

dotN

etM

anía

<<

22

dnm.ado.net<<

los campos, pero resulta más eficiente ya que la ins-trucción es más corta, reduciéndose el tráfico dered y reduciendo el trabajo del procesador de con-sultas del servidor de base de datos. Un campo detipo TimeStamp en SQL Server es una especie deautonumérico de 64 bits único en toda la base dedatos. No puede haber dos registros en una base de

datos con el mismo valor de TimeStamp, inclusoaunque pertenezcan a distintas tablas. Cada vez quese modifica un registro que tiene un campoTimeStamp, el valor del campo también cambia.Debido a esto y si usamos esta alternativa, despuésde modificar un registro, sería necesario volver aleer el campo TimeStamp para poder realizar másmodificaciones en el mismo registro.

Detectar conflictos de concurrencia en la eli-minación es similar a la actualización, con la salve-dad de que en este caso sólo podemos jugar con lacláusula WHERE de la instrucción DELETE.Podríamos incluir sólo la clave primaria, en cuyocaso sólo obtendremos conflictos de concurrenciacuando otro usuario haya eliminado el registro. Enla mayoría de los casos, este conflicto sencillamen-te lo podríamos ignorar. También podríamos incluirtodos los valores originales de los campos o la cla-ve primaria más el TimeStamp, en cuyo caso reci-biremos un conflicto de concurrencia cuando otrousuario haya modificado o eliminado el registro.

Una vez que tenemos decidido cómo vamos adetectar los conflictos de concurrencia y cómovamos a hacer las actualizaciones y eliminaciones,hemos de decidir cómo los vamos a tratar, o sea,qué acciones vamos a tomar en el caso de un con-flicto de concurrencia. Cada conflicto de concu-rrencia lo trataremos de manera diferente en fun-ción de si se ha producido al hacer una actualiza-ción o al realizar una eliminación y en función dela causa del conflicto, esto es, si ha sido porqueotro usuario lo ha modificado o porque lo ha eli-minado.

Empecemos primero por los conflictos que seproducen al actualizar. Si la causa es que otro usua-rio lo ha modificado podríamos tener las siguien-tes alternativas:

• Descartar las modificaciones y refrescar el registrovolviéndolo a leer de la base de datos. Al usuariole avisaríamos del conflicto de concurrencia yle daríamos la oportunidad de volver a hacerlas modificaciones.

• Refrescar sólo los valores originales sin descartar lasmodificaciones. Al usuario le avisaríamos del con-flicto. Entonces él tendría la oportunidad dever las modificaciones deshaciendo cambios ode volver a guardar con lo que forzaría la actua-lización.

• Directamente forzar la actualización. Esto seconoce como la técnica “el último que llegagana”. En realidad esta acción no es una res-puesta a un conflicto de concurrencia, ya quepara llevarla a cabo incluiríamos únicamentela clave primaria en la cláusula WHERE, nodetectándose conflictos de concurrencia pormodificación.

Si la causa es que otro usuario lo ha eliminado,las alternativas serían las siguientes:

• Volver a insertar el registro en la base de datos. Enel caso de que tengamos un autonumérico enla tabla no sería posible volver a insertar elregistro exactamente igual a como era ante-riormente.

• Eliminarlo del DataSet. Esta es la opción quemás se suele utilizar.

Detectar la causa del conflicto, al igual querefrescar un registro, puede realizarse volviendo aleer tal registro de la base de datos basándose en laclave primaria, pero si la clave primaria puede cam-biar, esta técnica no sirve para su propósito ya quesi ésta ha cambiado no es posible identificar el regis-tro y no es posible determinar si el conflicto de con-currencia ha ocurrido por modificación o por eli-minación. Por eso sería recomendable usar clavesprimarias artificiales como autonuméricos oGUID’s.

En cuanto a los conflictos de concurrencia quese producen al eliminar un registro, podríamos tenerlas siguientes alternativas cuando la causa es pormodificación:

• Deshacer la eliminación y refrescar el registro. Alusuario le informaríamos del conflicto y ten-dría la posibilidad de volverlo a eliminar des-pués de haber visto los cambios realizados.

La técnica de detección se basa fundamentalmente en incluir en la cláusula WHERE

de la instrucción UPDATE o DELETE el valor original de los campos

Page 23: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

• Forzar la eliminación. En realidadesta acción no es una respuesta aun conflicto de concurrencia, yaque para llevarla a cabo incluiría-mos únicamente la clave primariaen la cláusula WHERE con lo queno se detectan conflictos de con-currencia por modificación.

Por último, el conflicto de concu-rrencia que se produce al eliminar unregistro que ha sido eliminado, gene-ralmente puede tratarse sencillamen-te ignorando el conflicto y eliminan-do definitivamente el registro delDataSet.

Como hemos visto, existen variasalternativas para detectar y tratar losconflictos de concurrencia. Veamosahora qué nos ofrece ADO.NET eneste sentido.

En ADO.NET tenemos una seriede clases, los DataAdapters, que sonlos encargados de revertir las modi-ficaciones realizadas en un DataSetsobre la base de datos mediante sumétodo Update. Los DataAdapters tie-nen tres propiedades: DeleteCommand,UpdateCommand e InsertCommand queson los comandos de actualización.Estos comandos son parametrizados,de manera que sirvan para todas las filasde un DataTable. Cuando invocamos almétodo Update de un DataAdapter, ésterecorre todas las filas del DataTable, ysi la fila es una fila eliminada, ejecutael DeleteCommand; si la fila es una filamodificada, invoca el UpdateCommand;y si es una fila nueva, invoca alInsertCommand. Si al invocar al Update-Command o al DeleteCommand, elnúmero de registros afectados es cero,el DataAdapter lanza una excepciónDBConcurrencyException indicando quese ha producido un conflicto de con-currencia. Antes de invocar un coman-do de actualización, el DataAdapterestablece el valor de los parámetros delcomando con los valores originales oactuales de los campos de la fila basán-dose en la configuración del propiocomando. Cada parámetro de la colec-ción Parameters de un comando tienela propiedad SourceColumn que indicael nombre del campo cuyo valor debe-rá copiarse al parámetro, y la propie-dad SourceVersion que indica si se trata

del valor actual o del valor original.Antes de poder invocar al métodoUpdate de un DataAdapter tenemosque configurarlo correctamente, estoes, tenemos que establecerle loscomandos de actualización. Para con-figurar un DataAdapter tenemos tresalternativas:

• Usar el asistente para la configu-ración del DataAdapter

• Usar un CommandBuilder• Configurarlo manualmente

escribiendo nosotros mismos elcódigo

Para usar el asistente, sólo tene-mos que arrastrar un DataAdapterde la ficha datos del cuadro deherramientas a nuestro formularioo componente y seguir sus instruc-ciones. En el paso “Generar las ins-trucciones SQL” tenemos un botón“Opciones avanzadas” que nos pre-

senta el cuadro de diálogo de lafigura 1.

Como vemos, el asistente puedegenerar por nosotros los comandos deactualización INSERT, UPDATE yDELETE. Si elegimos “Usar concu-rrencia optimista”, el asistente inclui-rá en la cláusula WHERE de las ins-trucciones UPDATE y DELETE elvalor original de todos los campos delregistro. Mientras que si no activamosesa casilla de verificación, la cláusulaWHERE sólo incluirá la clave prima-ria. Si elegimos “Actualizar el con-junto de datos” el asistente añade unainstrucción SELECT a los comandosde actualización para refrescar el regis-tro. En cualquier caso, la instrucciónUPDATE incluye en la cláusula SETtodos los campos.

Esta sería la instrucción UPDA-TE para nuestra tabla de ejemplousando concurrencia optimista. Vertabla 1.

Figura1. Opciones avanzadas de generación de instrucciones SQL.

UPDATE EmpleadosSET DNI=@DNI, Nombre=@Nombre, Apellidos=@ApellidosWHERE IdEmpleado=@Original_IdEmpleado AND DNI=@Original_DNI AND

Nombre=@Original_Nombre AND Apellidos=@Original_Apellidos

Tabla 1

dotN

etM

anía

<<

23

dnm.ado.net<<

Page 24: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

dotN

etM

anía

<<

24

dnm.ado.net<<

Y esta sería la instrucción UPDATE sin usar laconcurrencia optimista:

Como hemos dicho anteriormente, tambiénpodemos usar un CommandBuilder. Este sería elcódigo a usar para nuestra tabla de ejemplo:

Las instrucciones UPDATE y DELETE seríanequivalentes a las generadas por el asistente usan-do concurrencia optimista y sin actualizar el con-junto de datos.

La alternativa de configurar manualmente elDataAdapter no es muy recomendable, ya querequiere escribir bastante código y la funcionalidadobtenida es exactamente igual a la conseguida usan-do el asistente. Además es posible que cometamosalgún error al escribir el código, mientras que elasistente no los comete.

Como vemos, el DataAdapter sólo nos deja la posi-bilidad de incluir en la cláusula WHERE de las ins-trucciones UPDATE y DELETE o bien la clave pri-maria, o bien todos los campos. No tenemos las otrasalternativas que se mencionan en este artículo. Ademásen la cláusula SET de la instrucción UPDATE, sólopodemos incluir todos los campos, no tenemos laopción de incluir sólo los modificados.

Por otra parte, ADO.NET sólo da soporte parala detección del conflicto de concurrencia, no haynada que nos ayude a gestionarlo, por lo que ten-dremos que escribir nosotros mismos el códigonecesario.

El código de ejemplo del fuente 1 muestra comogestionar conflictos de concurrencia, refrescandoel registro si ha sido modificado y eliminándolo siha sido eliminado.

Como vemos, gestionar los conflictos de concu-rrencia no es trivial y repetir el mismo código una yotra vez para cada caso es muy laborioso y pesado.

Una buena alternativa a los DataAdapters que vie-nen incluidos en .NET Framework, es escribir nues-tro propio DataAdapter que no tenga estas limita-

ciones, que sea capaz de gestionar los conflictos deconcurrencia y que disponga de todas las opciones

mencionadas en este artículo. Podéis encontrar unDataAdapter para SQL Server (SqlRanger.SqlAdapter)escrito por mí en la web de la revista o en mi propiapágina web: http://sqlranger.com/descargas.aspx.

Este DataAdapter es completamente gratis y seincluye el código fuente así como un ejemplo de suuso. El SqlRanger.SqlAdapter tiene propiedades espe-cíficas para tratar la concurrencia. Entre las que seincluyen:

• UpdateCriteria: Determina los campos a incluiren la cláusula WHERE de la instrucciónUPDATE. Puede tomar los siguientes valores:• All: Se incluirán los valores originales de

todos los campos.• Key: Se incluirá sólo la clave primaria.• Modified: Se incluirá la clave primaria más

los valores originales de los campos modi-ficados.

• TimeStamp: Se incluirá la clave primaria másel valor original del campo TimeStamp si esque existe.

• UpdateColumns: Determina qué campos apa-recerán en la cláusula SET de la instrucciónUPDATE. Puede tomar los siguientes valores:• All: Se incluyen todos los campos.• Modified: Se incluyen sólo los campos modi-

ficados.

• DeleteCriteria: Determina los campos a incluiren la cláusula WHERE de la instrucción DELE-TE. Puede tomar los siguientes valores:• All: Se incluirán los valores originales de

todos los campos.• Key: Se incluirá sólo la clave primaria.• TimeStamp: Se incluirá la clave primaria más

el valor original del campo TimeStamp si esque existe.

UPDATE EmpleadosSET DNI=@DNI, Nombre=@Nombre, Apellidos=@ApellidosWHERE IdEmpleado=@Original_IdEmpleado

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();

Page 25: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

public void Guardar(DataTable Empleados){

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

// usamos un command builder para configurar los comandos de actualizaciónSqlCommandBuilder CommandBuilder = new SqlCommandBuilder(Adapter);Adapter.UpdateCommand = CommandBuilder.GetUpdateCommand();Adapter.InsertCommand = CommandBuilder.GetInsertCommand();Adapter.DeleteCommand = CommandBuilder.GetDeleteCommand();

// este comando nos sirve para refrescar un registroSqlCommand 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 registroAdapter.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 registroex.Row.AcceptChanges();// ignoramos el conflicto y seguimos con la actualizaciónGuardar(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ónex.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ónthrow ex;

}}

}

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

dotN

etM

anía

<<

25

dnm.ado.net<<

Page 26: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

dotN

etM

anía

<<

26

dnm.ado.net<<

• ConflictUpdatingChangedAction:Determina la acción a realizar encaso de un conflicto de concu-rrencia al actualizar un registroporque haya sido modificado des-de la última vez que se leyó. Puedetomar los siguientes valores:• NoAction: No hace nada.• ResyncAllValues: Refresca todos

los valores del registro, volvién-dolo a leer de la base de datos.

• ResyncOriginalValues: Refresca losvalores originales del registro,leyéndolo de la base de datos.

• ConflictUpdatingDeletedAction:Determina la acción a realizar encaso de un conflicto de concurren-cia producido al actualizar un regis-tro porque haya sido eliminado des-de la última vez que se leyó. Puedetomar los siguientes valores:

• Delete: Elimina definitivamen-te el registro del DataSet.

• Insert: Vuelve a insertar el re-gistro en la base de datos.

• NoAction: No hace nada.

• ConflictDeletingChangedAction:Determina la acción a realizar encaso de un conflicto de concu-rrencia producido al eliminar unregistro porque haya sido modi-ficado desde la última vez que seleyó. Puede tomar los siguientesvalores:• NoAction: No hace nada.• ResyncAllValues: Refresca el

registro, volviéndolo a leer dela base de datos.

• ResyncCommand: Comandoparametrizado basado en cla-ve primaria utilizado pararefrescar un registro.

El SqlRanger.SqlAdapter genera auto-máticamente los comandos de actualiza-ción y el ResyncCommand, no siendo nece-sario proporcionárselos. Para ello haceuso del SqlRanger.CommandBuilder.

ConclusiónLa concurrencia es un tema proble-

mático en ADO.NET dada su natura-leza desconectada. Existen varias opcio-nes para detectar y tratar los conflictosde concurrencia. Cada una de estasopciones tiene sus ventajas e inconve-nientes y es necesario elegir cuidadosa-mente la más adecuada para el sistemaen cuestión. ADO.NET da soportelimitado para la gestión de la concu-rrencia, siendo una buena alternativaescribir nuestro propio DataAdapter parasuperar las limitaciones.

noticias.noticias.noticias.noticias

¿Qué es Whitehorse?Whitehorse es el nombre en clave del software que se incluirá en

Visual Studio 2005 y que aporta herramientas de diseño model-drivendirigida a los arquitectos de software, enlazando el modelo conceptualal código.

Tendremos más información en el devdays que se celebrará en San Diego,California entre el 23 y el 28 de Mayo (http://www.microsoft.com/semi-nar/teched2004). En Europa se celebrará en Ámsterdam, Holanda, entre el29 de Junio y el 2 de Julio (http://www.microsoft.com/europe/teched).

Entretanto puede descargarse un video demostrativo de la web deMSDNTV en http://msdn.microsoft.com/msdntv

¿Qué es Laguna?En el Microsoft Mobile DevCon Conference 2004 celebrado en

San Francisco entre el 23 y el 27 de marzo se habló de “Laguna”, nom-bre en clave del SQL Server CE 3.0. Esta versión se verá retrasada igualque 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.

La web del Mobile DevCon Conference 2004 está en:http://www.microsoftmdc.com.

Puede ver información de la versión actual de SQL Server CE 2.0en: http://www.microsoft.com/sql/ce.

¿Qué es Indy?Indy es el nombre en clave de una nueva herramienta de gestión

desarrollada por Microsoft Research y que se comercializará por la divi-sión Enterprise Management de Microsoft. Simula un centro de datosempresarial derivado del modelo de hardware, software y los sistemasde servidores del cliente.

Indy está inmerso en la versión 2.0 de la suite Microsoft SystemCenter para la que aún no hay fecha prevista de salida, ni tan siquierauna aproximación. La versión actual, la 1.0 llamada System Center 2005es la primera suite de gestión integrada para el Windows Server Systeme incluye el System Management Server 2003, Microsoft OperationsManager 2005 y el nuevo sistema común de reporting.

Se habló de él en el Summit celebrado en Las Vegas el pasado mes demarzo. La web del Summit 2004: http://www2.mms2004.com.

Más información en Microsoft Watch: http://www.microsoft-watch.comy en el sito Betanews http://www.betanews.com/article.php3?sid=1079576470

¿Qué es Lonestar?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 Microsoftpara Tablet PC. Si bien se iba a vender como un add-on para los usuariosde Tablet PC, finalmente será incluido dentro de Windows XP SP2. Tendráun nuevo SDK para desarrolladores e integración con Office 2003.

¿Qué es Windows XP Reloaded?Windows XP Reloaded es el nombre en clave para la versión de

Windows XP que hará de puente entre la actual y Longhorn.

¿Qué es Symphony y Harmony?Symphony es el nombre en clave de la próxima versión de Windows

XP Media Center Edition el cual está basado en XP SP2. Una versiónprevia a Windows XP Media Center Edition 2004. Harmony es el nom-bre en clave del próximo Windows XP Media Center Edition 2004.

Incluirá soporte para High Definition Televisión, soporte para múl-tiples sintonizadores, soporte para diferentes formatos de grabación devídeo y radio.

¿Qué es qué?¿Qué es qué?

Page 27: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

Componentes y Reflexión antes de .NET

Las tecnologías orientadas a componentescomo COM y CORBA utilizan lenguajes deDefinición de Interfaces (IDLs) para especifi-car tipos. Pero los IDLs se basan sólo en las sig-naturas de los métodos y no incluyen más infor-mación semántica que la que se puede deducirde los tipos y nombres de los métodos y de susparámetros.

Java alivia la limitación anterior porque lanoción de tipo definido por un interface1 estáincluida en el propio lenguaje de programaciónJava. Sin embargo, la tecnología Java tiene lasdebilidades siguientes:

• Debido a su enfoque monolingüístico,una componente en Java sólo se puedeusar por otra componente Java. No hayuna forma simple de conectar una com-ponente Java con una componente escri-ta en otro lenguaje o viceversa.

• Un buen aporte de Java es que permiteincluir información extra en una compo-nente por vía de determinados conveniosen la escritura de comentarios especiales.Pero el mecanismo de reflexión de Javano ofrece recursos para recuperar estainformación que se ha incluido en unacomponente en forma de comentarios.Los desarrolladores deben conocer y tra-bajar directamente con la forma en queinternamente estos comentarios están den-tro de un fichero Java byte code. De modoque un cambio en esta forma de repre-sentación implicaría cambios en las apli-caciones que utilizan estos comentarios.

dotN

etM

anía

<<

27

El poder de la reflexión en .NET

Por Mario del Valle y Miguel KatribGrupo Weboo Universidad de La Habana

Entre otras razones .NET supera a tecnolo-gías de componentes precedentes por latransparencia con la que integra código ymetadatos favoreciendo con ello la metapro-gramación. Este trabajo muestra cómo usan-do reflexión (reflection) se define un conver-sor de tipos que permite a partir de un obje-to, el cual comparte una misma funcionalidadcon un interface, obtener un objeto proxyequivalente en funcionalidad al original peroque garantiza ser subtipo de dicha interface.De este modo el objeto proxy puede ser uti-lizado como si estáticamente hubiese decla-rado que implementa el tipo interface. Conello se facilita la adaptabilidad del software yla factorización de código ya existente parapoder aprovechar una funcionalidad común.

La solución propuesta permite ilustrar ade-más la existencia de un peligroso agujero deseguridad en el sistema de tipos de .NET, elcual lamentablemente no es controlado porel CLR.Esta falla permitiría la escritura de códi-go malicioso aún ejecutando bajo el supuestomodo seguro del código administrado.

<<

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” conel que muchos lectores identifican el concepto de interfaz gráfica de usuario (GUI).

<<

Page 28: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

Componentes y Reflexión en .NET

Las componentes de software en.NET se basan en el concepto deensamblado (assembly).

• Un ensamblado en .NET es neu-tral desde el punto de vista del len-guaje. Un ensamblado .NET sepuede utilizar de modo simple des-de otro ensamblado con indepen-dencia del lenguaje fuente en quehaya sido escrito cada uno.

• Un ensamblado en .NET contienecódigo y metadatos. Estos metada-tos pueden ser extraídos de la com-ponente mediante los recursos dereflexión que el propio .NET ofre-ce. De modo que las aplicacionesque extraen y procesan la informa-ción inmersa en un ensamblado enforma de metadatos no dependende cambios en el formato físico enque se representan estos metadatos.

• .NET introduce los atributos, unanueva creación para que los desa-rrolladores puedan añadir sus pro-pios metadatos. Los atributos son afin de cuentas objetos y por tantopueden gozar de muchos de losbeneficios que el modelo Orientadoa Objetos soporta.

Con el presente trabajo comenzare-mos a ir descubriendo el uso de la refle-xión en .NET y la utilidad de los atri-butos y lo que la mezcla de ambos pue-de significar para potenciar las capaci-dades de metaprogramación de .NET

Factorizando tipos en .NETUna tarea frecuente en programa-

ción consiste en reproducir un com-portamiento similar mediante diferen-tes implementaciones. Si el desarrolla-dor puede prever esta situación lo usualdebe ser entonces definir un tipo raíz(sea definido por una clase o por uninterface en .NET) y definir los dife-rentes tipos que heredan (o implemen-tan) del tipo raíz.

Pero qué podemos hacer si variostipos ya existentes tienen un comporta-miento común pero no han sido defini-dos con una tal raíz común. ¿Qué hacersi queremos incorporar una nueva fun-

cionalidad que pueda trabajar con cual-quiera de estos tipos de comportamiento“similar”?

Supongamos que tenemos dos tiposB y C que tienen un subconjunto demétodos f1, f2, … fn comunes a ambospero desafortunadamente estos tipos By C no fueron concebidos como cla-ses derivadas de una clase base comúnA (o como implementaciones de un tipointerface común IA).

class B{public T1 f1();...public Tn fn();//...other methods

}class C{public T1 f1();...public Tn fn();...//other methods

}

¿Cómo implementar una nueva fun-cionalidad NewMethod que sea capaz detrabajar con objetos que tengan esta fun-cionalidad común f1, f2, … fn inde-pendientemente si los objetos son detipo B o de tipo C ?

Solución 1:Replicar la nueva funciona-lidad para cada uno de los tipos B y C

Como en .NET disponemos desobrecarga de métodos la solución mástradicional fuerza a reescribir la nuevafuncionalidad reescribiendo el mismocódigo para usar cada uno de los tipos ( B y C en nuestro ejemplo).

void NewMethod(B x){

...

x.f1();

...

x.fn();

}

void NewMethod(C x){

...

x.f1();

...

x.fn();

}

Esta nueva funcionalidad se debeinvocar entonces en la forma

B b = new B();

...

NewMethod(b);

o

C c = new C();

...

NewMethod(c);

Los principales defectos de esta solu-ción son el alto nivel de dependencia yel bajo grado de escalabilidad debido ala replicación de código que esto impli-ca. Si queremos que un nuevo tipo Dcon funcionalidad similar a la de B y Cpueda usarse como parámetro deNewMethod habría que escribir un nuevoNewMethod con un código similar al delos ya existentes sólo para poder acep-tar un parámetro del nuevo tipo D.

Solución 2:Escribir un único métodoque haga una selección múltiple

Otro enfoque es escribir un únicoNewMethod que se base en que el pará-metro formal está declarado estática-mente como del tipo raíz Object y lue-go aplicar internamente la funcionali-dad correspondiente según el tipo delparámetro real en ejecución

void NewMethod(Object x){...if (x is B)((B)x).f1();

else if (x is C)((C)x).f1();

...if (x is B)((B)x).fn();

else if (x is C)((C)x).fn();

}

Pero esta solución tiene también unalto grado de dependencia y baja escala-bilidad. Si se desea incorporar un nuevotipo D hay que reprogramar el NewMethodya existente (para lo cual habría que dis-poner del código fuente) para introducirinternamente las nueva alternativa

if (x is D)((D)x).fn();

Si bien esta variante de solución noreplica código como la anterior, es inefi-ciente debido a las preguntas para deter-minar el tipo que dinámicamente tendráel objeto que se pasa como parámetro ya las operaciones de conversión o mol-

dotN

etM

anía

<<

28

dnm.plataforma.net<<

Page 29: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

deo (casting) para poder interpretar al parámetro formalcomo del tipo deseado. Pero es más, este enfoque no esaplicable si D fuese un tipo creado dinámicamente entiempo de ejecución porque no dispondríamos de unadefinición estática de D para colocar estáticamente elsegmento de código anterior dentro de NewMethod.

Una solución basada en reflexión

Una mejor solución se basa en crear dinámica-mente usando reflexión (lo que se verá en la secciónsiguiente) un tipo proxy que emule al original peroque sí especifique definir al tipo interface que expresala comunalidad. Es decir, una vez que el desarrolla-dor interesado detecte que hay un comportamientosimilar en los tipos B y C debe definir entonces untipo IA que exprese este comportamiento común

interface IA{

T1 f1();

...

Tn fn();

}

El nuevo código NewMethod que quiere aprovecharesto común debe escribirse basado en que el paráme-tro formal sea del tipo interface IA

void NewMethod(IA x){

x.f1();

...

x.fn();

}

El problema que hay que resolver es cómo lograrque los objetos de tipo B o C, o de un nuevo tipo Dque pueda entrar en escena más adelante, puedan serpasados como parámetros a este método aún cuandoel tipo de estos no indique implementar IA.

A fin de cuentas no debería ser el código de NewMethodquien tiene que cargar con esa responsabilidad. Si que-remos pasarle un x a NewMethod debería ser el código quellama el que pueda indicar algo así como: interprétame aéste x como de tipo IA aún cuando el tipo estático de x nohubiese sido definido como que implementa a IA.

Para lograr esto definimos un método Cast. Elmétodo Cast recibe como primer parámetro el obje-to original y como segundo parámetro el tipo interfa-ce como el que se desea que el primer parámetro seainterpretado. El método Cast creará dinámicamenteun tipo proxy que emula al tipo del objeto originalpero que indica implementar al tipo interface y devol-verá como respuesta el tal objeto proxy.

class Caster{public static objectCast(object x,

Type interfaceType){...

}}

De este modo el código cliente interesado en usarla funcionalidad NewMethod para un objeto de tipo Bque tiene la funcionalidad expresada por IA debeseguir el siguiente patrón

B b = new B();

...

IA a = (IA)Caster.Cast(b, typeof(IA));

NewMethod(a);

La Figura 1 nos ilustra este escenario

Usando reflexión y las capacidades de generación decódigo que ofrece .NET, el método Cast crea dinámi-camente un tipo IAProxyFor_B que implementa IA yque actúa como proxy de la funcionalidad común que eltipo B tiene con IA. El tipo IAProxyFor_B es generadocon un patrón cuyo código IL equivaldría a un códigofuente C# como el que se muestra a continuación

class IAProxyFor_B : IA{

B realTarget;

public IAProxyFor_B(B x){

realTarget=x;

}

public T1 f1(){

return realTarget.f1();

}

...

public Tn fn(){

return realTarget.fn();

}

}

Un ejemplo real en las Windows Forms

Un escenario común en las GUIs es hacer unaselección de un elemento entre varios de una lista.

dotN

etM

anía

<<

29

dnm.plataforma.net<<

Figura 1

Page 30: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

Habitualmente se usa para este fin un ComboBox o unListBox. Suponga que queremos un métodoConfigure que pueda trabajar tanto para un ComboBoxcomo para un ListBox. Habría que escribir doscopias muy similares del tal método que sólo difie-ren en el tipo del parámetro (Fuente 1)

En un caso como este sería conveniente tener unainterfaz IListControl que “factorizara” el comporta-

miento común de ComboBox y ListBox que nos inte-resa utilizar:

interface IListControl{

object SelectedItem{

get; set;

}

int SelectedIndex {

get; set;

}

IList Items{ get;}

string Text {get; set;}

bool Sorted { get; set; }

void BeginUpdate();

void EndUpdate();

void Refresh();

event EventHandler

SelectedValueChanged;

event EventHandler

SelectedIndexChanged;

}

De este modo sólo habría que escribir un únicoun método Configure:

void Configure (IListControl

control){

//...

}

Si lo que se quiere es aplicar este método con unComboBox, bastaría con hacer:

ComboBox combo = new ComboBox();

...

Configurate((IListControl)Caster.Cast(combo,

typeof(IListControl)));

Para el ListBox lo mismo:

ListBox list = new ListBox();

...

Configurate ((IListControl) Caster.Cast(list.

typeof(IListControl)));

Emisión de código IL usando reflexión y Emit

Otra de las potencialidades de .NET combina-das con la reflexión son los recursos para generarcódigo dinámicamente en tiempo de ejecución,código que incluso puede ser ejecutado a su vezdurante de la propia ejecución de quién lo creó (loque es el caso del tipo proxy explicado anterior-mente). Para esto último .NET tiene en su libre-ría un namespace Reflection y dentro de este a suvez el namespace Emit. Ilustraremos en esta seccióncómo usando estos recursos el método castTo pue-de generar el tipo proxy del que hablamos en lassecciones anteriores.

Para generar un tipo dinámicamente primerohabría que generar un ensamblado donde colocar altal tipo (Fuente 2)

dotN

etM

anía

<<

30

dnm.plataforma.net<<

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

Page 31: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

Luego a través de este objetoasmBuilder se genera un módulo ydentro del módulo el tipo deseado

modBuilder =

asmBuilder.DefineDynamicModule(

moduleName);

Un bosquejo del método castTo,que es el que realizará la operaciónde conversión, se muestra en elFuente 3

Por razones de espacio no des-cribiremos la implementación del

método EmitCtr que es el encar-gado de generar el código corres-pondiente al constructor del tipoproxy que se está creando.

Veamos con más detenimientola implementación del métodoEmitMethods (Fuente 4) que es elmétodo que generará cada uno de

los métodos del proxy. Note queeste método recibirá como pará-metros el tipo interface al que sequiere forzar la conversión (cast), el

objeto de tipo TypeBuilder paraemitir el código dentro del tipo quevamos a “rellenar” y el objeto detipo FieldInfo que se ha crea-do para contener la información dela variable de instancia que dentrodel proxy referirá al objeto original.

Note que se hace un bucle en elque se recorren todos los métodosdel tipo interface para ir emitiendo

los métodos correspondientes, a tra-vés del proxyTypeBuilder, dentrodel nuevo tipo proxy

A través del objeto proxyType-Builder de tipo TypeBuilder seemitirá el código de los métodoscorrespondientes al nuevo tipo quese está generando.

Luego con cada methodBuilderse emitirá el código IL correspon-diente al cuerpo del método. Las ins-trucciones (Fuente 5) generan el

código IL para poner en la pila elobjeto original realTarget envueltopor el proxy. Y las instrucciones

OpCode callCode = OpCodes.Call;

if (coreMethod.IsVirtual)callCode=OpCodes.Callvirt;

generator.EmitCall(callCode,realMethod, null);generator.Emit(OpCodes.Ret);

generan el código IL que hará lallamada al método original a travésdel objeto que estará en el tope de lapila y el código IL para retornar a suvez al regresar de esta llamada.

dotN

etM

anía

<<

31

dnm.plataforma.net<<

AppDomain domain = AppDomain.CurrentDomain;

AssemblyName strongName = new AssemblyName();

strongName.Name = assemblyName;

asmBuilder = domain.DefineDynamicAssembly(strongName, access);

Fuente 2

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 typenew 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

Page 32: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

¿Una solución más eficiente?

Ciertamente esta solución, para apro-vechar una comunalidad vía proxy, impli-ca una llamada extra porque por cada lla-mada de la forma x.f() dentro deNewMethod el proxy llamará al target.f()del objeto que ha sido “envuelto” por elproxy Pero este pequeño precio en ren-dimiento será compensado con la adap-tabilidad del código resultante.

Para evitar esta llamada extra sepodría intentar crear un tipo que hagalas veces de un duplicado del tipo B enlugar de un tipo que haga de proxy deB. El objeto duplicado sería una “copia”que sí implementaría la interface IA

class IATwinOf_B : IA{/*... The same variables as

in B...A constructor to dothe copy from B

*/public T1 f1(){/* ... The same IL code as the IL code for f1 in B

*/}public Tn fn(){/* ... The same IL code as the IL code for fn in B

*/}

Las capacidades del Emit permi-ten generar un tipo (IATwinOf_B) conlas mismas variables y los mismosnombres que otro tipo (B). Pero paraduplicar los métodos de B enIATwinOf_B hace falta poder “copiar”el código IL de los métodos origina-les de B en los métodos correspon-dientes (los mismos nombres y la mis-ma signatura) de IATwinOf_B.

Desafortunadamente, parece queargumentando protección de derechosde autor, Microsoft no incluye en lascapacidades de reflexión ninguna víapara hacer un tal “cut and paste” delcódigo. Este no es un argumento muyconvincente porque la inclusión de una

dotN

etM

anía

<<

32

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

Page 33: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

capacidad tal en la reflexión podría estarcontrolada personalizando la política deseguridad de código. De hecho no tie-ne que considerarse una violación dederechos de autor que un programadoraplicase una facilidad similar a unensamblado generado por él mismo opor otro programador de su propioequipo o empresa que le haya concedi-do tal privilegio.

Claro el lector puede pensar que sise tienen tales privilegios entonces tam-bién pueda disponerse del código fuen-te original de B y entonces porqué noreescribir B para indicar que imple-menta a IA

class B: IA{

/*...the same source text

as in the previous B

*/

}

En contra de esta opción puededecirse que no es lo mismo ceder dere-chos de autor para que nos dupliquen elcódigo IL que para que nos usen el fuen-te2 ya que esto último muestra más fácil-mente la lógica utilizada. Pero permitirhacer cambios en el fuente, por simpleque fuesen estos cambios, es dejar unapuerta abierta a otras modificaciones ypor tanto contrario al principio de “ocul-tar información” que una buena pro-gramación orientada a objetos debe pro-mulgar. Además de la cascada de recom-pilaciones que esto pude provocar.

Un agujero de seguridad en elsistema de tipos de .NET

Lamentablemente el CLR de .NETno controla, a la hora de hacer la gene-ración JIT, que al encontrar una opera-

ción Ret en el IL, el tipo del objeto queva a estar en el tope de la pila coincidacon el tipo de retorno del método den-tro del cual está dicha operación Ret.Note en la descripción de la secciónanterior que el tipo del objeto que que-dará en el tope de la pila es el tipo delobjeto devuelto por el método original.Es este método original a quien se lla-ma según el código generado con

generator.EmitCall(callCode,

realMethod, null);

Sin embargo el Ret se ha generadodentro del método emitido a través de

MethodBuilder methodBuilder =

proxyTypeBuilder.DefineMethod

(mi.Name,

MethodAttributes.Public |

MethodAttributes.Virtual,

mi.ReturnType,

argsTypes);

y que como se indica tiene como tipode retorno el tipo mi.ReturnType que esel tipo de retorno del método corres-pondiente en el tipo interface. De modoque si en la interface y en el objeto originaldos métodos difieren sólo en el tipo de retor-no esto no se detecta.

Esto significa un serio agujero deseguridad en el sistema de tipos de.NET, aún ejecutando bajo el supues-to modo seguro (safe) del código admi-nistrado (managed code). El ejemplo acontinuación muestra como aprove-chando esta debilidad se podría ¡acce-der a las partes privadas de un objeto!Suponga que tenemos un tipo Accounten el que la variable de instancia balan-ce es privada:

class Account

{

private int balance;

public int Balance

{

get{ return balance;}

}

//...other methods

}

Definimos también un tipo con lamisma variable pero pública

class UnprotectedAccount

{

public int balance;

}

Se define ahora un tipo con unmétodo que recibe un objeto Account ylo devuelve

class Naive{

public Account

ReturnMyself(Account x){

return x;

}

}

Con un conversor como el que se hapropuesto anteriormente en este traba-jo se podría utilizar un tipo Maliciouspara recibir un objeto Account y devol-ver el mismo objeto pero ¡interpretadocomo UnprotectedAccount!

interface Malicious{

UnprotectedAccount

ReturnMyself(Account x);

}

Si se ejecuta el Fuente 6 se podríaacceder de esta forma a la variable pri-vada balance del objeto original.

dotN

etM

anía

<<

33

dnm.plataforma.net<<

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

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

Page 34: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

¡y lo que se escribirá será!

My Balance is 1

Realmente en nuestro conversor Caster este pro-blema no tiene por qué ocurrir si antes de invocara EmitMethods para emitir el código IL para losmétodos, se verifica que el tipo que se está emi-tiendo pueda considerarse como que implementael tipo interface (ver método CheckConformance enFuente 7) verificando también que coincidan lostipos de retorno de los métodos. Obviamente esteno sería el caso del tipo Naive y del tipo Maliciousporque ambos métodos ReturnMySelf difieren enel tipo de retorno.

El problema también podría haberse solucionadosi incorporamos antes de generar el IL de los méto-dos un código como se muestra en el Fuente 8.

Pero en ambas soluciones esta verificación quedaa voluntad del programador y no del CLR, por lo quelamentablemente se puede escribir un conversor ¡quepueda impunemente cometer la violación! Y esa noes la máxima que pretende .NET con el código admi-nistrado.

ConclusionesLas Windows Forms y en general gran parte de

la BCL (Basic Common Library) de .NET están pla-gadas de situaciones de este tipo que podrían factori-

zarse para ahorrar trabajo de réplica de programación.Muy probablemente, con el ánimo de no inundar laBCL con demasiadas interfaces que expresen todaslas factorizaciones posibles, tales interfaces no fueronincluidas en la BCL. La solución mostrada en este tra-bajo permite a cada programador lograr el efecto dela tal factorización sin necesidad de que esto estuvie-se preconcebido en el diseño original de la BCL (taly como se ilustró para el ejemplo de las WindowsForms).

Con este artículo mostramos a su vez la poten-cialidad de la reflexión y de la generación de tiposen tiempo de ejecución. Esta capacidad nos permi-te hacer metaprogramación al poder implementar yaplicar patrones, como el ejemplificado para la fac-torización de tipos, de modo transparente para elprogramador.

Para lograr lo anterior no hay que cometer ningu-na violación de tipos como la que se ha ilustrado en estetrabajo. Sin embargo, como se ha explicado, el CLRno verifica, ni exige que el código generado verifique,que no se cometa esta violación. Esperamos que estafalla sea solucionada antes que programadores malin-tencionados hagan un uso inadecuado de la misma.

La combinación del uso de atributos para incor-porar metadatos en un ensamblado y la capacidad delreflexión para recuperar y analizar los mismos, gene-rando incluso código al vuelo en tiempo de ejecución,forman un potente recurso de metaprogramación queserá ilustrado en futuros trabajos.

dotN

etM

anía

<<

34

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

Page 35: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

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.❑ Giro postal a nombre NETALIA, S.L.❑ Transferencia bancaria a nombre de NETALIA, S.L. a:

La CaixaNúmero de cuenta 2100 4315 48 2200014696

(Indique su nombre en la transferencia)

❑ Domiciliación Bancaria Indique su número de cuenta:

❑ Tarjeta de crédito❑ VISA ❑ MASTERCARD

Número de su tarjeta: Fecha de caducidad: / (Imprescindible)

Firma y sello (imprescindible)

a de de 20

Suscripción a dotNetManía

Usted autoriza a la mecaniza-ción de estos datos. El res-ponsable y destinatario deéstos es Netalia, S.L. Ustedtiene derecho a acceder a susdatos, modificarlos y cance-larlos cuando lo desee. Susdatos no serán cedidos en nin-guna de las formas posibles aterceras partes y no se utiliza-rán más que para el buen fun-cionamiento de su suscripcióna la revista dotNetMania ypara informarle de las activi-dades comerciales que realicela editorial Netalia, S.L. Si nodesea recibir informacióncomercial de esta empresamarque la casilla siguiente ❑

❑ Nº1 ❑ Nº2

Envíe este formulario por email a la dirección [email protected], o al fax (34) 91 499 13 64También puede enviarlo por correo postal a la siguiente dirección:

C/ Robledal, 13528529- Rivas VaciamadridMadrid (España)

❑ Deseo suscribirme a dotNetManía por un año (11 ejemplares) y beneficiarme de la oferta del 10% de descuento por unimporte 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ÓLOPARA ESTUDIANTES RESIDENTES EN ESPAÑA.

Page 36: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

Así se quedó Juanita

Book esperando que

le publicaran su libro (foto: Ramírez, 1893)

Hemos necesitadoque pase más de unsiglo pero ahora, en el2004, ya podemosofrecerte la solución+ rápida, económicay eficaz para que tulibro (sea cual sea lamateria tratada) o tutesina vea la luz sinnecesidad de esperarotros tantos años.

Desde una tirada de100 ejemplares lasolución + profesio-nal y económica paraediciones cortas y/opersonalizadas.

nuevosescritoresc/ Collado Bajo, 13 • 28053 Madrid • ✆ 914 770 185 • Fax: 914 773 152

[email protected]

Page 37: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

y sencillez, cualidades aprecia-das por todo programador, gracias a una estu-penda jerarquía de clases, bien organizada en unconjunto de espacios de nombres, que facilita aldesarrollador su trabajo a la hora de localizar yutilizar los tipos de la plataforma que deben inter-venir en las operaciones gráficas de sus aplica-ciones.

Con GDI+ podemos generar una figura sobreun formulario y la impresora, por poner dos ejem-plos de dispositivos diferentes, utilizando bási-camente el mismo conjunto de clases. Ello se debea que GDI+ es un interfaz de programación inde-pendiente del dispositivo sobre el que se crea elgráfico, por lo que resuelve internamente las com-plejidades del dispositivo sobre el que vayamos agenerar nuestro gráfico, proporcionando al pro-gramador un modo transparente de trabajo.

Lo que aprendamos sobre GDI+ para un len-guaje y contexto de trabajo determinado, lopodremos aplicar en otro contexto diferente ytambién distinto lenguaje, siempre y cuando ellenguaje a utilizar pertenezca a la plataforma.NET, ya que GDI+ es una jerarquía de clases de.NET Framework, por lo que no está ligado aningún lenguaje concreto, sino al entorno de eje-cución de .NET.

Vamos a dibujarY ya sin más preámbulos, pasemos directa-

mente a crear nuestro primer dibujo utilizandoGDI+.

Para comenzar, escribiremos el código delfuente 1, que dibujará un rectángulo en el for-mulario.

Introducción a GDI+

Por Luis Miguel BlancoSoftware ArquitectAlhambra-Eidos

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

GDI+ auna potencia<<

Imports System.Drawing‘ ....‘ ....‘ evento Click de un botón:

‘ coordenadasDim pntUbicacion As New Point(80, 45)

‘ tamañoDim szMedidas As New Size(100, 50)

‘ zona para el dibujoDim recArea As New Rectangle(pntUbicacion, szMedidas)

‘ color de la figuraDim oColor As Color = Color.ForestGreen

‘ pincelDim penPincel As New Pen(oColor, 4)

‘ superficie del formulario para dibujarDim gphSuperfDibujo As Graphics = Me.CreateGraphics()

‘ dibujar un rectángulogphSuperfDibujo.DrawRectangle(penPincel, recArea)

‘ liberar recursosgphSuperfDibujo.Dispose()

dotN

etM

anía

<<

37

Fuente 1

Page 38: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

Si ponemos el código del fuente 1 en un botóndel formulario, el resultado tras su ejecución serásimilar a la figura 1.

Diseccionando el dibujo pieza a piezaPara 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 espacio de nombres para las clases gráficas

En el comienzo o cabecera del editor de códi-go debemos importar el espacio de nombresSystem.Drawing, el cual alberga las clases, enume-raciones, y demás tipos de la plataforma que nece-sitaremos para la manipulación de gráficos.

La ubicación del gráficoEl 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 dedibujo del formulario.

Dim pntUbicacion As New Point(80, 45)

El tamaño del gráficoAl igual que establecemos una posición, tam-

bién debemos hacer lo propio respecto a lasdimensiones de la figura. Para ello nos valdremosde la clase Size, pasando a su constructor los valo-

res que representan la anchura y altura respecti-vamente.

Dim szMedidas As New Size(100, 50)

El área de dibujoPara dibujar una figura en un formulario, pri-

meramente debemos delimitar un área en la super-ficie del formulario, dentro de la cual realizaremosnuestro dibujo.

Con figuras simples, esta región consiste en unazona rectangular dentro de nuestro formulario, quedefiniremos mediante un objeto de la claseRectangle, pasando a su constructor los objetos Pointy Size creados anteriormente, que servirán paradecirle al rectángulo cuál es su posición y tamaño.

El pincel y la paleta de coloresYa que nos hemos convertido en artistas digi-

tales, en lugar del pincel y la paleta tradicionales,en nuestro caso utilizaremos clases como materialde dibujo (una de las ventajas es que no nos man-charemos de pintura).

Para la paleta de colores disponemos de laestructura Color, que define en su lista de miem-bros los colores que podemos utilizar al dibujar unafigura, como vemos en la figura 2.

En cuanto al pincel, se encuentra representadopor la clase Pen, a cuyo constructor tenemos que

dotN

etM

anía

<<

38

dnm.plataforma.net<<

Figura 1

Figura 2

Dim recArea As New Rectangle(pntUbicacion, szMedidas)

Page 39: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

pasarle un tipo Color, y un valor numé-rico que establece el grosor del trazocon el que vamos a dibujar.

Dim oColor As Color = Color.ForestGreen

Dim penPincel As New Pen(oColor, 4)

El lienzo.La unión de todos los materiales

Llegados a este punto tenemostodo lo preciso para dar rienda sueltaa nuestra actividad ciberartística. ¿Quénos falta? Pues de igual modo que unpintor clásico necesita un lienzo sobreel que pintar, nosotros también pre-cisamos este elemento clave en todoproceso de dibujo.

En nuestro caso, el lienzo será lasuperficie del formulario. Sin embar-go, no podemos tomar directamenteel formulario y empezar a pintar enél. ¿Y por qué no?, se preguntará. Puesporque en primer lugar tenemos queseleccionar sobre qué tipo de lienzoqueremos pintar.

Para ayudar a comprender mejoreste concepto, volvamos al ejemplo delpintor tradicional. Supongamos quenuestro pintor ya tiene todo lo necesa-rio en cuanto a color, pincel, motivo deldibujo, etc. A partir de aquí, puede pin-tar en un lienzo de tela, una pared (sies un artista del graffiti), una valla publi-citaria, etc. Como vemos, hay muchassuperficies que pueden representar labase o lienzo de su dibujo.

En nuestro caso ocurre algo simi-lar, con los mismos materiales, nues-tra superficie de dibujo puede ser unformulario, la impresora, etc., por loque en primer lugar, tenemos queseleccionar el tipo de superficie, y lue-go pintar sobre ella.

La superficie sobre la que dibuja-remos, recibe en Windows el nom-bre técnico de contexto de dispositivográfico, y en la plataforma .NET, estárepresentada por la clase Graphics, porlo que necesitamos un objeto de estetipo para poder crear nuestro gráfi-co. Más en concreto, lo que precisa-mos es el objeto Graphics que repre-senta la superficie del formulario, yque obtendremos mediante el méto-do Form.CreateGraphics.

Una vez obtenido este objeto, através de los métodos que comienzanpor el nombre Draw, indicaremos quéfigura queremos pintar. La tabla 1muestra alguno de los métodos dis-ponibles.

Para una referencia más extensa,consulte la documentación de .NETFramework.

En el ejemplo anterior hemosdibujado un rectángulo mediante elmétodo Graphics.DrawRectangle, pa-sando como parámetros los objetosPen y Rectangle, que utilizará el obje-to Graphics como tipo de pincel y áreade dibujo respectivamente.

Las operaciones gráficas enWindows hacen un consumo intensi-vo de recursos del sistema, por lo quees altamente recomendable que unavez finalizada la creación de nuestrafigura, liberemos los recursos queestán siendo utilizados llamando almétodo Graphics.Dispose.

Simplificando – resumiendo la operación de dibujo

En el ejemplo anterior, hemos cre-ado por separado cada uno de los obje-tos integrantes de nuestra operación

de dibujo. Si bien ésta sería la mejortécnica de trabajo a efectos didácticos,una aproximación mucho más cerca-na a una codificación real, sería la ins-tanciación en línea de algunos obje-tos en el momento de ser pasadoscomo parámetros a los métodos deotros objetos. Con ello ahorraremoslíneas de código, consiguiendo el mis-mo resultado y rendimiento.

Para apreciar esta diferencia, elcódigo del fuente 2 muestra la mis-ma operación de dibujo que elejemplo del fuente 1, pero aplican-do esta técnica. El único cambio eneste caso, reside en que vamos adibujar una elipse en lugar de unrectángulo.

dotN

etM

anía

<<

39

dnm.plataforma.net<<

Dim gphSuperfDibujo As Graphics = Me.CreateGraphics()

gphSuperfDibujo.DrawRectangle(penPincel, recArea)

Método Tipo de figura

DrawRectangle Rectángulo

DrawEllipse Elipse

DrawCurve Curva

DrawLine Linea

DrawPolygon Polígono

DrawString Cadena de texto en modo gráfico

Tabla 1

GDI+ es un interfaz de programación independiente del dispositivo sobre el que se crea el gráfico, por lo que resuelve

internamente las complejidades del dispositivo sobre el que vayamos a generar nuestro gráfico, proporcionando al programador un modo transparente de trabajo

Page 40: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

El resultado lo apreciamos en la figura 3.

La clase Rectangle dispone de un constructor enel que podemos pasar directamente los valoresnuméricos correspondientes a la posición y tama-ño, sin necesidad de crear un objeto Point ni Size,como muestra la siguiente línea de código.

New Rectangle(25, 45, 200, 40)

Respecto al color, aunque el medio más senci-llo de seleccionarlo es eligiendo uno de los nom-bres de color de la estructura, también podemosusar el método FromArgb, en el que pasamos losvalores numéricos correspondientes a los paráme-

tros alpha (transparencia), rojo, verde y azul res-pectivamente; o también el método FromName, enel que pasamos como parámetro una cadena con elnombre 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 trazoPor defecto, al dibujar con un objeto Pen, se uti-

liza una línea continua para trazar la figura. Sinembargo, mediante la propiedad DashStyle, pode-mos variar el estilo de línea, consiguiendo que estécompuesta por guiones, puntos, etc.

Las propiedades StartCap y EndCap, por otrolado, permiten que el comienzo y final de línea seadiferente de una línea estándar, pudiendo aplicarun efecto de recuadro, redondo, romboide, etc.Como comprobará, si escribe este código de ejem-plo, es muy sencillo asignar estas propiedades, yaque al tratarse de enumeraciones, el editor de códi-go, gracias al Intellisense, nos muestra la lista conlos valores admisibles.

En el código del fuente 3 dibujamos una línea conalgunas de las variaciones que hemos comentado.

dotN

etM

anía

<<

40

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

‘ 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)

gphSuperfDibujo.Dispose()

Fuente 3

Figura 3

Page 41: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

El resultado de la ejecución delfuente 3 lo vemos en la figura 4.

Polígonos y curvasPara dibujar una figura de este tipo,

al ser más compleja de generar, nopodemos especificar un rectángulocomo área de dibujo, sino que tenemosque utilizar un conjunto de objetosPoint contenidos en un array, que usa-remos para establecer las coordenadaspor donde pasará el trazo del pincel aldibujar la figura. En el fuente 4 semuestra un ejemplo de polígono.

En la figura 4 vemos el gráficogenerado.

Para crear una curva, el proceso esigual, pero empleando el métodoGraphics.DrawCurve, como vemos enel código del fuente 5.

En la figura 6 se muestra la curvaobtenida.

Borrado de los elementosgráficos

Después de haber realizadovarias pruebas, a buen seguro quenuestro formulario está repleto defiguras, por lo que posiblemente nosinteresará limpiar su superficie sintener que finalizar y ejecutar nue-vamente el proyecto. Para ello, loque debemos hacer es llamar al

método Form.Invalidate, que borra lasfiguras que hayamos dibujado en laventana.

Me.Invalidate()

El evento Paint.Refrescando zonas ocultas del formulario

Cuando el total o parte del gráfi-co que hemos dibujado en el formu-lario queda tapado por otra ventana,el área oculta se dice que ha quedadoinvalidada. Esto significa que la regióndel gráfico que se ha tapado no esmantenida en memoria por el formu-lario para una posterior visualización,de manera que cuando volvamos amostrar dicha zona de la ventana, laporción del gráfico habrá sido borra-da. La figura 7 muestra esta situación.

Este comportamiento permite alsistema operativo evitar un excesivoconsumo en recursos gráficos, perodeja en manos del programador laresponsabilidad de ocuparse de quetales elementos se muestren en elformulario.

dotN

etM

anía

<<

41

dnm.plataforma.net<<

‘ array de objetos Point con las coordenadas del polígonoDim pntPuntos(4) As PointpntPuntos(0) = New Point(25, 70)pntPuntos(1) = New Point(50, 40)pntPuntos(2) = New Point(75, 70)pntPuntos(3) = New Point(60, 90)pntPuntos(4) = New Point(40, 90)

Dim gphSuperfDibujo As Graphics = Me.CreateGraphics()gphSuperfDibujo.DrawPolygon(New Pen(Color.DarkMagenta, 3), _

pntPuntos)

gphSuperfDibujo.Dispose()

Dim oGraphics As Graphics = Me.CreateGraphics()

oGraphics.DrawCurve(New Pen(Color.Brown, 4), _New Point(){New Point(20,75),New Point(50,15),New Point(100,60)})

oGraphics.Dispose()

Fuente 4

Fuente 5

Figura 4

Figura 5

Figura 6

Page 42: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

noticias.noticias.noticias.noticias

Lo que debemos hacer ante esta circunstancia,es un refresco o repintado del gráfico en el formu-lario. Seguidamente explicamos cómo llevar a caboesta operación.

Cuando una región del formulario que habíaestado oculta vuelve a mostrarse, se produce en eseformulario el evento Paint, de esta forma sabemosque el objeto está solicitando que se vuelvan a dibu-jar aquellos elementos gráficos que podrían haberquedado borrados.

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 elcódigo del fuente 6.

Una vez escrito este código, volveremos a eje-cutar el programa, comprobando esta vez cómo elgráfico del formulario se mantiene gracias a que sevuelve 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.

Y terminamosBien, pues esto ha sido todo, en este artículo

hemos hecho una pequeña introducción a GDI+,el API de programación gráfica de la plataforma.NET Framework, describiendo algunas de susprincipales características. También hemos descri-to los principales objetos implicados en una ope-ración de dibujo, y efectuado unas pruebas demos-trativas de la potencia y facilidad de programaciónde este conjunto de clases. Le invito a que comoejercicio, experimente con otros métodos de losobjetos comentados, para que vaya adquiriendo sol-tura en la gestión de gráficos con .NET.

dotN

etM

anía

<<

42

dnm.plataforma.net<<

Figura 7

Private Sub Form1_Paint(ByVal sender As Object, ByVal e AsSystem.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

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-tes .NET totalmente gratuitos, descuentos para formación en ASP.NET así como oportunidades dehosting ASP.NET.

ASP.NET Resource Kit

Page 43: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

información que una persona está dispuestaa perder en función de lo que eventualmente suce-da es la respuesta a contestar para diseñar nuestrapolítica de copias de seguridad.

Esto parece sencillo, pero no lo es en absoluto.Imaginemos un momento una empresa que factu-re 1 millón al año, si sigue un horario normal tra-bajará 51 semanas, 5 días a la semana; esto suponeuna facturación al día de más o menos 3920 6 día.¿Estaría esta empresa dispuesta a perder la factura-ción de un día? ¿y de una hora?. Generalmente unaempresa con esa facturación es una pequeña empre-sa, cuanto más importante sea el volumen de nego-cio mucho más importante será tener una adecua-da política de copias de seguridad.

Incluso algunas veces, los departamentos deinformática estamos seguros de tener esas copias deseguridad, pero, ¿las hemos probado?, ¿hemos res-taurado esa información para saber que la cinta noestá rota, que contiene lo que esperamos?

La política de copias de seguridad va más allá desimplemente guardar un fichero. Debemos incluirdentro de nuestro plan de sistemas las posibles cau-sas de catástrofe y verificar si estamos listos ante ellas.

En cualquier caso de lo que vamos a hablar enestas líneas es de cómo organizar las copias de segu-ridad y las restauraciones en nuestros servidoresSQL-Server, a comprender cuales son los modelosde copia que nos ofrece la base de datos, a diseñaruna estrategia de copias de seguridad adecuada anuestro hardware y a contemplar el plan de restau-ración que tenemos que implementar en caso decatástrofe.

Tipos de copias

Existen tres tipos de copias de seguridad enSQL-Server, las copias de seguridad completas, lascopias de diferencias y las copias del log:

• Copias de seguridad completas: Las copias deseguridad completas realizan una copia de todoslos datos, bien sea de una base de datos comple-ta, bien del fichero que se especifique. Esta ope-ración se puede realizar 'en caliente', si se hacemientras hay otros usuarios modificando la basede datos, el proceso de copia se encarga de ano-tar el puntero del log en el inicio de la copia y alfinal de ésta, guardando en el mismo conjuntode copias la información que se ha incorporadodurante el proceso. Esto se hace ágilmente en elmomento de la recuperación, ya que las exten-siones de datos son restauradas incluso aunquetengan un estado 'erróneo'; posteriormente seaplican los cambios registrados en el log duran-te el proceso de backup y se obtiene una imagenfiel del momento en que terminó la copia.

• Copias de seguridad diferenciales: Las copiasde seguridad de diferencias guardan todas lasextensiones que han sido modificadas desde laúltima copia de seguridad completa. Son portanto un estupendo mecanismo para aquellosdatos que no crecen pero si se modifican muyfrecuentemente. Hay muchos datos que cum-plen estas premisas, tarifas de artículos, tablasde acumulados de almacén, información decambio de divisas, etc.

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

Por Miguel EgeaSQL Server MVPportalsql.com

Todos los sistemas necesitan una salvaguarda, pero aquellos que contienendatos 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<<

dotN

etM

anía

<<

43

Page 44: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

• Copias de seguridad del Log: Eltercer tipo de copias de seguridad noestá disponible en todas las circuns-tancias. Por ejemplo, la base de datosmaster ofrece —generalmente— unerror al hacer esta copia de seguri-dad. Esto es debido a que solamen-te se pueden hacer copias de seguri-dad del log de transacciones cuandoel modo de recuperación es comple-to o de registro masivo.

El log de transacciones es una estruc-tura secuencial en la que se va guardandola información de modificaciones solicita-das al motor. Periódicamente la informa-ción modificada —que permanece sola-mente en memoria— es volcada a disco,esto se produce inmediatamente despuésde lo que en SQL-Server se llaman pun-tos de comprobación checkpoint. Sin embar-go, aunque el sistema sufriese una caída detensión, esa información no se habría per-dido. Ésta está cuidadosamente guardadaen el log y en el proceso de restauraciónque SQL lanza inmediatamente despuésde una caída no prevista, se vuelven a con-solidar o rechazar los cambios que se pro-dujeron. Tal y como veremos más adelan-te tener backups del log de transaccionesno es solamente una garantía de recupe-ración de la información —incluso al pun-to de ruptura—, sino una operaciónimprescindible para evitar que nuestroarchivo de log crezca desmesuradamente.

Modos de recuperaciónEl modo de recuperación marca la

cantidad y tipo de información que SQL-Server guarda en el log de transaccionesy tiene grandes implicaciones en las polí-ticas de copias de seguridad, sobre todopara determinar la información que sere-mos capaces de restaurar y el tiempomáximo de pérdida de información.

Microsoft SQL-Server 2000 tienetres modos de recuperación:

Sencillo: Si tiene establecido elmodo de recuperación sencillo, no cre-cerá su log de transacciones; es equi-valente a tener establecida la opciónTrun. Log on chkpt en la versión 7.0, eimplica que la información almacena-da en el log puede ser sobrescrita en elmomento que sea necesario si un pun-to de comprobación (checkpoint) ha con-

solidado la información en los ficherosde datos.

Sin embargo, no podrá recuperar lainformación en el momento de fallo;solamente le valdrá la última copia deseguridad que tenga para recuperar lainformación.

En este modo no pueden hacersecopias de seguridad del log de transac-ciones; obtendremos un error si lointentamos.

El procedimiento que tendríamosque seguir para realizar una restauracióndependerá del tipo de copias que haya-mos hecho, pero pasará necesariamentepor restaurar la última copia de seguri-dad completa y restaurar la última copiade diferencias que hayamos efectuado.

Puede establecerse este modo eje-cutando la siguiente instrucción:

Registro masivo: El formato derecuperación de registro masivo nosobrescribe el log de transacciones, porlo que permite recuperación ante erro-res de los discos o medios en donde seestén guardando los datos. Guardamenos información en ciertas opera-ciones masivas del tipo Select Into, bcp,bulk insert y operaciones sobre loscampos de tipo Text e Image (camposblob).

En caso de una catástrofe se podríarecuperar toda la información menoslas operaciones masivas, que tendríanque volver a ser incorporadas de formamanual.

La estrategia de copias de seguridadconstaría de copias de seguridad com-pletas, copias diferenciales y copias delog de transacciones.

La estrategia de recuperación ante unapérdida consistiría en restaurar la copia deseguridad completa más reciente (vere-mos ejemplos con la opción no recovery),después restauraremos la copia de dife-rencias más reciente también —aunqueexistan varias no se tomará más que la másreciente— y sobre esta copia de diferen-cias restauraremos todos las copias del logde transacciones en el mismo orden en elque se hayan guardado.

Es importante que no se ejecute lainstrucción backup log <database> withtruncate_only; si se ejecuta esta instruc-ción necesitamos una copia de seguri-dad completa inmediatamente despuéso no podremos seguir esta estrategia.

Completo: El modo de recupera-ción completo guarda toda la informa-ción (incluidas las operaciones masivas)

en el log de transacciones, esto hace quela política de copias debe ser adecuadapara evitar que en un momento deter-minado podamos perder información ypara evitar que el log de transaccionescrezca de forma desmesurada.

La estrategia de restauración en elcaso del modo de recuperación comple-ta puede ser la misma que hemos pro-puesto para el modo de registro masivo.

Existen comandos que nos muestranla situación de llenado del log y el espa-cio que tiene ocupado. A través de estecomando podemos comprobar si esnecesario hacer una copia de seguridaddel Log. El comando es:

DBCC SQLPERF ( LOGSPACE )

Este comando ofrece resultadoscomo los que aparecen en la Tabla 1.

dotN

etM

anía

<<

44

dnm.servidores.sql<<

Alter Database <Nombre de BD> Set Recovery SIMPLE

Base de Datos Tamaño en Mb % usado Status

master 2.7421875 35.541309 0

tempdb 0.4921875 44.694786 0

model 0.4921875 53.57143 0

msdb 2.2421875 36.193378 0

pubs 0.7421875 40.921051 0

Northwind 0.9921875 40.748032 0

Tabla 1

Page 45: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

También puede ser importante conocer cual esla transacción activa más antigua, esta transacciónactiva más antigua marca el comienzo de la parte delfichero de log que no puede sobrescribirse. Elcomando que vamos a ver a continuación informade la transacción más antigua, de la transacción dereplicación no entregada más antigua.

El comando es

DBCC OPENTRAN (‘Northwind’)

Y nos ofrece la información que podéis ver a con-tinuación.

Comprobar el modo de recuperación de una base de datos

Para comprobar cual es el modo de recuperaciónactual de una base de datos puede usar el administra-dor corporativo en las propiedades de la base de datos(ver figura 1)

También puede comprobar el modo de recupera-ción de la base de datos ejecutando desde cualquieraplicación (por ejemplo en analizador de consultas) lainstrucción:

Políticas de copias

Las copias de seguridad son del tipo de cosas quesiempre se dan por supuestas; generalmente las perso-nas se extrañan de que se pierda información ante unacatástrofe y se preguntan cómo no existían las copias ocómo nadie había comprobado que eran buenas.

Lo cierto es que la realidad luego nos lleva a otrascosas, el día a día nos lleva a problemas que en apa-riencia son más urgentes que comprobar las copiaso revisar si el sistema las está haciendo correcta-mente, la cinta no está rota, etc.

Creo que es claro que nadie nos disculpará si esas

copias no están, así que si estáis ejerciendo esa res-ponsabilidad, aseguraros de forma periódica de querealmente hay copias y de que realmente éstas sonbuenas. No se puede garantizar de otra forma.

Una buena política de copias puede suponer la res-tauración con carácter periódico (a menudo). Unentorno de preproducción en el que se restauren estascopias puede cumplir una doble misión: garantizar laspruebas de integración en el entorno real y garanti-zar que las copias de seguridad cumplirán su objetivoen 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óncomo máximo podría aceptarse como pérdida. Hay sis-temas en los que recuperar la información de un díade trabajo es aceptable y posible, sin embargo, hay otrosen 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ñadapara cubrir los requerimientos de seguridad y puedeno ser puramente técnica sino también física. Por ejem-plo, de nada servirán las copias de seguridad en unascintas en la estantería de encima del servidor ante unincendio.

Los libros en pantalla de SQL-Server también pue-den ayudarnos en el diseño de esta estrategia pues con-tienen una batería de preguntas que vienen muy alhilo de la cuestión.

dotN

etM

anía

<<

45

dnm.servidores.sql<<

select DatabasePropertyEx(‘Northwind’,’Recovery’)

Información de transacción para la base de datos ‘Northwind’.Transacción activa más antigua:

SPID (Id. de proceso de servidor) : 51UID (Id. de usuario) : -1Nombre : user_transactionLSN : (25:180:1)Hora de inicio : Dic 13 2003 4:41:53:543PM

Figura 1. Comprobar el modo derecuperación

Page 46: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

El modo de recuperación idóneopara nuestra compañía también es unadecisión que está en función de esa estra-tegia. Si es aceptable hacer solamenteuna copia de seguridad al día, por ejem-plo por la noche, cuando nadie está enla oficina, y no hay problemas en recu-perar la información que se inserta, qui-zá el modo sencillo sea válido. Si porejemplo la base de datos en cuestión esuna base de datos para cálculos tempo-rales en la que se inserta y borra muchainformación pero no tiene más impor-tancia porque es información transito-ria, simple es un buen mecanismo ya queno obliga a ninguna política de copiasdel log y éste no crece de forma des-controlada.

Si esto no es admisible entonces hayque ir al modo de recuperación completoo registro masivo. Para distinguir entreéstos hay dos cuestiones: la velocidad enla restauración y el tamaño de las copias.

Si el modo de recuperación es de re-gistro masivo, la restauración de copiasen las que se hayan creado índices nece-sitará volver a crearlos (sólo se almace-na el acto de hacerlos, no la informaciónque han generado), por tanto tardarápotencialmente más en la restauración.

Si el modo de recuperación es com-pleto se guarda toda la información mo-dificada. Por lo tanto, no será necesariovolver a generar los índices para hacerla restauración, sin embargo, la copia deseguridad tendrá todos esos datos modi-ficados y lógicamente será más grande.

Un ejemplo de copias

Para realizar este ejemplo vamos aejecutar las instrucciones para realizarlas copias dentro del propio código. Estono es lo habitual, generalmente para elproceso de realización de copias de segu-ridad lo que existe es una tarea progra-mada con una frecuencia determinada,frecuencia que además va en función dela cantidad de información y la distri-bución temporal de la entrada de ésta.

Vamos a partir del código del fuente1 en el que suponemos que existe una basede datos llamada pruebas.

En el caso de los modos de recupera-ción de registro masivo y completo es muyimportante hacer copias de seguridad losuficientemente frecuentes para que el

fichero de transacciones no crezca des-mesuradamente. Cada una de las transac-ciones se registran en el log y el espacioque usan no es marcado como rehusablehasta que se salva con una copia de segu-ridad de Log. Por tanto, hay que estable-cer frecuentes copias de seguridad de éste.

Pero, ¿qué significa frecuente? La ver-dad es que no hay una regla, todo depen-de de la cantidad de información que semodifique o inserte, además no hay unaúnica respuesta a esta pregunta.

Imaginemos una empresa de ventasen la que los pedidos se introducentodos entre las 9 y 10 de la mañana para

proceder al reparto todo el día.Seguramente la mayoría de las transac-ciones se ejecutan en una hora, y el res-to del día son mayormente consultas.Quizá entre las 9 y las 10 el log crezcamucho y, por tanto, necesite copias másfrecuentes, por ejemplo, cada 10 minu-tos. Sin embargo, el resto del día bas-taría con una copia cada 2 horas (inclu-so menos), ¿Cómo determinar esto?

Quizá una buena estrategia podríaser la siguiente, crear un procedimien-to almacenado como el del fuente 1(obtenido de http://www.portalsql.com).Ver fuente 2.

dotN

etM

anía

<<

46

dnm.servidores.sql<<

Use pruebasgoif databasepropertyex(‘Pruebas’,’recovery’)<>’FULL’ALTER DATABASE Pruebas SET RECOVERY FULL

go— Creamos una tabla en la base de datos de pruebas, para que existaaunque— no tenga datos en el primer momento de la restauraciónCREATE TABLE TablaPruebas(id int identity(1,1),

Descripcion char(30),FechaHora datetime default getdate())

goBACKUP DATABASE PRUEBAS TO DISK =’C:\BackupDePruebas.bak’go— Ahora creamos registros para insertar dentro de nuestra base dedatosDeclare @i intSET @i=1— hacemos un bucle hasta 200while @i<=200begin—INSERT INTO TablaPruebas (Descripcion) values

(‘ El valor de @i es ‘ + cast(@i as char(3)))— en el elemento 100 hacemos un backup de log— lo vamos a hacer en el mismo fichero. Es más claro— hacerlo en ficheros diferentesif @i=100

BACKUP log PRUEBAS TO DISK =’C:\BackupDePruebas.bak’set @i=@i+1

endgo

— vamos a borrar una tabladeclare @Nombretransaccion char(20)set @Nombretransaccion =’Borrar TablaPruebas’begin tran @NombreTransaccion with markdrop table TablapruebasCommitgodeclare @nombre varchar(100)set @nombre=’Segunda copia de lpg’BACKUP LOG PRUEBAS TO DISK =’C:\BackupDePruebas.bak’ with name=@nombre

Fuente 1

Page 47: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

dotN

etM

anía

<<

47

dnm.servidores.sql<<

if not object_id(‘backupwhennecesary’) is nulldrop proc backupWhenNecesary

gocreate 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 sysnameDeclare @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>75and 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 crfetch next from cr into @tablawhile @@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 copiaexec 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— cerramosclose cr— liberamosdeallocate cr— y borramos nuestras tablas...drop table #temp

endgo

Fuente 2

Page 48: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

Este procedimiento almacenado podemos pro-gramarlo para que se ejecute cada 10 minutos. Elpropio procedimiento comprobará si debe hacer lacopia de seguridad del log de transacciones o no. Deesta forma el proceso de restauración tendrá unnúmero variable de ficheros de copia pero tendre-

mos solamente los necesarios para mantener la segu-ridad evitando que el log de transacciones crezca des-mesuradamente.

La restauración

En este momento comenzaremos con el proceso derestauración de copias de seguridad. Como el modelode copias que hemos elegido es completo, tendremosque restaurar en el orden adecuado. Además hemos guar-dado todas las copias de seguridad en el mismo fichero,por lo que tendremos además que ver cual es el conte-nido de ese fichero y diseñar la estrategia de copias:

Para comprobar el contenido en cuanto a copiasdel fichero de backup nos sirve el siguiente comando:

RESTORE HEADERONLY FROMDISK=’C:\BackupDePruebas.BAK’

Algunas veces necesitamos restaurar los ficherosde la copia en otros servidores que no tienen la mis-ma configuración de unidades de disco. Esto impideque la primera restauración se haga con un simplerestore, necesitando usar la cláusula with move. Estacláusula necesita los nombres de los ficheros de basede datos, tanto lógicos como físicos. Para comprobarcuales son los nombres lógicos y saber cual era la rutaen los ficheros físicos (ahora será nueva) podemosusar esta otra instrucción:

La cláusula with file sirve para indicar de cual delas diferentes copias de seguridad que se han guarda-do en el mismo fichero queremos conocer los fiche-ros que contiene.

Vamos a realizar nuestra restauración:Podríamos comenzar usando el comando Restore

Database como sigue:

restore database pruebasfrom disk=’C:\BackupDePruebas.BAK’

with norecovery

Sin embargo, si intentamos entrar en esa basede datos obtendremos un mensaje de error que nosdirá que la base de datos se encuentra en proceso derestauración y que no puede ser usada. A nosotrosnos interesa comprobar paso a paso lo que va hacien-do el proceso de restauración así que vamos usarotra cláusula diferente para la restauración: la cláu-sula StandBy.

A esta cláusula hay que especificarle un nombrede fichero. En ese fichero introducirá todas las tran-sacciones que no estén confirmadas ni rechazadas enel momento de la restauración, seguro que una res-tauración de un fichero de log posterior confirmaráo rechazará la mayor parte de ellas. La base de datosno permitirá modificaciones pero sí consultas.

restore database pruebasfrom disk=’C:\BackupDePruebas.BAK’with standby=’c:\standby.undo’

gouse pruebasgoselect * from pruebas..tablapruebas

En esta sentencia podréis comprobar que la tablapruebas existe y que no tiene registros. Vamos a res-taurar la siguiente copia de seguridad; en este caso seráuna copia de seguridad del Log. En el ejemplo y porsimplificar no hemos usado copias diferenciales, si exis-tiesen, solamente hay que restaurar la última de ellas.

restore log pruebasfrom disk=’C:\BackupDePruebas.BAK’with standby=’c:\standby.undo’,

file=2

go

select * from pruebas..tablapruebas

En este momento tendremos 100 registros en latabla Tablapruebas, ya que se corresponde con esemomento intermedio en el que solamente se habíaninsertado 100 registros.

Ahora, podríamos seguir restaurando el resto de Logs,cambiando simplemente el número de file. Sin embargo,en nuestro caso, la restauración se habría hecho justo des-pués de un drop table, es decir ¡no tendríamos nada!

dotN

etM

anía

<<

48

dnm.servidores.sql<<

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

La política de copias de seguridad va más allá de simplemente guardar un fichero. Debemos

incluir dentro de nuestro plan de sistemas las posibles causas de catástrofe y verificar

si estamos listos ante ellas

Page 49: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

Por todo esto, lo que vamos a hacer es restaurarlohasta justo el momento antes de haber borrado la tabla.

Esto puede hacerse de varias formas: se puedeaveriguar la hora exacta a la que se hizo el borradoy restaurar hasta ese momento con la cláusula stopat.Sin embargo, a mi personalmente me parece másinteresante marcar las transacciones (como hemoshecho en el script) y restaurar hasta la marca. Si lasaplicaciones se desarrollan pensando en esta funcio-nalidad es muy útil. En un momento determinadopodríamos restaurar hasta la creación de un núme-ro de cliente o de factura, por ejemplo.

Vemos como se haría en el fuente 3.De esta forma podéis comprobar que existen toda-

vía los doscientos registros que acabamos de generar.

Dividir en filegroupsEn la mayoría de las organizaciones los datos no

tienen la misma frecuencia de modificación.Generalmente, simplificando, se pueden dividir entres tipos los datos en cuanto a lo que se modifican:Nunca o rara vez, de vez en cuanto y muy a menudo.

Puede ser una buena idea plantearse políticas decopias de seguridad completas o de diferencias por file-groups, determinando la periodicidad de cada una de lascopias en función de lo que se modifican. Esto puedepermitir que nuestras copias ocupen mucho menos espa-cio y que sin embargo no tengamos riesgos grandes depérdida de información.

La sintaxis de Backup Database y de Restore natu-ralmente permiten salvar o restaurar un solo ficheroo un grupo de ficheros.

No obstante, este modelo tiene una complejidadadministrativa bastante grande. Por ejemplo , pararealizar una restauración completa, hay que seguir lossiguientes pasos:

1. Realizar una copia de seguridad del log de tran-sacciones tal y como esté en este instante.

2. Restaurar cada uno de los ficheros de base de datos.3. Restaurar cada uno de los Logs de transacciones

empezando por el inmediatamente posterior algrupo de ficheros más antiguo restaurado.

4. Restaurar el log que acabamos de salvaguardarrecuperando la base de datos.

Es decir, tenemos que guardar y administrar todoslas copias de seguridad del log de transacciones des-de al menos la última copia del fichero que menos semodifica.

Todo esto puede minimizarse naturalmente concopias de seguridad de diferencias de archivos.

Recuperación al punto de fallo

Si nuestro modo de recuperación es Completo y eldisco duro falla u ocurre alguna catástrofe que per-mita hacer un backup del log, es posible restaurar labase de datos en otro servidor sin perder ninguna infor-mación.

Los pasos serían realizar un backup del log con lacláusula WITH NO_Truncate, que permite realizar copiasde seguridad del log cuando la base de datos está daña-da y a continuación recuperar la base de datos tal y comohemos venido explicando durante todo el artículo.

ConclusiónSQL-Server nos ofrece una variedad bastante

importante de mecanismos para realizar y restaurarcopias de seguridad. Dada la trascendencia de lascopias, es importante diseñar una estrategia de recu-peración ante errores que sea adecuada a los proble-mas que pueden presentarse.

dotN

etM

anía

<<

49

dnm.servidores.sql<<

restore log pruebasfrom disk=’C:\BackupDePruebas.BAK’with recovery,

file=3,stopbeforemark=’Borrar TablaPruebas’

goselect * from pruebas..tablapruebas

Fuente 3

Page 50: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

dotN

etM

anía

<<

50

arquitectura está de mo-da. En eventos como el último PDC deMicrosoft se dedican tracks específicos, yhasta una matinal completa (el ArchitectureSymposium), aparecen newsletters, revis-tas, secciones en revistas, webs, libros,documentos extensos y demás artilugioscomunicativos. Hasta en la trilogía Matrixaparece la figura del Arquitecto, un ele-mento endiosado y de discurso rocambo-lesco. ¿A qué se debe toda esa artillería?¿Hemos de escondernos en la trincherahasta que pase la tormenta, o ese bom-bardeo sirve para allanar el camino haciael combate con nuestro enemigo virtual?

Los problemas y las soluciones a estaspropuestas por la arquitectura no son nue-vos, los que es nuevo es el concepto. Elconcepto nos enfrenta a tener otra pers-pectiva sobre esos problemas; lógicamen-te, una perspectiva más rica y que nos per-mite avanzar con mayor rapidez y acierto,en comparación con los enfoques que usá-bamos anteriormente.

Delineandola arquitectura

Las aplicaciones actuales se concibenpara resolver una problemática específi-ca y se adaptan a la infraestructura y cono-cimientos que existen en la empresa. Esasaplicaciones son como islas, que tienden“ferrys”, con un horario y una capacidadde carga, a otras aplicaciones en forma devolcados de datos hacia ficheros, tablascompartidas y demás artefactos. Sinembargo, haga una prueba, solicite usteda cualquier departamento de TIC el dia-grama de los nodos de la red, routers, ser-vidores, rangos de IPs, con los anchos debanda que los interconectan, y lo tendráen un momento. Pregunte por las aplica-ciones, el volumen de datos que inter-cambian entre ellas, y con el exterior, ylos mecanismos utilizados para ello, y sólo

recibirá explicaciones verbales y, en bas-tantes casos, incompletas y poco o nadacuantificadas. A pesar de que alguien tie-ne la imagen completa de los sistemas dela empresa, pocos o nadie, tienen unavisión de la Solución software de laempresa. La mayúscula en “Solución”pretende resaltar que el conjunto de apli-caciones propias o adquiridas sobre lasque se asienta un negocio son, en el fon-do, más importantes que sus motores basede datos, sus sistemas operativos o suscomunicaciones. ¿Por qué esta falta deconsciencia del valor de estos activos y delograr que funcionen tan bien engrasadoscomo el hardware o los sistemas?

Una de las consecuencias de la falta de“mapas” de nuestro software es que la insi-nuación de realizar cambios en las solucio-nes provoque respuestas de dos tipos: opánico o inconsciencia. La reacción de páni-co consiste en argumentar que todo es muydifícil y complicado y que, en definitiva,“no se puede hacer”. Alternativamente, larespuesta se dilata creando una comisiónque estudie el asunto. La comisión sueleenfrentarse al problema de la no-docu-mentación de las aplicaciones, la ausenciade aquellos que las crearon y la dificultadde interrelacionar sistemas que nunca hancontemplado la integración como priori-dad (de acuerdo, no seamos tan radicales,pongamos que está en el nivel 3 de priori-dad). Conclusión: si puede hacerse, serácaro y/o lento.

La reacción de inconsciencia o rambis-mo (derivado de Rambo, héroe popularconocido por su arrojo, paciencia, senti-miento de abandono y locuacidad) se carac-teriza por intentar descubrir, sobre la mar-cha, en qué afecta el cambio, ya realizado, alresto de la estructura software y luego apli-car, no siempre con presteza, una soluciónde emergencia. En resumen, ninguna de lasdos respuestas supone un buen servicio a laempresa que mantiene a ese departamento

de TIC, y justifica la visión que muchosdirectivos tienen de que la informática esinmovilista, lenta y poco profesional.

Este es el punto en que aparece el con-cepto de arquitectura del software, enten-dida como: “la estructura o estructuras delsistema, lo que comprende elementos soft-ware, las propiedades de esos elementosvisibles externamente y la relación entreellos”. (…) “Central, entre estos concep-tos, es la noción de que las arquitecturasconsisten en estructuras separadas y coor-dinadas y que cada una de estas estructu-ras ofrece un punto de apoyo para la inge-niería de sistemas.” (…) “La visión del sis-tema que tiene el arquitecto es abstracta,decantando los detalles de implementación,algoritmos y la representación de los datosy concentrándose en el comportamiento einteracción entre las ‘cajas negras’ que cons-tituyen los elementos.” Estas descripcionespueden leerse en diferentes puntos del librode Bass, Clements y Kazman y otras simi-lares en artículos como los del recienteMicrosoft EMEA Architects Journal.

Citando de nuevo el libro de Bass,Clements y Kazman: “La arquitectura es elprimer artefacto que se puede analizar paradeterminar el grado en que se alcanzarán losatributos de calidad, al tiempo que sirvecomo plano general del proyecto. Una arqui-tectura sirve como vehículo de comunica-ción, es la manifestación de las primeras deci-siones de diseño y es una abstracción reuti-lizable que puede transferirse a nuevos sis-temas”. Es decir, la misión de un arquitec-to consiste en producir papel (virtual, si ustedquiere, pero papel al fin y al cabo). Porsupuesto, huelga decir que sólo necesitaráun mapa cuando la estructura software a ges-tionar sea amplia, no lo necesitará para ir acomprar el pan cada mañana.

Esos mapas tienen varias lecturas,igual que los mapas de carreteras reales.El software tiene una dimensión de infor-mación, una dimensión de seguridad, una

El Señor Arquitecto

Por Jordi RamblaRegional Director de Microsoftcertia.ramblainf.com

Parece que la <<

Page 51: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

dimensión de rendimiento y disponibili-dad, otra de gestionabilidad y facilidad demantenimiento, una dimensión humana(usuarios y desarrolladores), otra históri-ca… Son el equivalente al plan de empre-sa o al presupuesto general de esta, perocentrado en la Solución software. Deberádefinir los grandes bloques, sus responsa-bilidades, sus requerimientos operativos,sus interfaces con el resto de bloques y conel exterior, y su evolución. Observe queno se menciona para nada la solución esco-gida para la implementación. Cuando, enun plan de empresa, definimos la necesi-dad de un departamento comercial, noexplicitamos qué marca de vehículo, móvilo agenda utilizará.

La arquitectura es, probablemente, elfruto de la profesionalización del softwareque mayor retorno de la inversión (ROI)generará para la empresa, previniendo losmales mucho antes de que aparezcan. Denuevo, igual que el plan de empresa o pre-supuesto, supone una referencia básica parala toma de decisiones de gestión.

Otro sentido para la calidad

Cuando hablamos de control de cali-dad del software solemos asociar el con-cepto con el número de bugs que tiene. Sinembargo, cuando decimos que “un soft-ware tiene calidad” abarcamos aspectosmucho más ricos, como la facilidad de uso,la amplitud de sus funcionalidades, el ren-dimiento, la estabilidad, la facilidad de ins-talación, etc. Estos son los conceptos, amenudo relegados, que la arquitecturaaporta al software.

Es difícil confeccionar una lista exhaus-tiva de todos los requisitos que debería cum-plir una aplicación más allá de sus requeri-mientos funcionales (lo que debe hacer laaplicación), entre ellos podemos contem-plar: el rendimiento, la robustez, la dispo-nibilidad, la seguridad, la posibilidad demonitorizar o gestionar su funcionamien-to, la facilidad para depurarla, la compati-bilidad con la plataforma, la utilización derecursos como disco, memoria o ancho debanda, la facilidad para modificarla, la faci-lidad de uso y la interoperatividad con otrossistemas internos y externos. ¿Olvidamosalgo?, probablemente sí. Además, el arqui-tecto deberá contemplar los aspectos denegocio como el time-to-market, el presu-puesto, los recursos humanos disponibles y

su experiencia, los sistemas preexistentes ylos sistemas futuros.

Dibujando al arquitectoEn las organizaciones actuales, las per-

sonas que asumen parte de esa responsa-bilidad son los directores de TIC, los ana-listas, los responsables de sistemas, deseguridad y de comunicaciones, por ejem-plo; pero ninguno de ellos lo hace comotarea principal ni con una visión comple-ta del problema. De ahí vamos entrevien-do la necesidad de esa figura, alguien queno tenga que gestionar equipos humanos,presupuestos y el día de un departamen-to, como corresponde al director de TIC;alguien que no es especialista en un domi-nio o área funcional concreta como unanalista; o que tenga una visión mono-cromática de la solución como un res-ponsable de sistemas o de seguridad.

Esta figura aún es, sin embargo, pocovisible y poco concreta en las empresas.¿Cuántas veces un contertuliano le haentregado una tarjeta en la que rezara eltítulo de “arquitecto de software”?¿Ninguna? No le haré la misma preguntasobre los “ingenieros de software”, pues esonos llevaría a otra discusión que, créame,sería mucho menos ilustrativa. Es muchomás fácil concretar la labor de un arqui-tecto que la de un ingeniero.

El arquitecto obliga a ver la TI desdedos perspectivas: la de la infraestructura yla del negocio, cada “caja negra” ejerce unafunción en el conjunto global, al igual quecada departamento ejerce una función enel conjunto de la empresa. Es una figuraque incorpora la estrategia global del nego-cio en las TI.

Por otra parte, el arquitecto obligaráa considerar seriamente las métricas de lasaplicaciones o el SLA (Service LevelAgreement, entendido como carga, tiem-po de respuesta, disponibilidad… de cadaaplicación). Puesto que esos requeri-mientos forman parte de su cuestionarioinicial a los que propongan cada necesi-dad. Además, incorporará las aplicacionescríticas (ERP, CRM, producción, SCM…)en una visión global con un objetivocomún; lo que no es baladí, pues estas apli-caciones son “reyes de Taifas”, ejerciendouna cierta tiranía en su área de influencia.Plantear a priori como encajarán en el res-to de la arquitectura y como se relaciona-rán con las demás, será quizá el primer

beneficio claro y de retorno inmediato quereciba una empresa de adoptar el concep-to de arquitectura a su instalación.

Ser arquitecto no es cosa fácil, su tareaconsiste en conciliar requerimientos que,en la mayoría de los casos, son antagóni-cos. Deseamos más seguridad y más ren-dimiento, menor coste de implementaciónpero mayor calidad del trabajo, por ejem-plo. El arquitecto juega a encontrar lasolución que optimice el valor de todasestas variables.

Por otra parte, los conocimientos nece-sarios son variados y, aunque no debe serun experto en todos los ámbitos, cuanto mássepa y mayor experiencia tenga, mejor podrárealizar su tarea. Idealmente, un arquitectodebería tener conocimientos de negocio ygestión empresarial, de análisis funcional,de tecnologías de desarrollo, de estándares,de sistemas, comunicaciones y bases dedatos, de seguridad, de dispositivos inteli-gentes, de “cálculo de estructuras”, de explo-tación de la solución, de… ¿es necesario quesiga?, creo que ya se hace una idea, ¿ver-dad? Puesto que se trata de una “ciencia”abstracta, es posible que esta sea un área enla que los informáticos licenciados con cier-tos conocimientos de negocio (¿un máster?)puedan iniciar una carrera profesional conmayor claridad que la que ofrecen las figu-ras clásicas de las TIC.

A pesar de la aparente juventud delconcepto de arquitectura en la industria,no lo es tanto en los entornos algo másacadémicos y podemos localizar biblio-grafía, propuestas de métodos, herra-mientas y métricas para llevar a cabo esatarea tan amplia. Le recomiendo que visi-te la página web del reputado SoftwareEngineering Institute de la UniversidadCarnegie-Mellon, dispone de un áreadedicada al estudio de la arquitectura.

Más allá de la teoríaRealizar esta presentación teórica de

lo que es la arquitectura y de lo que haceun arquitecto, era necesaria para estable-cer un marco, para ir perfilando con mayorclaridad el ámbito de actuación y dotar devalor al concepto.

En próximos artículos atacaremosaspectos más prácticos tales como la arqui-tectura orientada a servicios (SOA), lasguías de arquitectura de Microsoft, los pat-terns, los “tiers & layers”, las aplicacionesde ejemplo, etc. do

tNet

Man

ía<<

51

dnm.arquitectura<<

Page 52: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

arquitectura comúnpara el acceso a datos, generación de infor-mes y entrega de información que per-mite responder con rapidez a las necesi-dades de desarrollo de informes o aplica-ciones. Ha sido diseñado para integrarsesin fisuras con las inversiones en datos,aplicaciones e infraestructura web exis-tentes sin exigir un nuevo conjunto deestándares y procesos. Integra de una for-ma unificada las características de todoslos productos Crystal para satisfacer lasdiversas necesidades de los usuarios, des-de la generación de informes de calidadhasta el análisis profundo de los datos.Adicionalmente, ofrece amplias facilida-des para la planificación de la generaciónde informes, su distribución automática,el despliegue de informes a través de lainfraestructura web de la organización, yla administración del control de accesopor parte de los usuarios a los informes.Todo ello permitiendo aprovechar losrecursos disponibles en su empresa, pues-to que a) es capaz de acceder a práctica-mente todas las fuentes de datos del mer-cado a través de más de 30 tecnologías deacceso diferentes; b) ofrece interfaces paraacceder a todas sus funcionalidades des-de los más diversos lenguajes y marcos detrabajo de programación; y c) está dispo-nible no sólo para Windows, sino tam-bién para Solaris y AIX.

A continuación veremos de una mane-ra resumida las principales ventajas queofrece CE10 a sus categorías de usuarios:clientes finales, diseñadores de informes,desarrolladores y administradores.

Para usuarios finales

CE10 pone al alcance del usuariofinal amplias posibilidades para el dise-ño y ejecución de informes tradicionalesy analíticos. Los usuarios avanzados yanalistas podrán también utilizar CE10como repositorio centralizado para elacceso a los datos a través de los cualesconducir los análisis, crear hojas de cál-culo e informes de calidad y compartirla información a través de la empresa.

Integración con Microsoft OfficeOfrece diferentes puntos de integra-

ción con Office, y permite almacenar ygestionar ficheros Excel, Word yPowerPoint, manteniendo una únicafuente centralizada de información endiferentes proyectos.Diseño y ejecución directos de informes y cubos

CE10 ofrece un amplio rango deposibilidades para el diseño y ejecución

ad hoc tanto de informes "tradicionales"como de informes analíticos.

PlaniificaciónLas operaciones comunes, tales como

la impresión o planificación de informes,han sido simplificadas con la introduc-ción de nuevas características, como loscalendarios o la impresión DHTML.

Para el diseñador de informes

CE10 ofrece una gran fluidez entreinformes y fuentes de datos a través delas Vistas de Negocio (Business Views),el Repositorio de Crystal y a través denuevas características de navegación deinformes.

Acceso a datos simplificadoLas Vistas de Negocio, una novedad

CE10, ofrecen una nueva capa de abs-tracción que simplifica el proceso deconexión a las fuentes de datos de laempresa. Mediante las Vistas de Negocioes posible además integrar datos prove-nientes de diferentes fuentes.Repositorio integrado de componentes de informes

A través del Repositorio de Crystal,las Vistas de Negocio ofrecen tambiénun acceso centralizado a los componen-tes de informes comunes, lo que hace

dotN

etM

anía

<<

52

Crystal Enterprise v10Una potente plataforma de servicios de informes

CE10 es una<<

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.

Por Octavio HernándezC# .NET MVPGrupo Danysoft

Page 53: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

dotN

etM

anía

<<

53

dnm.laboratorio.net<<

posible compartir componentes útilescon otros diseñadores de informes.Hiperenlace de informes

Usted podrá utilizar hiperenlaces enlos informes de Crystal Reports o CrystalAnalysis (ficheros .RPT y .CAR) paraconectar la información almacenada endiferentes informes y facilitar la navega-ción a los usuarios finales.

Para el desarrollador

CE10 permite aprovechar todas lasposibilidades de la plataforma de CrystalEnterprise con cambios y rediseño míni-mos en las aplicaciones. Las novedadesde esta versión permiten acelerar la cre-ación de nuevas aplicaciones y simplifi-car la migración de aplicaciones creadaspara los componentes más pequeños dela plataforma, por ejemplo CrystalReports.

Controles de servidor .NETCE10 ofrece controles visuales y no

visuales que contiene la lógica para lasoperaciones comunes como la autenti-cación, el listado de carpetas o la visua-lización de informes. Es posible mani-pular dichos controles en tiempo de dise-ño e incorporarlos fácilmente a las apli-caciones.Migración y escalado de aplicaciones

Es posible utilizar CE10 para cen-tralizar y escalar aplicaciones indepen-dientes existentes creadas utilizando cual-quier producto de la familia Crystal.

Para los administradores de sistemas

CE10 ayuda a los administradores asimplificar su trabajo mediante la dele-gación de tareas y la automatización delas operaciones periódicas. CE10 tam-bién ofrece soporte multiplataforma, unagestión de datos completa y posibilida-des de auditoría detallada de utilizacióndel sistema.

SeguridadCE10 extiende la funcionalidad del

Directorio Activo y LDAP para dar sopor-te a un conjunto más amplio de escena-rios de seguridad.• Directorio Activo (modo nativo):

Permite autenticar a usuarios CE10ante un servidor de Directorio Activo.

• LDAP (SSL): La extensión paraLDAP ofrece un canal de comunica-ción seguro entre CE10 y un servidorde directorio, a través del cual se rea-lizarán todas las peticiones de autenti-cación y autorización de CE10.

Gestión de objetosCE10 aumenta su capacidad para

centralizar información crítica y distri-buirla de un modo consistente.• Objetos de hiperenlace: Mecanismo

estándar para acceder a la informaciónalmacenada en sistemas externos.

• Paquetes (packages) de objetos: Per-miten planificar, asegurar y gestionarinformes y aplicaciones relacionadascomo si fuera un único objeto.

• Soporte para objetos de terceros:Permite distribuir información adicio-nal asociada a los informes operativos

• Asistente de publicación unificado:Permite publicar simultáneamente aCE10 diferentes objetos, tales comoinformes, documentos de Office y otrosficheros.

Administración de sistemasCE10 permite descentralizar la admi-

nistración. Por ejemplo, se puede dele-gar o automatizar tareas específicas.• Administración delegada: Permite al

administrador del sistema distribuir lastareas de administración a administra-dores de aplicaciones o elementos espe-cíficos de la organización.

• Notificaciones: Son disparadores a nivelde objetos, diseñados en primer lugar parapermitirle capturar los fallos críticos deejecución o notificar a los usuarios que tie-nen a su disposición nueva información.

• Objetos de programa (programobjects): son ejecutables, scripts o apli-

caciones Java que pueden ser planifi-cados para su ejecución periódica o des-pués de la ocurrencia de un evento.

• Auditoría: Las nuevas posibilidadesponen a disposición de los administra-dores un registro histórico de la inte-racción de los usuarios con los objetosy de la utilización del sistema.

Acceso, seguridad y gestión de datosLas Vistas de Negocio, un servicio

de metadatos que forma parte de CE10,permiten gestionar fácilmente la gene-ración de informes contra múltiples fuen-tes de datos de diferente naturaleza y almismo tiempo abstraer y organizar losdatos para los usuarios finales, gestio-nando la eficiencia de consultas y segu-ridad a nivel de datos.Soporte para múltiples plata-formas

CE10 le permite una amplia flexibi-lidad en la elección de sistemas operati-vos, plataformas y lenguajes:• Sistemas operativos: Soporte comple-

to para todas las funciones de servidor(incluyendo generación de informes ycubos) en Windows, Solaris y AIX.

• El escritorio web de CE10: La inter-faz web estándar soporta ahora losentornos COM y Java.

Conclusiones

CE10 dota a la empresa de unapotente arquitectura unificada para satis-facer las necesidades de información atodos los niveles. Recomendamos su eva-luación a todos aquellos que necesitenuna plataforma de este tipo para garan-tizar la disponibilidad de la informacióna sus usuarios, y en particular a los cien-tos de empresas que actualmente utili-zan Crystal Reports como herramientade generación de informes en sus apli-caciones.

Para más información consulte conDANYSOFT, VAR Business Objects,en http://www.danysoft.com o el902.123.146.

Page 54: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

<<

C# al descubiertoJoseph Mayo

Editorial: MCGraw-HillNº de páginas: 784ISBN: 84-205-3477-3Publicació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 importantesdel BCL, tales como ADO.NET y ASP.NET, acceso a ficheros del sistema ySerialization, uso de bibliotecas de red, características de localización, manejo deficheros de recursos, XML, Atributos y Reflection. También revisa los mecanismosprincipales 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 propioCLR (Common Language Runtime), o el despliegue final de la aplicación. En sumauna 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-HillNº de páginas: 142ISBN: 84-481-3981-XPublicación: 2003

Obra de referencia sobre la arquitectura de aplicaciones .NET realizada por lapropia empresa distribuidora del producto. Recorre la arquitectura de aplicacionesy servicios y su integración correcta en el sistema, abordando todas las capas de laaplicación, y explicando la forma en que deben de ser interconectadas, evitandoerrores comunes, y abundando en las llamadas “buenas prácticas”.

Revisa, igualmente, las más importantes características de seguridad a tener encuenta, (directivas de seguridad, administración operativa y comunicaciones), fina-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.

dotN

etM

anía

<<

54

dnm.biblioteca.net<<

dnm.biblioteca.net

Page 55: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

dotN

etM

anía

<<

55

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

Concurso de creación de páginas Web con ASP.NET

presentación de proyectoscomenzará el 1 de abril y finalizará el15 de junio. Para participar en esta ini-ciativa, los interesados deben utilizar.NET Framework y cualquier herra-mienta de desarrollo como Visual Studio.NET o WebMatrix y apoyarse, si así lodesean, en los Starter Kits ASP.NET.

Los participantes pueden presentarsus trabajos en cualquiera de las seis cate-gorías habilitadas al efecto: Comercioelectrónico, Portal, Comunidad, In-formes, Control de tiempos y Categoríalibre (no recogida en ninguna de las cin-co categorías anteriores). Por otra parte,varias empresas de alojamiento web pro-porcionarán alojamiento gratuito a losparticipantes durante tres meses (desdela fecha de inicio del concurso y hasta 15días después de terminado el plazo deinscripción), y una oferta especial conobjeto de que sigan manteniendo sussitios ASP.NET una vez finalizado elconcurso. También colaborarán variaspublicaciones técnicas, las cuales ofrece-rán información del concurso y partici-parán en la elección de los ganadores.

Mecánica del concursoEl desarrollador debe inscribirse

como concursante en la webhttp://www.microsoft.com/spanish/msdn/concuasp en el plazo indicado. Una vezinscrito se enviarán sus datos a una de lasempresas de alojamiento web, la cual ledará de alta como concursante. Desde esemomento dispondrá de un plazo máximode 15 días para que comience a crear susitio web (en caso de no hacerlo se le daráde baja) y de otro plazo máximo de 30días desde el alta para terminarlo. Cadadesarrollador sólo puede participar conun sitio web por cada categoría. Por otraparte, para poder participar, el concur-sante debe residir en España.

Premios

Sólo por participar, todos los con-cursantes que cumplan los requisitos ycuyos sitios web sean considerados váli-dos, recibirán como regalo dos entra-das de cine.

Una vez terminado el plazo de pre-sentación, un jurado compuesto de unapersona de cada empresa de alojamiento,una de cada revista colaboradora y dospersonas de Microsoft revisarán de for-ma individual durante una semana lossitios participantes, valorando su origi-nalidad y calidad y eligiendo los tres mejo-res en cada una de las seis categorías.

Posteriormente se reunirá el juradoal completo, se revisarán los 18 sitioselegidos por cada jurado y sobre ellosse realizará una votación conjunta y sedecidirá quiénes son los ganadores. Estadecisión se anunciará a partir del vier-nes 25 de junio en la web de la campa-ña en MSDN Online y se comunicaráa través de la newsletter para desarrolla-dores de Microsoft, en los sitios web delas empresas de alojamiento, y en lasrevistas, sitios web y newsletters de laspublicaciones patrocinadoras.

Habrá tres premios por categoría:• 1er premio: una consola de videojuegos

Xbox más un juego, mando a distanciapara ver DVDs en la Xbox y una pelí-cula DVD. Un Visual Studio .NET2003 Enterprise Developer. Alojamientogratuito ASP.NET con una de lasempresas patrocinadoras durante unaño. Suscripción gratuita a una de lasrevistas patrocinadoras durante un año.

• 2º premio: un juego para Xbox y unapelícula DVD. Un Visual Studio.NET 2003 Professional. Alojamientogratuito ASP.NET con una de lasempresas patrocinadoras durante unaño. Suscripción gratuita a una de lasrevistas patrocinadoras durante un año.

• 3er premio: una película DVD. UnVisual Basic .NET 2003 Standard.Suscripción gratuita a una de las revis-tas patrocinadoras durante un año.

Requisitos técnicos• 100% código manejado. El código

del servidor estará implementado100% en código manejado .NET, per-mitiéndose el uso de cualquier len-guaje para su generación. Se podrá uti-lizar cualquier versión del .NETFramework (1.0 o 1.1). No existen res-tricciones en el uso de técnicas de code-behind en las páginas ASP.NET, y pue-den incluirse también controles olibrerías externas, siempre que se pro-porcione el código fuente de las mis-mas y éste sea también .NET.

• Herramientas de desarrollo. No esobligatorio el uso de una herramien-ta de desarrollo. Si se desea utilizaruna, se podrá elegir entre cualquierade las existentes, como WebMatrix oVisual Studio .NET 2002 / 2003.

• Acceso a datos. La aplicación servi-dora no tendrá disponible ningunabase de datos como SQL Server oAccess, pero se podrán utilizar fiche-ros auxiliares de texto o XML paraalmacenar información persistente.

• Código cliente. No se utilizarán com-ponentes en cliente que el usuario debadescargar, del tipo ActiveX o similares.El HTML generado por la aplicaciónweb puede utilizar cualquier tecnolo-gía presente en Internet Explorer 6:

–HTML y DHTML–Hojas de estilo CSS–Scripting–Data Binding–ComportamientosPara más información:

http://www.microsoft.com/spanish/msdn/concuasp.

<<

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

El plazo de

Page 56: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

dotN

etM

anía

<<

56

dnm.opensource<<

Un framework en .NET: datnet

es una especie de plantilla que nos sirvecomo punto de partida para crear nuestra aplicación.Los frameworks se basan en la idea de “Trabaja sólouna vez y reutiliza, aunque la primera vez tardes unpoco más”. Hay varios tipos de frameworks pensadospara aplicaciones con distintos objetivos. Los máscomunes son los frameworks para la construcción deaplicaciones distribuidas, pues es esta arquitectura laque puede englobar mayor tipo de situaciones y ser-vir para un mayor número de usos.

El framework ideal sería, en mi opinión, aquel quete permita solamente preocuparte de desarrollar lalógica de negocio y la interfaz de usuario, sin tener encuenta pormenores relativos a la plataforma o de si lacapa de acceso a datos está en el mismo equipo o enun servidor de Hong Kong. Y que, por descontado,nos permita cambiar de un tipo de aplicación Web aotra tipo Windows o a una para un smartPhone, sintener que desarrollar una sola línea de código adicio-nal. ¡Ah!, y su tiempo de aprendizaje tiene que ser de2 a 3 horas máximo.

Hay numerosos frameworks en Java, como elarchiconocido struts, que implementa el patrón MVC(Model View Controller) y que se usa sobre todo paraconstruir aplicaciones Web, y me consta que es utili-zado en muchos entornos profesionales.

La comunidad .NET es algo más joven que la deJava y aún presenta pocas alternativas en esta mate-ria, aunque poco a poco se empiezan a ver sus frutosy Microsoft va ‘soltando’ herramientas con códigolibre, como los Application Blocks, que aunque no sonframeworks 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únestá en fase de desarrollo, el proyecto es bastantemaduro y puede utilizarse perfectamente para nues-tro trabajo cotidiano, aunque al principio tendríamosque pelearnos un poco con la instalación para “echar-lo a andar”, pues la documentación y los tutorialesescasean en este proyecto. Echo de menos una guíade iniciación o Quick Tour.

Su arquitectura se basa en el uso de .NETRemoting, Web Services, independencia del origen dedatos,… y en patrones de diseño bien conocidos, comoFaçade, Command, Controller o MVC.

A continuación vamos a comentar brevemente laarquitectura de una aplicación basada en datnet:

Los clientes (formularios Windows, páginas ASP,Smart Devices, etc...) se comunican con un Controller,un Command o un Business Logic:

a. Controller: Controla el flujo de la aplicación,encargándose de hacer las llamadas pertinentesa la lógica de negocio y manteniendo el estado.

b. Command: Cada comando se corresponde conuna acción o caso determinado que puede rea-lizar el usuario en la interfaz grafica.

c. Business Logic: Capa común con las clases repre-sentativas del mundo real o lógica de negocio.

<<Un framework

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 ynos provee una base útil para reutilizar en todos nuestros trabajos, pues mejorque mejor

Fernando Nogueras

Page 57: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

noticias.noticias.noticias.noticias

RocketInfo, un proveedor de soluciones de búsque-da y contenido de noticias ha anunciado el lanzamientodel Rocketinfo RSS Reader, un lector RSS basado en laWeb que provee acceso a las noticias y a la informacióndesde fuentes RSS, Atom y Weblogs, incluyendo la basede datos de noticias de Rocketnews.

El lector RSS Rocketinfo Reader aprovecha las ven-tajas de la creciente popularidad de RSS y Atom para daracceso actualizado a las noticias de cientos de fuentestales como CNN, la BBC, CNET y el New York Times.Los usuarios pueden seguir y leer las últimas noticias detodos ellos desde sus fuentes favoritas. Construido bajola experiencia de la compañía en tecnologías de búsquedaen background, el Rocket RSS Reader también ofrecela habilidad de crear búsquedas a través de palabras cla-ve y guardarlas como canales RSS o grupos de noticias.El lector hace fácil encontrar fuentes RSS o añadir fuen-tes de noticias o weblog que estén disponibles en cual-quier versión de RSS o Atom.

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

• Cuenta privada gratuita• Sin desacargarse software• Cientos de fuentes RSS, Atom y Weblog• Cree sus canales RSS con sus propias palabras cla-

ve • Suscripciones a grupos de noticias• Soporte de RSS 0.91, 1.0, 2.0 y Atom

Plataformas soportadas

• Todos los sistemas operativos con un exploradorcompatible

• Internet Explorer 4 o superior• Netscape 6.0 o superior• Mac Safari• Opera 7.11+• Konqueror 3.0+ (Linux)

Si quiere saber algo más sobre RSS puede ver elartículo “Intercambiando contenidos en RSS conASP.NET” de Jorge Serrano, en el número 1 dedotNetManía.

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

Se utiliza el gateway para establecerla comunicación entre uno de los obje-tos explicados anteriormente y la lógi-ca del servidor, utilizando unos objetosespeciales llamados DTO que encapsu-lan la información a enviar.

El gateway llama al Remote Servicedirectamente o bien, opcionalmente, através de un servicio web (ServiceDipatcher).

El Remote Service se encarga de verque mensaje le llega y de generar la lla-mada a los métodos correctos de la lógi-ca del servidor (Server Logic).

Una de las características más atrac-tivas de datnet es que es un frameworkbastante extensible, esto es debido a queestá bien modularizado de forma lógi-ca y podemos añadir o quitar partes que

no nos interesen para adaptarlo a nues-tros requerimientos. Por ejemplo,podemos utilizar el Microsoft UserInterface Application Block para contro-lar el flujo de nuestra aplicación y lla-mar a los objetos Command a través deél o simplemente crear nosotros mis-mos la interfaz de usuario y que esta seocupe de llamar a los Commands.

En la página del proyecto podemosconsultar documentación más extensasobre la arquitectura y algunos diagra-mas de secuencia que nos aclararán elfuncionamiento de la misma, mostran-do la secuencia que se produce cuandose hace una llamada al sistema.

Datnet es una buena base para aden-trarse en el mundo de los frameworksen .NET, que a buen seguro veremos

aumentar su cuantía en los próximosmeses. Aprovecho para instar al lectora que se baje la última versión, la insta-le y se pelee con su código. DesdedotNetManía seguiremos prestandoespecial atención a proyectos como ésteque hacen más fácil la vida al progra-mador, y pedimos a los participantes deestos proyectos que se esmeren en haceruna documentación fácil y completa delproyecto, para que todo su esfuerzo sevea recompensado y la comunidad deprogramadores no se aburra al intentarutilizarlo, por ser demasiado complejasu puesta en marcha.

Página del proyecto: http://datnet.sourceforge.net/

Desde aquí puedes bajar los fuentes:http://sourceforge.net/projects/datnet

dotN

etM

anía

<<

57

opensource<<

Rocketinfo combina búsqueda avanzada y tecnología de aplicabilidad con el emergente formatoRSS en una potente heramienta de contenidos.

Page 58: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve

dotN

etM

anía

<<

58

Usuario y Password no son suficientes: según se comen-tó en la pasada RSA Security Conference (http://infor-mationweek.securitypipeline. com/news/18201171) sobreseguridad, las viejas formas de autenticar están empe-zando a mostrar debilidades que debieran de ser supera-das mediante nuevas tecnologías. La solución podría estaren tarjetas inteligentes: Smart Cards (pequeños disposi-tivos que se pueden “pinchar” en un ordenador y quegarantizan la identidad de éste). Empresas como RSASecurity Inc y VeriSign Inc, colaboran con Microsoft en

la búsqueda de soluciones que van, desde las passwordstemporales (que solo duran 60 segundos y son generadaspor el sistema), hasta la autenticación federada vía Internet.

¿Cuánta información nuestra o de nuestras compañíashay en Google?

Esa es la pregunta que se hace Scott Granemann, que hahecho pruebas concluyentes al respecto, según podemosleer en su artículo “The perils of Googling”, publicadoen The Register: http://www.theregister.co.uk/content/55/36142.html. Granemann se pregunta hasta dónde sepuede llegar con páginas como http://www.google.com/advanced_search (búsqueda avanzada). n

oti

cia

s.n

oti

cia

s

Interesante artículo de Brad Abrams acerca dePlatform/Invoke y la forma de llamarlo enC# (http://blogs.msdn.com/brada/archive/2004/02/28/81586.aspx).

Escuela Murciana de .NET: Llamamos así a 3sitios Web de primera calidad regidos por 3colaboradores de DotNetManía: MiguelEgea, Salvador Ramos y Eladio Rincón (pororden alfabético).

Sitio Web de Miguel Egea:Colaborador de variasrevistas, ponente habitualen muchos congresos yeventos Microsoft, Miguel lleva ya años alfrente de este estupendo sitio:http://www.portalsql.com/

Sitio Web de Salvador Ramos:http://www.helpdna.net/ Asíduo colaborador

de varias revistas, y granconocedor de las bases dedatos, sus noticias y artícu-los son de lectura reco-mendada.

Sitio Web de Eladio Rincón(http://eladio.europe.webmatrixhosting.net/)

Excelente sitio especializadoen SQL-Server y su trata-miento desde la programa-

ción en .NET. Multitud de artículos y buenasreferencias.

Utilidades del mes

MZ-Tools 3.0: Software gratuito para versiones VB5, VB6 yVBA que añaden nuevas características que se echan demenos en el IDE: copiar y pegar controles con su códigoasociado, buscar procedimientos, adición automática degestores de error, conversión de ámbito de variables, etc.(disponible en http://www.mztools.com/)

SharpToolbox: Exhaustiva lista de utilidades para VisualStudio .NET agrupadas por categorías (dependiendo delos espacios de nombres). Las hay Freeware, Shareware ycomerciales. (http://sharptoolbox.madgeek.com/)

Internet Connection Speedometer: herramienta web paramedir la velocidad de la conexión a Internet (tiene unacuriosa interfaz gráfica). Accesible en http://promos.mcafee.com/speedometer/test_0150.asp

Blogs del mesDevHawk: http://www.devhawk.net muy buen sitio con una

lista impresionante de enlaces de calidad, además de artí-culos, trucos, etc.

DevDaysBloggers: http://devdaysbloggers.net sitio dedicado alRSS. Contiene herramientas, "aggregators", enlaces, etc.

NuDitAddIn: Sitio Web de Jamie Cansdale. Excelente, en cuan-to a trucos de código fuente en .NET y multitud de sugeren-cias interesantes. (http://weblogs.asp.net/nunitaddin)

IUnknown: Sitio Web de John Lam, con interesantes refle-xiones sobre el código fuente en .NET.(http://www.iunknown.com)

Martin Fowler: Similar al anterior, el Martin Fowler's Bliki(http://martinfowler.com/bliki) es un depósito de ideas sobredesarrollo.

dnm.desvan<<

documentos en la red

Marino Posadas

Page 59: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve
Page 60: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET … · 2011-04-22 · ¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo sirve