dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0...

60
WebParts en ASP.NET 2.0 (y III) • Servicios Web nativos con SQL Server 2005 • Detección de problemas de rendimiento en SQL Server 2000 y SQL Server 2005 (IV) • Acceso a datos con ADO.NET 2.0 (sin asistentes) dotNetManía nº28 julio-agosto 2006 • 6,50 (España) Visual Basic • C# • ASP.NET • ADO.NET • .NET Framework • Windows Server System dotNetManía www.dotnetmania.com Dedicada a los profesionales de la plataforma .NET

Transcript of dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0...

Page 1: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

WebParts en ASP.NET 2.0 (y III) •Servicios Web nativos con SQL

Server 2005 • Detección deproblemas de rendimiento en SQL

Server 2000 y SQL Server 2005(IV) • Acceso a datos con

ADO.NET 2.0 (sin asistentes)

dotNetManíanº

28 ju

lio-a

gosto

2006

• 6,

50 €

(Esp

aña)

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

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

Page 2: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos
Page 3: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

Bienvenido al número 28, de julio yagosto de 2006, de dotNetManía.

Entre los eventos Tech-Ed 2006 deBoston y MEDC Europe 2006 de Niza,este mes se han generado muchas e impor-tantes noticias, pero ninguna tan polémi-ca como la asignación del nombre comer-cial a la “suma” de .NET Framework 2.0y WinFX. Y todo porque le han puesto“.NET Framework 3.0”. A todas las per-sonas que yo he consultado les parece raroy confuso; y si leemos los comentarios queha generado la noticia (unos 400 solo en enel blog de S. “Soma” Somasegar) vemosque hay bastante consenso sobre el tema.Podrían haberle puesto un número inferioro podrían haber esperado a que aparecieseOrcas y así, tanto .NET Framework comolas librerías y el CLR tendrían la versión3.0, pero al parecer a alguien de marketingse le ocurrió que WinFX estaba añadien-do mucha confusión... Deberán darle unpremio, porque precisamente “confusión”es la palabra que más se está usando aho-ra. Aunque la verdad es que tampoco tie-ne mayor importancia, o eso es lo que amí me parece.

Este mes nos hemos cogido la male-ta y nos hemos ido a Boston conFrancisco González de Solid QualityLearning y a Niza con José LuisBalsera de Raona. Ambos se han estre-

nado este mes cubriendo el Tech-Ed yel MEDC, respectivamente; por talmotivo aprovecho para darles la bienve-nida. Igualmente, le doy la bienvenida aotro colaborador invitado, DavidPerona, que se estrena con su “ServiciosWeb nativos con SQL Server 2005”.

Este mes vuelve Marino Posadascon otra de sus excelentes entrevistas,esta vez a Arvindra Sehmi, la cabezavisible del Enterprise Team en MicrosoftCorp's Developer and Platform EvangelismGroup en EMEA.

José Manuel Alarcón termina consu estupenda serie de artículos sobreWepParts en ASP.NET 2.0 y EladioRincón nos envía el penúltimo de suinteresante serie sobre la detección deproblemas de rendimiento en SQLServer.

El artículo de portada este mes esnuevamente para la sección dnm.futu-ro, donde Octavio Hernández presentalas novedades de VB 9.0 para imple-mentar LINQ. Este tipo de contenidosquizá no se puedan aplicar a día de hoy,pero pienso que son necesarios para irpreparándonos para el nuevo .NETFramework ¿3.5? con el CLR ¿3.0? yC# ¿3.0? o VB ¿9.0?. Mejor de versio-nes no hablamos :-).

Y dentro hay más. Espero que le guste.

dotN

etM

anía

<<

3

.NET Framework 3.0

dotNetManíaDedicada a los profesionales de la plataforma .NET

Vol. III •Número 28 • Julio-Agosto 2006Precio: 6,50€

EditorPaco Marín

([email protected])

Atención al suscriptorPilar Pérez

([email protected])

Redactor JefeMarino Posadas

([email protected])

Consejo de RedacciónDino Esposito, Guillermo 'guille' Som, José

Manuel Alarcón, Lorenzo Ponte, LuisMiguel Blanco, Miguel Katrib (Grupo

Weboo) y Octavio Hernández

Colaboradores habitualesAntonio Quirós, Braulio Díez, Carlos

Quintero, Eladio Rincón, Javier Aragonés,Jorge Serrano, José Miguel Torres, Iván

González, Pepe Hevia, Salvador Ramos ySergio Vázquez

Además colaboran en este númeroDavid Perona, Francisco A. González, José

Luis Balsera

IlustracionesYamil Hernández

Edición, suscripciones y publicidad.netalia

c/ Robledal, 13528529 Rivas-Vaciamadrid (Madrid)

www.dotnetmania.com

Tf. (34) 91 666 74 77Fax (34) 91 499 13 64

ImprimeColor Digital

ISSN1698-5451

Depósito LegalM-3.075-2004

>>

<<

dnm.editorial

Paco Marín

Page 4: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

28dnm.sumario

dnm

.sum

ario

MEDC Europe 2006 08-09

Tech-Ed Boston 2006 10-11

Entrevista a Arvindra Sehmi 12-14Nuestro entrevistado de hoy es la cabeza visible del Enterprise Team en MicrosoftCorp's Developer and Platform Evangelism Group en Europa, Oriente Medio yÁfrica (EMEA) y su trabajo se focaliza hacia la adopción de las mejores prácticasdentro de la comunidad de arquitectos de EMEA.

WebParts en ASP.NET 2.0 (III) 16-20Con este artículo finalizamos la serie sobre WebParts comenzada hace dos números endotNetManía. En él trataremos algunos conceptos avanzados sobre bloques personalizablesque nos permitirán llegar a un buen nivel en el desarrollo de este tipo de aplicaciones. Enconcreto, veremos cómo intercambiar información entre ellos y cómo exportarlos para sureutilización.

Lo que nos traerá Orcas:VB 9.0 y LINQ 22-29Este artículo presenta las novedades que incluirá (probablemente con algunas variaciones)Visual Basic 9.0, incluyendo la sintaxis de las expresiones de consulta, que constituyen elprincipal reflejo en el lenguaje de la tecnología LINQ, y las extensiones para el soportedirecto de XML.

Servicios Web nativos con SQL Server 2005 30-35Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientosalmacenados como las UDF de nuestra base de datos sin tener que usar ninguna otraherramienta ni abrir puertos TCP para SQL Server 2005.

Detección de problemas de rendimiento en SQL Server 2000 y SQL Server 2005 (IV) 36-39

En esta cuarta entrega nos vamos a centrar en analizar qué tipo de información hayalmacenada en la memoria de SQL Server, división del uso de la memoria y cómodetectar bloqueos con las nuevas DMV de SQL Server 2005.

Acceso a datos con ADO.NET 2.0 (sin asistentes) 41-46Tal como comentamos en el número anterior, en esta ocasión vamos a ver cómo podemosacceder a una base de datos usando única y exclusivamente código, es decir, sin usar losasistentes que Visual Studio 2005 pone a nuestra disposición y que, en honor a la verdad, amuchos les facilitará la tarea de crear aplicaciones ADO.NET de una forma bastante sencilla.

dnm.todotnet.qaInformes, autenticación y actualización por lotes 47-49

Esta semana, la primera de las 3 preguntas de rigor resuelve problemas relacionadoscon Reporting en ASP.NET. Otras preguntas se centran en la autenticación porInternet y las actualizaciones por lotes en ADO.NET.

dnm.laboratorioFileHelpers 50-51

Es relativamente frecuente que el trasvase de información desde/hacia una aplicación serealice mediante archivos planos generados periódicamente. En tales ficheros, los registrosse almacenan en líneas de texto que deben ser interpretadas para su posterior explotación.En el laboratorio de esta semana analizamos una librería que permite importar, expor-tar y explotar con gran comodidad archivos de este tipo en aplicaciones .NET.

dnm.comunidad.net 52-54Eventos localesEmprendia. La iniciativa para los e-mprendedores

dnm.biblioteca.net 55Programming Microsoft ASP.NET 2.0 Core ReferenceVisual C# 2005: A Developer's Notebook

dnm.desvan 58

Page 5: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos
Page 6: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

dotN

etM

anía

<<

6

dnm.noticias<<n

oti

cia

s.n

oti

cia

s.n

oti

cia

s.n

oti

cia

s.n

oti

cia

s.n

oti

cia

s.NET Framework 3.0

Además de esto, Infocard tambiénha sido bautizado y a partir de aho-ra se llamará Windows CardSpace ytambién le conoceremos por sussiglas WCS.

Así, las tecnologías que incluíanWinFX hasta el momento: WindowsPresentation Foundation (WPF),Windows Communication Foundation(WCF), Windows Workflow Foundation(WF) y Windows CardSpace (WCS)se suman a .NET Framework 2.0para convertirse finalmente en.NET Framework 3.0.

Sin embargo, las tecnologías ante-riores como ADO.NET, ASP.NET,WinForms y el propio CLR o lasBCL, no cambian y seguirán en su ver-sión 2.0 como actualmente. Esto sig-nifica que, aunque pudiera parecerlopor el cambio de versión principal del.NET Framework, no hay cambiossobre lo antiguo y podemos seguir tra-bajando con los compiladores y las téc-nicas actuales como hasta ahora.

.NET Framework 3.0 verá laluz con la salida de Windows Vistay estará disponible también paraWindows XP y Windows Server2003, tal y como estaba pensado.Ahora .NET Framework 3.0 ver-sión CTP de junio ya está dispo-

nible para su descarga pública en:http://www.microsoft.com/downloads/details.aspx?FamilyId=8D09697E-4868-4D8D-A4CF-9B82A2AE542D.

Esto ha creado cierta confusión enla comunidad de desarrolladores, yaque la versión 3.0 está construida sobrela versión 2.0 de .NET Framework.Parecía obvio que WinFX tendría quesumarse a .NET Framework, pero lamayoría pensábamos –equivocada-mente, por lo que se ve– que WinFXse integraría en el .NET Frameworkcon la aparición de lo que a día de hoyllamamos Orcas y que además añadi-ría LINQ, pasando a llamarse, enton-ces sí, .NET Framework 3.0. Sinembargo, ahora lo que sabemos es quecuando aparezca Orcas, el número de.NET Framework será el 3.5, mien-tras que la versión del CLR será paraentonces la 3.0.

Asimismo, Somasegar anunció queDLinq pasará a llamarse LINQ to SQLmientras que XLinq se llamará LINQto XML. El esquema general de nom-bres para LINQ es el siguiente:

LINQ para ADO.NET, el cualincluye:

LINQ to DataSetLINQ to EntitiesLINQ to SQL

El soporte de LINQ para otrostipos de datos incluye:

LINQ to XML LINQ to Objects

Más información en el blog de S.“Soma” Somasegar en http://blogs.msdn.com/somasegar, en el sitio deMSDN en http://msdn.microsoft.com/winfx, o en los nuevos sitios dehttp://www.netfx3.com.

A principios del pasado mes de Junio,S.“Soma” Somasegar,corporate vice president de la Developer Divisionde Microsoft,anunció la decisión de Microsoft de ponerle nombre comercial a WinFX: .NET Framework 3.0.

S. “Soma” Somasegar es corporate vice president of the DeveloperDivision at Microsoft Corporation. Esta división es responsable detodos los lenguajes de programación, herramientas y plataformasen Microsoft, incluyendo Visual Studio, Web Platform and Tools,.NET Framework, CLR y otras tecnologías de la plataforma dedesarrollo .NET. Además supervisa el India Develpment Center(IDC) en Hyderabad, India.

Somasegar comparte frecuentemente sus pensamientos con los desarrolladores através de su blog en: http://blogs.msdn.com/somasegar.

Microsoft ha anunciado la dispo-nibilidad del Programa de Evaluaciónde Windows Vista Beta 2 para clientes,pensado especialmente para aquellosdesarrolladores y profesionales de TIque no disponen de suscripción aMSDN y TechNet, pero que deseanrecibir la beta 2 del próximo sistemaoperativo de la compañía y disfrutarde sus múltiples escenarios.

Los profesionales inscritos en esteprograma podrán acceder a la beta 2de Windows Vista a través de la des-

carga gratuita de la Web de la compa-ñía o recibir el producto en DVD,mediante el pago de los costes de pro-ducción y distribución.

Todos los detalles sobre la descar-ga de la beta 2 de Windows Vista seencuentran en http://www.microsoft.com/spain/windowsvista donde los usua-rios también disponen de la versiónbeta del asesor de actualizacionesWindows Vista Upgrade Advisor, laherramienta de software de diagnós-tico que les ayudará a elegir la edición

de Windows Vista más adecuada a susnecesidades, así como a conocer si susequipos son capaces de soportar lascaracterísticas del nuevo SO.

Una vez instalada la beta 2 deWindows Vista, los usuarios dispo-nen de una guía de producto detalla-da para profesionales de TI y desa-rrolladores, programa antivirus paraproteger sus equipos, así como infor-mación acerca de todas las versionesdel nuevo sistema operativo, blogs,artículos técnicos, etc.

Microsoft libera públicamente la beta 2 de Windows Vista

Page 7: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

El tema central del Borland Day2006 ha sido la “Optimización delDesarrollo de Software” (SoftwareDevelopment Optimization – SDO) ylos diferentes ponentes han demostra-do diversas maneras de alcanzar esteobjetivo mediante casos reales y ejem-plos de las mejores prácticas del desa-rrollo de software. Asimismo, y con elmismo objetivo, se han presentadonuevas soluciones específicas para elgobierno y la gestión de las TI, la ges-tión con calidad del ciclo de vida, ladefinición y gestión de requisitos y lagestión del cambio.

Una de las temáticas más seguidaseste año, ha sido CMMI (CapabilityMaturity Models Integration), donde Bor-land ha mostrado como sus implemen-

taciones y for-mación en estametodología deprocesos, estánmejorando eldesarrollo deaplicaciones.

A d e m á s ,han participadocomo ponen-tes, dando unvalor mayor alevento y com-plementando las soluciones deBorland, las siguientes compañías:Aventia, Coritel, EDS, Microsoft,Oracle, Sogeti, Sun y MTP. Tambiénhan sido patrocinadores el Club-BPM,HP, Intel y TAISA.

dnm.noticias

dnm.noticias

dotN

etM

anía

<<

7

Bill Curtis, director deprocesos de Borland

Más de 250 participantes se dan citan enla 3ª edición del Borland DayBill Curtis,director de procesos de Borland,exhorta a los asistentes a centrarseen la gestión del ciclo de vida de las aplicaciones como la mejor manera deconseguir el éxito en el desarrollo de las aplicaciones.

Microsoft ha iniciado un concursointernacional para incorporar a su ser-vicio de mensajería instantánea MSNMessenger (próximamente WindowsLive Messenger) nuevas funciones queofrezcan prestaciones complementa-rias a sus más de 205 millones de usua-rios en todo el mundo. Esta iniciativaestá dirigida a desarrolladores de soft-ware y tiene como objetivo crear robotsinteligentes que integrados dentro delprograma de mensajería instantáneaproporcionen de forma automática e

interactiva respuestas e información alos usuarios, como si de una personareal se tratara.

Los creadores de los robots más úti-les e imaginativos obtendrán hasta 40.000dólares en premios, mientras que todaslas propuestas aceptadas estarán disponi-bles en http://www.robotinvaders.com.

Los desarrolladores tienen a su dispo-sición en el centro de recursos deWindows Live (http://www.msdn.com/live)todas las herramientas , tecnologías y guíanecesarias para poder participar.

Los robots de MSN invaden el mundoWindows Communication FoundationRSS Toolkit

Este toolkit, que viene con todo el códi-go fuente, ilustra como exponer feeds ATOMy RSS a través de WCF endpoints. Descargardesde http://wcf.netfx3.com/files/folders/enco-ders/entry3262.aspx.

Creative Commons Add-in paraMicrosoft Office

Microsoft y CC se han asociado con lafinalidad de realizar una herramienta de licen-cia de copyright que permita una fácil adiciónde la información de licencia de CC para quese pueda trabajar con ella a través de MSOffice. Disponible gratis en http://office.micro-soft.com y de http://www.creativecommons.org.

Nuevos planes para WinFSNo habrá beta 2 de WinFS y no aparece-

rá en solitario. Se rumorea que quizá lo hagaen 2007-2008 con Katmai, la nueva versión deSQL Server. Ver en: http://blogs.msdn.com/winfs.

Liberada la edición CTP de SQL Server2005 Everywhere Edition

Es la próxima versión de SQL Server2005 Mobile Edition. Más información en:http://www.microsoft.com/sql/ctp_sqleverywhe-re.mspx.

Además...

En el Tech-Ed 2006 se anunció unconcurso que pretende animar a los desa-rrolladores y arquitectos de software apresentar un diseño para una aplicaciónempresarial de Office que favorezca a unaorganización benéfica de su elección. Losganadores pueden recibir una financia-ción de 150.000$ en efectivo, además deotros premios para hacer realidad sus ide-as. Más en: www.developwithoutborders.com.

Concurso para desarro-lladores sin fronteras Coincidiendo con el Día Mundial del

Refugiado, ACNUR y Microsoft preten-den atraer la atención sobre la situaciónactual de los niños refugiados en todo elmundo. A través de su red de serviciosonline MSN, Microsoft proporcionarásoporte a la campaña a través de visibili-dad publicitaria y contenido editorial ensus portales y servicios, y con alojamien-to y traducción a 9 idiomas de la Webwww.ninemillion.org.

Programa ninemillion.org

Microsoft ha presentado en laRoboBusiness Conference and Exposition2006, la primera CTP de MicrosoftRobotics Studio, la plataforma de desa-rrollo de robótica integrada y destina-da a las academias, aficionados y desa-rrolladores comerciales, que servirá paracrear aplicaciones robóticas.

Microsoft Robotics Studio incluyeuna herramienta de programación visualque facilita la creación y utilización deaplicaciones para robots. Permite a losdesarrolladores generar servicios modu-lares para hardware y software, permi-tiendo a los usuarios interactuar con losrobots a través de interfaces basadas en laWeb o en Windows. Por supuesto, pue-den extenderse funcionalidades desarro-llando con cualquiera de los lenguajes dela plataforma .NET.

Más información y descargas en:http://msdn.microsoft.com/robotics.

Primera CTP de MicrosoftRobotics Studio

Page 8: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

MEDC Europe 2006Del 6 al 8 de junio se celebró en la ciudad francesa de Niza la Microsoft Mobile andEmbedded DevCon 2006 Europe, la conferencia para desarrolladores de sistemas yaplicaciones para dispositivos móviles e incrustados que Microsoft organiza, en diver-sos lugares del mundo,para dar a conocer las novedades que se producen en este cam-po de la mano de los propios responsables de su diseño e implementación.El lema deeste año fue “Avivar el conocimiento.Acelerar el desarrollo”

agruparon en torno a 3 ejes: el desarrollo parala plataforma Windows Embedded, el desarrollo deaplicaciones para Windows Mobile y la movilizaciónde negocios usando tecnologías Microsoft. También seofreció la posibilidad de “tocar” código mediante prác-ticas en laboratorio, bien siguiendo unos guiones, biensiguiendo las instrucciones de algún experto, sobre variosde los temas que se trataron durante las conferencias.

Durante la sesión de presentación, Todd Warren, vice-presidente corporativo de la división de dispositivos móvi-les e incrustados, hizo un balance positivo de la evoluciónde la tecnología y del mercado anunciando que su grupofue el de mayor crecimiento para la compañía de Redmond,con un incremento del 40% anual durante ocho trimestresconsecutivos. Entre los casos de éxito comentados, todospertenecientes a empresas europeas, apareció el desplieguede dispositivos basados en Windows Mobile que hizoCorreos recientemente. Lo más destacable, aparte de lasnovedades que comentaremos a continuación, fue la hojade ruta para el lanzamiento de las nuevas versiones de lossistemas: tanto los sistemas incrustados (CE y XPEmbedded) como Windows Mobile tendrán ciclos de 18a 24 meses, con entregas de Feature Packs intermedias queofrecerán mejoras e incorporarán nuevas funcionalidades.Por ejemplo, este año aparecerá Windows CE 6.0 y elpróximo año se lanzará un feature pack con las actualiza-ciones que se desarrollen en ese intervalo. Lo mismo suce-derá con Windows Mobile, pero cabe destacar que lasactualizaciones de este sistema coincidirán, además, con lasde las herramientas para Visual Studio 2005.

En sintonía con la planificación expuesta este año toca-ba explicar, principalmente, novedades para sistemasincrustados. Como decíamos, se presentó la versión betade Windows CE 6.0, que tiene previsto su lanzamientodefinitivo durante el último trimestre de este año. En estaocasión el sistema ha visto totalmente remodelado su

núcleo para dar respuesta a las necesidades que ya se estánplanteando y, sobre todo, a las necesidades futuras. Porfin se ha podido superar el límite de los 32 procesossimultáneos y la restricción a 32 MB del espacio de memo-ria virtual de cada uno de ellos. Los nuevos límites sesitúan en 32.768 procesos y 2 GB de memoria sin unaumento notable de los requisitos del sistema (300 KB esahora el tamaño mínimo, frente a los 200 KB en WindowsCE 5.0), lo que no se debe a que se prevea que aparezcandispositivos con tales requerimientos sino, como humorís-ticamente comentó Mike Hall, senior technical productmanager de Windows Embedded, para poder soportar elproceso número 33 que insistentemente los desarrolla-dores les pedían. También ha habido cambios en la modu-larización del sistema. Ahora podrán ejecutarse contro-ladores en el espacio del núcleo con la finalidad de dis-minuir el coste de los cambios de contexto, e inclusopodrán tener acceso a la interfaz de usuario. Obviamente,también existirá la posibilidad de restringir controlado-res a un espacio de ejecución aislado, en contexto de usua-rio, para no perjudicar al resto del sistema. Otro cambioimportante es el de la separación física entre el kernel y lacapa que expone el hardware del dispositivo (OEMAdaptation Layer), lo que permitirá cambiar el hardwaresin tener que modificar el diseño del sistema. Otras nove-dades destacables serán la mejora de los mecanismos deseguridad y el soporte para archivos y volúmenes gran-des mediante el sistema exFAT. Por último, aunque nomenos importante, la herramienta principal para el diseñode sistemas, el Platform Builder, se ha incorporado aVisual Studio 2005. Esto, además de permitir un trabajomás productivo con el catálogo de componentes, ha per-mitido incorporar herramientas gráficas para las tareasmás comunes, introducir Intellisense en otras y aprovechartodas las características del entorno de Visual Studio, comopuede ser el control de código fuente.

José Luis Balsera

dnm.directo.eventos

José Luis Balsera esIngeniero Senior deSoftware en Raona

(www.raona.com), dondetrabaja como

desarrollador, arquitectoy formador en

tecnologías .NET. JoséLuis está especializado

en el desarrollo deaplicaciones móviles

usando .NET CompactFramework y

smart clients

<< Las sesiones se

Page 9: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

La otra estrella en el apartado de siste-mas operativos fue el .NET MicroFramework. Lo que empezó siendo el meca-nismo que controlaba los relojes tipo SPOT(MSN Direct) está evolucionando en un sis-tema operativo dirigido a pequeños disposi-tivos como sensores, actuadores, monitorescorporales para la atención médica, automa-tización del hogar, controles remotos, etc.Durante la conferencia, se presentó comonovedad que aún no ha alcanzado ni el esta-dio de beta, por lo cual no hay ninguna cer-teza sobre las características de la versión final,ni sobre cuándo estará disponible.Simplificando los términos, se habló del.NET Micro Framework como un CLR“bootable”, es decir, el CLR inicia el siste-ma, gestiona los procesos, las interrupciones,la memoria, etc.; incluso los controladoresde dispositivos se pueden escribir en C#.Actualmente funciona sobre procesadoresARM7 y ARM9, con requerimientos tanbajos como 27MHz, 384KB de RAM y 1MB de ROM. En realidad, el tamaño útilmínimo del sistema es de 250 KB de ROMy 70 KB de memoria RAM, sin necesidad deMMU. En cuanto a su funcionalidad, cabedestacar que, aparte de las características bási-cas de .NET (excepciones, delegates, garbagecollection, etc.), cuenta con los espacios denombres fundamentales de la biblioteca declases, como pueden ser System.Collections, System.Threading o System.Reflection. En algunos casos se han hecho modi-ficaciones en la implementación (p. ej., datosmás compactados en System.Runtime.Serialization) o se ha tenido que modifi-car ligeramente las interfaces de las clases.La principal diferencia con el resto de imple-mentaciones del CLR es que, por razones deespacio, el código no se compila just-in-time

sino que es interpretado. Microsoft orientael sistema a situaciones que no requierenmucha capacidad de cálculo, aunque sí robus-tez y fiabilidad, sincronización de datos einterfaz gráfica de usuario rica pero con inte-racción limitada. Las primeras aplicacionesreales las veremos en los portátiles que sopor-ten el SideShow de Windows Vista y en con-troles remotos para Windows Media Center.

Las sesiones dedicadas al desarrollo deaplicaciones, tanto nativas como para .NETFramework, estuvieron claramente enfoca-das a profundizar en las técnicas para la adap-tación al dispositivo, mejorar el rendimien-to y aprovechar mejor las Managed APIintroducidas con la versión 2 del Compact

Framework. Como novedad más destaca-ble en este ámbito, el equipo de Patterns &Practices presentó la Software Factory forMobile Clients, que consiste en un con-junto de aplicaciones de referencia, patro-nes, application blocks, how to’s, documenta-ción, etc., que tienen por objetivo propor-cionar un entorno de desarrollo y un cono-cimiento de buenas prácticas para el desa-rrollo de aplicaciones móviles. Entre los blo-ques reutilizables incluidos merece la penamencionar el Mobile Composite UI (para cons-truir interfaces de usuario modulares), elData Subscription Block (para la sincroniza-ción de datos con SQL Server), el

Disconnected Service Agent (para la invoca-ción de Web Services en escenarios de cone-xión intermitente) y el Orientation AwareControl (para la adaptación de la interfaz deusuario a los diversos formatos de pantallaexistentes). La versión presentada, que yaestá disponible en GotDotNet solo paraPocket PC, aún no es la definitiva aunquese espera que aparezca en unos dos meses.

En el ámbito de acceso a datos, se pre-sentó SQL Server Everywhere, la nuevaedición de SQL Server para dispositivosmóviles, que en esta ocasión vendrá acom-pañada por versiones compatibles para elentorno PC.

Las sesiones contaron con una buenaasistencia en general y bastante participa-ción en los turnos de preguntas. Cabe des-tacar también la total colaboración de lamayoría de los conferenciantes en este aspec-to. Las respuestas se pudieron buscar tam-bién en las charlas con los expertos que seorganizaron en el pabellón de Microsoft.

Por último, destacaremos la sesión máscelebrada y divertida de las tres jornadas: lacompetición de los Sumo Robots. Lospequeños robots gobernados por el .NETMicro Framework se entregaron a los gru-pos de asistentes que los solicitaron el pri-mer día. Éstos pudieron asistir a una sesiónpráctica que les proporcionó los conoci-mientos básicos para programarlos. Con

esto, una buena colaboración del equipo del.NET Micro Framework y toda la estrate-gia de la que supieron dotar a sus algorit-mos, los participantes proporcionaron unabuena diversión al público con sus “com-bates”. Al final, de entre los 14 equipos, losrepresentantes de una empresa austriaca sealzaron con la victoria.

El concurso puso prácticamente el bro-che final a 3 días de sesiones, charlas infor-males, ejercicios prácticos y demostracio-nes que los más de 450 asistentes y 27 expo-sitores pudieron compartir en una confe-rencia bien organizada y que esperemosvuelva a Europa en próximas ocasiones.

Se presentó el .NET Micro Framework como un CLR “bootable”

dotN

etM

anía

<<

9

dnm.directo.eventos<<

Todd Warren, Corporate Vice President Mobile and Embedded Devices Product Group

Page 10: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

Tech-Ed Boston 2006

Entre el 11 y el 16 de junio se celebró la decimocuarta edición de Microsoft Tech-Ed,esta vez, en Boston, en el estado de Massachussets, sede de las prestigiosas universi-dades Harvard y el MIT (Massachussets Institute of Technology). El Tech-Ed es el mayorevento a nivel mundial para desarrolladores de software de tecnologías Microsoft.

excelente, más de 12.000 personas,Microsoft y sus “diamantes” (MVP, partners, MCT,regional directors, etc…) mostraron la utilización de losproductos al más alto nivel así como sus experienciasen la vida real.

El show comenzó el domingo por la noche con lakeynote, donde se lamentó la ausencia de Bill Gateso Steve Ballmer. Bob Muglia (Senior Vice President),Ray Ozzie (Chief Technical Officer) y ChrisCapossella (Corporate Vice President) enfocaron prin-cipalmente en la necesidad de capacitar y reconocera los profesionales de la informática. Con eslóganescomo “Power to the pros” (poder para los profesio-nales), “Do more with more” (Haz más con más) y“People Ready” (personal preparado) se mostró elcompromiso de Microsoft de capacitar a los profe-sionales con las herramientas necesarias para afron-tar los problemas de ahora y del futuro. El glamourde la keynote lo ofreció la actriz de la serie nortea-mericana 24 Horas, Mary Lynn Rajskub que, conhumor, continuó enfatizando la importancia del per-sonal IT en las organizaciones.

En total hubo más de 1.000 sesiones en sus dis-tintas modalidades. Sesiones formales, grupos de dis-cusión, desayunos y cenas de trabajo, laboratoriostutorizados y un sinfín de actividades. Alrededor detodas estas actividades estaba la feria con las princi-

pales empresas dela industria comoHP, ORACLE,IBM, EMC2... Laestrella de todo elevento ha sido el TLC (Technical Learning Centre).Estos miniespacios estaban formados por una serie demesas de trabajo y stands con máquinas y softwarepreinstalado para que cualquiera pudiera dirigirse alos líderes de desarrollo y managers de los distintosproductos de Microsoft así como a MVP, autores delibros, y expertos reconocidos por Microsoft en laindustria.

Las sesiones estuvieron agrupadas en distintas tec-nologías donde podemos destacar:• Inteligencia de Negocio: donde se trataron temas

relacionados con SQL Server 2005 (IntegrationServices, Analysis Services y Reporting Services),Bussiness Scorecard Manager 2005, Office 2007,Excel y SharePoint Portal Server.

• Sistemas Conectados: Las aplicaciones actualmenteno pueden estar en el contexto de una sola máquinao proceso y deben comunicarse con ambientes hete-rogéneos, exponiendo la problemática que esto con-lleva. Se vieron aplicaciones como WindowsCommunications Foundation, Windows WorkflowFoundation, Windows CardSpace (WCS) (antes

InfoCard), WSE, .NET EnterpriseServices, MSMQ, .NET Remoting, SystemTransactions, ASP.NET Web Services,BizTalk Server, Commerce Server, HostIntegration Server.• Desarrollo y Administración de

Bases de Datos: Mostrando las nue-vas características de SQL Server 2005:rendimiento, seguridad, diseño, esca-labilidad y productividad. SQL Server

Francisco A. González

dnm.directo.eventos

Francisco A.González Díaz trabaja

como Ingeniero deIntegración de SolidQuality Learning. Es

Ingeniero Superior enInformática por la

Universidad de Murcia.MCP en BizTalk Server.

<< Con una asistencia

Microsoft SQL Server 2005.Implementation and Maintenance, de SolidQuality Learning, uno de los MCTS Training Kit(en inglés) para preparar el examen 70-431, sepresentó en el Tech-Ed de Boston de este año,

como uno de los libros más vendidos.

Page 11: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

2005, ADO.NET, SQL Server2005 Express y SQLCLR fueronde gran interés en esta edición delTech-Ed.

• Herramientas para desarrolla-dores: donde se abarcó el ciclo dedesarrollo utilizando Visual StudioTeam System. Las herramientasdestacadas en este grupo fueron:Visual C#, Visual Basic, VisualStudio, Debugging, .NETFramework, 64-bit, CLR, VisualStudio Team System, WindowsForm, Smart Clients y WindowsMobile 5.0.

Estas no fueron las únicas líneas, puesse trataron todos los productos deMicrosoft relacionados con arquitectura,aplicaciones para negocios, Managementand Operations, mensajería y movilidad,Microsoft Application Platform,Microsoft IT, Office System, seguridad,soluciones verticales para la industria,desarrollo Web, Windows Client,Windows Server Infrastructure, etc.

Novedades

Durante el Tech-Ed fuimos testigosde bastantes novedades, no solo delanuncio de abandono del día a día, enel equipo de Microsoft, por parte de BillGates a mediados de 2008 dejando almando a Steve Ballmer, sino tambiénsupimos que en los próximos 16 mesestendremos nuevas versiones del top 3de los productos de Microsoft en ren-tabilidad y uso. Tendremos Office 2007,Windows Vista a principios de 2007 yen otoño de 2007 llegará LonghornServer, el nuevo sistema operativo deservidor que reemplazará a WindowsServer 2003.

Otra de las novedades más reseña-bles es que Microsoft ha renombrado

su software en el apartado de seguridadcon un nuevo producto llamadoMicrosoft Forefront, que contieneMicrosoft Forefront Client Security(actualmente Microsoft Antigen forExchange), Microsoft ForefrontSecurity for SharePoint (actualmenteMicrosoft Antigen for SharePoint),Microsoft Antigen for InstantMessenger y Microsoft InternetSecurity & Acceleration Server 2006(servidor para la protección de amena-zas por Internet en las organizaciones)

Chris Capossela anunció la dispo-nibilidad Exchange Server 2007 Beta2 para finales de 2007. Alex Cobb anun-ció BizTalk Server 2006 R2 y un nue-vo paquete de adaptadores que se pre-sentarán próximamente.

En cuanto a High PerformanceComputing (HPC), Microsoft presentóComputer Cluster Server 2003, queresponde a la demanda para la ejecuciónde aplicaciones en paralelo o de gran con-sumo de recursos. Entre sus objetivosestán las aplicaciones científicas querequieran grandes cálculos o el procesa-miento de tareas de business intelligence.

Además, los asistentes pudimosobtener la primera edición CTP delVisual Studio Team Edition forDatabase Professionals, un nuevoproducto de la línea Team System(http://msdn.microsoft.com/vstudio/teamsystem/products/dbpro).

Durante esta semana, Tech-Ed hacreado un lugar para el intercambiode conocimiento, anuncios y debatessobre tecnología, con una gran canti-dad de personal de Microsoft y pro-fesionales de todo el mundo en unambiente internacional. Próxima cita:Tech-Ed Europe en Barcelona a prin-cipios de noviembre. Les mantendre-mos informados.

En los próximos 16 meses tendremos nuevas versiones del top 3 de los productos de Microsoft en rentabilidad

y uso.Tendremos Office 2007,Windows Vista a principiosde 2007 y en otoño de 2007 llegará Longhorn Server

dotN

etM

anía

<<

11

dnm.directo.eventos<<

Alejandro Leguizamo, mentor de Solid Quality Learning en uno de los ChalkTalksobre minería de datos con SQL Server 2005 Analysis Services

En el TLC de SQL Server, con eleslogan “Always on Technologies”,Solid Quality Learning tuvo un papeldestacado.Un gran conjunto de susmentores impartió sesiones,demostraciones y presentó libros yproyectos junto con Microsoft.Además, tuvimos dos buenasnoticias: la primera es que supimosque el Training Kit sobre SQL Server2005 desarrollado por Solid QualityLearning y recién publicado está enla lista de más vendidos de Amazon;y la segunda es el reconocimiento aMauro Sant’Anna, uno de losmentores de Solid Quality Learning,como regional director del año.

Solid Quality Learning en el Tech-Ed de Boston

Page 12: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

Entrevista a Arvindra Sehmi

Nuestro entrevistado de hoy es la cabeza visible del Enterprise Team en MicrosoftCorp’s Developer and Platform Evangelism Group en Europa, Oriente Medio yÁfrica (EMEA) y su trabajo se focaliza hacia la adopción de las mejores prác-ticas dentro de la comunidad de arquitectos de EMEA.

presentación, ¿cuál es tulabor actual en Microsoft?

Pertenezco al grupo de Desarrollo y Plataformade Microsoft para Europa, Oriente Medio y África, ytengo a mi cargo el Enterprise Team de Arquitectura.Soy responsable de dos tipos principales de arquitec-tos: los de soluciones y los de infraestructura. Tambiénrealizamos labores de marketing y soy además el encar-gado de suministrar asistencia a nuestros “partners”y asociados de desarrollo respecto a cuestiones dearquitectura. Aparte de eventos de gran calado, comopuedan ser los IT Forums o el Tech-Ed, promove-mos acciones del tipo workshop, o Deep-Dives (cursosde inmersión profunda), sobretecnologías fundamentales,generalmente en la línea delproducto que aparece a cor-to/medio plazo. De igual forma,en ocasiones asesoramos a clien-tes en formato “uno a uno”, estoes con asesorías personalizadassobre desarrollos puntuales, paraofrecerles diseño de solucionesy revisión de estructuras arqui-tectónicas.

Paulatinamente, las tecno-logías vinculadas con los ser-vicios Web han ido siendoaceptadas e implantadas ensoluciones actuales, pero laimpresión es que –todavía-SOA como arquitectura no eslo suficientemente compren-

dida y adoptada. ¿Cuál sería tu consejo a este res-pecto?

La primera cuestión sería separar los dos con-ceptos, al menos inicialmente, aunque pertenezcanal mismo grupo conceptual. Respecto a los serviciosWeb, tenemos claro que son la tecnología que va aservir de base a todo lo que signifique interopera-bilidad. Y, además, incluyen todo lo que suminis-tran los Web Services Enhancements, ahora en su ver-sión 3.0. En Vista y Longhorn, esta tecnología estápresente dentro de WCF (antes Indigo), que inclu-ye estos estándares vinculados a los servicios Web.Tenemos un modelo de programación bastante sofis-

Marino Posadas

dnm.directo.entrevistas

Marino Posadas esasesor técnico y

redactor dedotNetManía, MVP de

C# y formador deAlhambra-Eidos

<< Antes de nada, a modo de

Marino Posadas y Arvindra Sehmi

Page 13: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

ticado, que es la base de Indigo, pero no nos olvi-damos de los niveles más inferiores y sus posibili-dades.

Ahora bien, todo esto no significa sino que laorientación a servicios es una de las posibilidadesarquitectónicas que las nuevas plataformas van aofrecer, pero ni mucho menos la única. Si habla-mos genéricamente de una orientación a servicios(una arquitectura SOA), existen varios principiosque deben de cumplirse, uno de los cuales consisteen identificar exactamente los límites de la arqui-tectura de negocio, los contratos de negocio nece-sarios para su funcionamiento, etc. Y nunca hablan-do de productos, sino simplemente de estructurasarquitectónicas del software. El paso siguiente eshacer corresponder esa arquitectura con una imple-mentación concreta, donde sí intervendrán pro-ductos concretos.

Si eso se hace utilizando herramientas vinculadascon .NET, puedes usar tecnologías punteras, comoBizTalk o SharePoint, por ejemplo, y tienes muchasotras posibilidades…

Como la de construirlo tú mismo si conoces sufi-cientemente bien los principios en que se basa…

Exactamente. Ahora bien, ¿pue-de Microsoft ofrecerte una guía deconstrucción, una asesoría puntual,para ayudarte a la resolución de esosproblemas arquitectónicos? Total-mente. Esa es una de las cosas quehace mi equipo.

Así pues, Indigo dará toda la infra-estructura para diversas soluciones decomunicación. Pero eso nos lleva auna pregunta sobre remoting. ¿Se lesupone obsoleto, a la vista de las nove-dades venideras?

No realmen-te. Todavía va aestar ahí, y nos haayudado a com-prender muchomejor los proble-mas vinculados alas arquitecturasdistribuidas. Loque sucede es quelas restriccionesde remoting (supropia naturale-za) no lo capaci-tan para ciertassoluciones distri-buidas de natura-leza heterogénea,y además nocumple con cier-

tos principios de la orientación a servicios, especial-mente en lo referente a los contratos y el formato deintercambio basado en mensajes.

¿Sería adecuado decir que si tienes totalmenteel control del dominio de instalación, la opción deremoting es perfectamente válida y de buen rendi-miento, pero si no es así la opción mejor serían losservicios Web?

Te diré que –de hecho- esa es exactamente la for-ma en que lo estamos recomendando. Y además, remo-ting va a formar parte integrante del modelo de pro-gramación de Indigo. Todavía es muy consistente, site encuentras dentro de estos términos.

Otra cuestión que surge vinculada con la adop-ción de estas arquitecturas es el rendimiento (o laposible penalización asociada a su implantación).¿Qué puedes decirnos al respecto?

El rendimiento está asociado muchas veces conel mensaje intercambiado; con su formato despuésde la seriación. De ahí que –tanto en Indigo comoen .NET 2.0- hayamos optimizado notablementela forma en que se serian los mensajes XML parafavorecer este aspecto. De hecho, ya hay compara-tivas de rendimiento muy favorables respecto a la

¿Puede Microsoft ofrecerte una guía de construcción, una asesoría puntual, para

ayudarte a la resolución de esos problemas arquitectónicos? Totalmente. Esa es una de

las cosas que hace mi equipo

dotN

etM

anía

<<

13

dnm.directo.entrevistas<<

Arvindra Sehmi

Page 14: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

utilización de servicios Web. Respectoal protocolo HTTP, resulta muy apro-piado para una semántica pregunta-respuesta. Se pueden utilizar otrostransportes, como TCP/IP, MSMQ,SMTP o incluso algún otro tipo. Perola importancia de disponer de distin-tos transportes es que podemos selec-cionar distintos modelos como elasincrónico unidireccional (garanti-zado y fiable), o puedes seleccionar unmecanismo bidireccional y utilizarlojunto a un estándar de servicios exten-didos como WS-Reliable Messaging oWS-Security.

Además, la gente está empezandoa construir aplicaciones cada vez másy más complejas y el ajuste de rendi-miento para estas aplicaciones se vuel-ve un asunto crucial en la implanta-ción. Y a veces el problema está en queno acaban de comprender las impli-caciones que la elección de una deter-minada arquitectura tiene en ese ren-dimiento. Y por otro lado, suminis-tramos mecanismos para realizar lascosas de forma muy sencilla, de mane-ra que también se corre el riesgo deque el desarrollador adopte el princi-pio del mínimo esfuerzo sin analizarsuficientemente las consecuencias dela adopción de una determinada téc-nica. Por eso suministramos guías ydocumentación (un montón de docu-mentación, de hecho…).

Otra cuestión que vincula al desa-rrollo con la arquitectura y la facilidadde uso de un programa tiene que vercon el modelo de propone Vista para laconstrucción de aplicaciones. O sea,¿Cómo es posible unificar los modelosde aplicación Windows y Web, tan dis-tantes en un principio?

Básicamente porque vamos a con-tar con los medios para describir cómova a ser la interfaz de usuario median-te XAML. Tú suministras esa des-cripción de la IU a un motor de inter-pretación. Si éste es de tipo Web,obtienes páginas Web, si se trata deun intérprete de Windows, obtienesaplicaciones Windows Forms. XAMLes –realmente– una forma en la quepuedes seriar objetos. Puedes enten-derlo como una generalización de laseriación de objetos para la interfazde usuario.

¿Crees que, quizá, la falta de cono-cimiento profundo de cuál es la formacorrecta de implantar arquitecturas encapas constituye la principal barrera parasu adopción masiva?

Sin duda. Especialmente, de la for-ma de organizar la comunicación entrecapas y la forma es que esta comunica-ción tiene diferentes impactos tanto enel desarrollo como en el rendimientofinal de la aplicación. Se necesita com-prender bien la arquitectura completaend-to-end, incluyendo las restriccionesde implantación.

En otro orden de cosas, hemos vis-to que Microsoft ha anunciado una nue-va titulación relacionada con la arqui-tectura de aplicaciones. ¿En qué va aconsistir?

Hemos estado recogiendo la opi-nión de nuestros partners a ese respec-to para acotar exactamente el alcanceque debería de tener. E incluso hemoshablado con grandes partners de carauna unificación de criterios (Intel,Lotus, IBM, HP, etc.). De hecho,hemos establecido un sistema de men-toring, de forma que cualquiera quedesee certificarse pueda contar con esesistema en un período de 12 a 18 mesesque consideramos el mínimo impres-cindible antes de abordar las pruebasfinales. Será un requisito enviar unaserie de documentación para la certifi-cación, ya que es difícil evaluar este tipode conocimiento simplemente con sis-temas on line. Es algo que recuerda a ladefensa de una tesis que tú realizarásante un grupo de expertos en arquitec-tura, para evaluar tus conocimientos.

Y finalmente, tus recomendacionespara los que quieran abordar estas tec-nologías…

Pasar por una fase previa de estu-dio y pruebas similar a la que reco-mendamos para los exámenes que des-cribía anteriormente. Libros y artícu-los sobre buenas prácticas, disponiblesen MSDN, asistencia a foros, simpo-sios y eventos sobre arquitectura, asi-milación de patrones de diseño y suimplantación en .NET Framework, yanalizar aplicaciones ya resueltas y dis-ponibles, tales como Global BankInfrastructure, donde se explican todosestos términos en fases y desde dife-rentes perspectivas.

dotN

etM

anía

<<

14

dnm.directo.entrevistas<<

Respecto a los serviciosWeb, tenemos claro que

son la tecnología que va a servir de base a todo lo que signifique interoperabilidad.Y,

además, incluyen todo lo que suministran los

Web Services Enhancements,ahora en su versión 3.0.

En Vista y Longhorn, estatecnología está presente dentro de WCF (antes

Indigo), que incluye estos estándares vinculados a los servicios Web

Page 15: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos
Page 16: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

ya estamos en condiciones deconstruir complejas aplicaciones Web personalizablesque eran impensables hasta la aparición de la versión2.0 de ASP.NET. Sin embargo, hay ciertas funciona-lidades que nos resultarían muy convenientes y quetodavía no sabemos hacer: por ejemplo, establecer unacomunicación entre los bloques.

El hecho de poder separar nuestra aplicación en blo-ques de funcionalidad que luego se pueden distribuir avoluntad dentro de una o varias páginas es algo muy inte-resante. Sin embargo, en cuanto empecemos a usarlosen aplicaciones reales nos daremos cuenta de que no bas-ta con tener esto. En la mayor parte de los casos no tri-viales veremos que es necesario que los bloques existen-tes, independientemente de su ubicación, se comuni-quen entre sí. Por ejemplo, podemos disponer de un blo-que que muestre una lista de productos y otro que sirvapara ver un informe de ventas de esos productos. Si nopodemos hacer que lo escogido en el primero influya enlos resultados que muestra el otro, los bloques no nosvaldrán de mucho.

Comunicación entre bloquesEl ejemplo anterior es solo uno más de los muchos

que se nos pueden ocurrir, pero evidencia la necesidadde varias funcionalidades para conseguir nuestro objeti-vo. En primer lugar, necesitamos alguna forma de quela información fluya entre los bloques. Pero no llega solocon eso, ya que tenemos que asegurarnos de que solo losbloques compatibles sean capaces de comunicarse (lainformación del producto seleccionado puede que nosignifique nada para otros bloques que haya en la mis-ma página). Finalmente, debemos encontrar un méto-do estándar que permita relacionar desde la interfaz de

usuario a los bloques compatibles entre sí, indepen-dientemente del tipo de datos que intercambien.

Para construir la comunicación entre dos bloquesdebemos hacer lo siguiente:

1. Decidir qué datos vamos a intercambiar, cuál essu tipo, su formato y su cantidad. Definir una inter-faz que permita intercambiar dicha información.

2. Definir uno de los controles como proveedor.3. Definir otro (u otros) como consumidor(es).4. En caso de querer una conexión estática, hay que

definir ésta. 5. En caso de necesitar conexiones dinámicas (deci-

didas por el usuario en tiempo de ejecución), esnecesario usar un control especial para definirlas.

Vamos a crear un ejemplo simple que ilustre todo elproceso. Crearemos dos WebParts mediante controlesde usuario. En uno de ellos habrá un campo de textocuyo contenido será transmitido al otro bloque, de modoque siempre que haya alguna variación en el primero sevea reflejada en el segundo.

Dado que los principios básicos de comunicaciónentre WebParts son los mismos, le resultará fácil recons-truir el ejemplo para comunicar cualquier otro tipo deinformación, incluso más compleja formada por diver-sos miembros.

Primer paso: la interfaz de comunicaciónEn este caso lo que se transmitirá desde un blo-

que al otro es simplemente texto (el contenido delcuadro de texto del control origen de datos). Podríaser el identificador de un producto, o una estructuracompleja que represente varios atributos de un clien-te, por ejemplo. En cualquiera de los casos, lo que

WebParts en ASP.NET 2.0 (y III)Con este artículo finalizamos la serie sobre WebParts comenzada hace dos númerosen dotNetManía. En él trataremos algunos conceptos avanzados sobre bloques per-sonalizables que nos permitirán llegar a un buen nivel en el desarrollo de este tipo deaplicaciones.En concreto,veremos cómo intercambiar información entre ellos y cómoexportarlos para su reutilización.

<< Con lo visto hasta ahora

José M.Alarcón

dnm.asp.net

José Manuel Alarcón es redactor de dotNetManía.

Es ingeniero industrial yespecialista en consultoría de

empresa.Ha escrito varios libros,y ha publicado más de

doscientos artículos sobreinformática e ingeniería en

revistas especializadas.Visita sublog en www.jasoft.org.

Page 17: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

debemos tener muy claro antes de hacer nada es quése va a transmitir, para luego ser consecuentes en ladefinición de toda la arquitectura.

En el caso que nos ocupa, dado que sólo es texto,podemos definir en la carpeta App_Code (para que esté alalcance de toda la aplicación) una interfaz como ésta lla-mada ITextTransfer:

Public Interface ITextTransfer

Function Texto() As String

End Interface

Más sencilla – imposible. Su único miembro es unmétodo que devuelve una cadena. En lugar de una fun-ción, podríamos haber definido también una propiedadde solo lectura. Si lo que intercambiamos es algo máscomplejo que una cadena, bastará con definir una claseo estructura en alguna parte y devolverla a través de lainterfaz.

Esta interfaz es la que se pasará entre ambos extre-mos de la conexión.

Segundo paso:definición de la fuente oproveedor

Ahora vamos a crear un control que se encargaráde enviar datos a los posibles consumidores que defi-namos. Agregue al proyecto un nuevo control de usua-rio llamado Proveedor.ascx y agregue sobre su super-ficie un control TextBox y un botón. No es necesariointroducir código alguno para responder a los even-tos de estos dos elementos. El cuadro de texto será unmero contenedor de información y el botón lo usare-mos únicamente para forzar el envío de datos al ser-vidor (es decir, para forzar un postback):

Como proveedor de la información textual quenos interesa, este control deberá implementar unmétodo que proporcione acceso a un objeto que imple-mente la interfaz que hemos acordado en el paso ante-rior, el cual será “enviado” a los consumidores con losque se comunique.

El objeto que implementa esta interfaz puede seruna clase definida para la ocasión o, más comúnmen-te, puede ser el propio WebPart, que en ese caso deberáimplementar la interfaz. Es decir, en nuestro ejemplo,deberá definir un método Texto tal y como indica éstaen el fuente 2.

Lo único que hace la función es devolver la informa-ción que nos interesa, o sea, el contenido del cuadro detexto. Además, como ya he dicho, es necesario indicar a

la infraestructura de WebParts cómo se realizará la comu-nicación y que éste es un bloque que proveerá de datos aotros. Esto se consigue definiendo un método cualquie-ra que devuelva la interfaz de comunicación y marcán-dolo como proveedor de origen de conexiones, así:

En este código vemos la definición de un métodoque lo único que hace es devolver una referencia al pro-pio control, que será el origen de la conexión. El méto-do se puede llamar como queramos. Finalmente, y lomás importante, el atributo ConnectionProvider sirvepara indicar a la infraestructura de WebParts que estemétodo actúa como origen de una conexión entre blo-ques, e indicamos como atributos la descripción y el iden-tificador único que le otorgamos a dicho origen.

Esto es tal vez lo más complicado de entender detodo el proceso, así que medítelo un rato antes de con-tinuar leyendo. En cualquier caso, como se ve en el frag-mento anterior, si bien es algo complejo conceptualmentees muy fácil de implementar en la práctica.

Tercer paso:definir un consumidor dedatos

La construcción del consumidor de datos sí que esrealmente sencilla. Lo único que debemos hacer es defi-nir un método que reciba como parámetro la interfaz deintercambio de datos que hemos decidido antes y deco-rarlo con un atributo.

Añada un control de usuario al proyecto y llá-melo Consumidor.aspx. Arrastre sobre su superficie unaetiqueta de texto. En ellamostraremos el texto queemite el proveedor del pasoanterior.

En la vista de códigofuente del control defi-na un método para asig-nar el contenido de laetiqueta como en elfuente 4.

dotN

etM

anía

<<

17

dnm.asp.net<<

<asp:TextBox ID=”TextBox1” MaxLength=”16” Runat=”server” /><asp:Button ID=”Button1” Text=”Enviar datos” Runat=”server” />

Fuente 1

Partial Class ProveedorInherits System.Web.UI.UserControlImplements ITextTransfer

Public Function Texto() As StringImplements ITextTransfer.Texto

Return TextBox1.TextEnd Function

End Class

Fuente 2

<ConnectionProvider(“Proveedor”, “ProveedorID”)> _Public Function GetTextTransferInterface() As ITextTransfer

Return MeEnd Function

Fuente 3

En el anterior artículo de esta serie se afir-maba que sólo se pueden crear verbos per-sonalizados al definir WebParts puros, perono en controles de usuario. En realidad síes posible implementando la interfazIWebActionable. Muchas gracias a Juan LuisCeada por apuntar esta posibilidad.

NOTA

Page 18: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

El control no necesita implementar la interfaz, yaque sólo la consume. Basta con definir un método simi-lar a éste en el que el único parámetro es un objeto queimplementa la interfaz de intercambio de datos y queestá decorado con un atributo ConnectionConsumer queindica a la infraestructura de WebParts que se trata de unpunto final en una conexión, especificando su descrip-ción y un identificador único.

Dentro del método el código es muy sencillo ya quetenemos una referencia al control origen de datos de laconexión, y sólo tenemos que llamar al método Texto dela interfaz para obtener la cadena que está contenida den-tro de su cuadro de texto.

Este método será llamado de forma automáticapor parte de la infraestructura de WebParts siempreque sea necesario refrescar los contenidos de la cone-xión, por lo que nuestro bloque no tiene que preocu-parse de nada más.

Si en lugar de usar controles de usuario hubiésemosimplementado un control WebPart real, la forma de pro-ceder sería exactamente la misma.

Cuarto paso:conexiones estáticasUna vez que hemos definido correctamente el con-

ducto de paso y los dos extremos de la conexión, sóloresta conectarlos entre sí. La forma más sencilla dehacerlo es definir una conexión en tiempo de diseñoentre un control fuente y un control consumidor. Esel control WebPartManager, encargado de controlar todala lógica de la página, el que nos facilita los mediosnecesarios.

Arrastre un ejemplar de cada control que acaba-mos de crear a sendas WebPartZone de la página deejemplo. Ahora seleccione el control WebPartManager1y en sus propiedades pulse el botón de la propiedadStaticConnections, como se ilustra en la figura 1. Enel diálogo que aparece solo tendremos que agregar unnuevo elemento y establecer el nombre de los con-troles que queremos conectar usando las propiedadesProviderID y ConsumerID para la fuente y el sumiderode información respectivamente.

Como es obvio, estos controles deben haber sidodefinidos con la función correspondiente y deben usarla misma interfaz de comunicación. Si no fuese así, seproduciría un error nada más ejecutar la página.

Como resultado de haber usado este diálogo se inclu-ye un elemento WebPartConnection en las etiquetas de lapágina (figura 2).

Quinto paso:conexiones dinámicas

Es probable que el establecimiento de conexionesestáticas sea el más interesante en la mayor parte de lassituaciones, ya que no podemos esperar que un usuariomedio tenga la capacidad (o más bien el interés) de defi-nir sus propias conexiones entre bloques. Aún así, paracierto tipo de aplicaciones con usuarios más avanzadossí puede resultar de útil permitir que sea el propio usua-rio el que defina de qué forma quiere conectar unos ele-mentos con otros. Esto es especialmente cierto cuandoun mismo control de origen puede actuar como fuentepara varios controles sumidero, cada uno especializadoen ofrecer determinada información a partir de los datosfacilitados por el primero. Por ejemplo, imaginemos unatípica página de cuadro de mandos para ejecutivos en laque nuestros usuarios escogen lo que necesitan ver.Podemos definir ciertos controles proveedores que lis-ten los productos y regiones en las que actúa nuestraempresa, así como otro para ofrecer los años de activi-dad para los que existen datos. Si construimos diversoscontroles sumidero que pueden enlazarse a todas estasfuentes (incluso a varias a la vez) para mostrar informes,gráficas de ventas, etc., ofreceremos una potente herra-mienta para consulta de información en la que cada unode nuestros usuarios será capaz de ver exactamente loque necesita. Sólo tendrán que arrastrar los controles“filtro” (orígenes) y los visualizadores en los que tenganinterés y, en cuanto los enlacen, podrán navegar por lainformación de la manera que deseen y con la distribu-ción en pantalla que les resulte más cómoda.

dotN

etM

anía

<<

18

dnm.asp.net<<

Figura 1

Figura 2

<ConnectionConsumer(“Consumidor”, “ConsumidorID”)> _Public Sub GetTextTransferInterface(_

ByVal proveedor As ITextTransfer)Label1.Text = proveedor.Texto()

End Sub

Fuente 4

Page 19: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

En situaciones como ésta es cuandonecesitamos las conexiones dinámicas.

En realidad, es también muy sencilloobtener esta funcionalidad. Basta conhacer uso del control ConnectionsZonedis-ponible en la barra de herramientas de“Elementos Web en Visual Web Deve-loper” (figura 3). Arrastre uno de estos ala columna derecha de la tabla que hemosestado usando en nuestros ejemplos. Enla figura 4 podemos ver el aspecto que tie-ne sobre la superficie de diseño. En el con-trol de catálogo añada los dos controles(la fuente y el sumidero) que acabamos decrear para que estén disponibles en la pági-na. Por fin, añada un último controlLinkButton para pasar al modo de cone-xión del WebPartManager. En su propiedadText escriba “Conectar bloques”, y comoresultado de su pulsación use el código delfuente 5.

Al pasar a modo de conexión veremosque aquellos bloques que son fuente osumidero de datos disponen de una opción

nueva en su menú desplegable de accio-nes: “Conectar”. Al elegirla, aparece eldiálogo de creación de conexiones en lapágina. Éste va mostrando diversos aspec-tos a medida que se establece la conexión.

La figura 5 ilustra los tres pasos nece-sarios para crear una conexión dinámicay el aspecto del control en cada uno deellos. El paso 1 aparece tras elegir el méto-do “Conectar” en el menú desplegable delcontrol origen de datos. Simplemente ins-ta al usuario a crear una nueva conexiónpara éste pulsando sobre el enlace de laparte superior. También informa de lasconexiones existentes con origen en éste,de haber alguna anterior. A continuación,se permite seleccionar el control sumide-ro o destino de la conexión, para lo cualdebemos elegirlo de una lista desplegable.En ésta sólo se muestran los controles que

estén presentes en la páginay que implementen la inter-faz común de comunica-ción que tiene el controlorigen. Una vez elegido elcontrol se pulsa sobre elbotón “Conectar” y se llega

al paso final en el que se muestra el resul-tado de la operación.

Una vez establecida la conexión,vamos a probarla. En el control origenintroduzca una frase cualquiera en elcampo de texto y pulse el botón paraprovocar un postback al servidor. A par-tir de ese momento, la frase apareceráreflejada en el control sumidero en todomomento, manteniéndose sincroniza-do el contenido de ambos entre los post-backs (figura 6).

Exportación de WebPartsSi disponemos de un WebPart com-

plejo, que ofrece muchas propiedadespara configurar o las que tiene son com-plicadas, será interesante brindar la posi-bilidad de guardar sus ajustes para reuti-lizarlos. Así podremos hacer un uso pos-terior en el mismo portal o incluso llevár-noslo a otro portal que disponga del mis-mo control. De hecho, éste no tiene nipor qué ser el mismo, ya que mientras sellame igual y posea propiedades con elmismo nombre y tipo será compatible la

dotN

etM

anía

<<

19

dnm.asp.net<<

Protected Sub LinkButton5_Click(ByVal sender As Object,ByVal e As System.EventArgs) Handles LinkButton5.ClickWebPartManager1.DisplayMode =

WebPartManager.ConnectDisplayModeEnd Sub

Fuente 5

Figura 3

Figura 4

Figura 5

Figura 6

Page 20: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

información transferida, puesto que losajustes se hacen mediante reflexión y nocon tipos estrictos.

Para que un bloque pueda exportarsus propiedades hay que indicar estanecesidad en el constructor de la clase,usando su propiedad ExportMode. En lafigura 7 se observan los tres posibles valo-res que tiene esta propiedad: exportarlotodo, no exportar nada (valor por defec-to) o exportar sólo aquello que no seaconfidencial.

Normalmente no tendremos propie-dades confidenciales, pero es posible queen ocasiones pudieran hacernos falta. Si,por ejemplo, una de las propiedades delWebPart es la clave que éste necesita paraconectarse a un origen de datos y obtenersus contenidos, no deberíamos permitirque se exporte y esté al alcance de cual-quiera. Para marcar una propiedad comoconfidencial debemos usar una de lassobrecargas del atributo Personalizableya visto, cuyo segundo argumento es pre-cisamente un booleano para indicarlo:

Personalizable(

PersonalizationScope.Shared, False)

No basta con marcar un bloque comoexportable. Se debe habilitar explícita-mente la capacidad de exportación de lainfraestructura desde el archivo de confi-guración web.config usando el atributoenableExport del nodo <webParts> y esta-bleciéndolo como verdadero.

Al hacer todo esto, el control ofreceráuna opción de exportación en su menúdesplegable. Al elegirla, se creará un archi-vo con el mismo nombre que el título delcontrol y extensión .WebPart que podre-mos almacenar en disco. Se trata de unarchivo XML en el que aparece el nom-bre del tipo del control y una serie denodos con las propiedades del control ysus valores en el momento de la exporta-ción. Por ejemplo, vea el fuente 6.

Este es el XML resultante de expor-tar el control que creamos antes y que sir-ve para mostrar el nombre de usuario deWindows actual. La mayor parte de las

propiedades son las estándar para unWebPart, y además serializa también nues-tra propiedad Mayusculas (al final).

Todo esto está muy bien pero, ¿de quévale exportar estos valores si no podemosimportarlos? Vamos a ver cómo se hace,ya que es también muy sencillo. Basta conañadir un control ImportCatalogPart a lazona de catálogos de nuestra página. Alhacerlo, cuando pasemos a modo catálo-go se nos ofrece la posibilidad de buscarun archivo con extensión .WebPart en eldisco duro y subirlo a la Web. Al recibir-lo, se trata de instanciar un objeto del tipoindicado en el archivo que herede deWebPart, y se ajustan sus propiedades. Asíde sencillo.

Obviamente, esta característica tieneimplicaciones de seguridad importantes,puesto que un usuario malicioso puede cre-ar archivos XML con valores inadecuados

para las propiedades, forzar la carga de cier-tos controles potencialmente dañinos, osaturar la memoria del servidor forzandola carga de muchos controles. Por ello laimportación de WebParts debería estar per-

mitida únicamente a usuarios de alto ran-go, y aún así las propiedades de los con-troles deberían hacer una buena validaciónde los datos que les lleguen.

En resumenA lo largo de estas tres entregas hemos

estudiado toda la infraestructura deWebParts que ofrece ASP.NET 2.0. Setrata de una característica muy especta-cular en esta versión y que abre todo unmundo de posibilidades para el progra-mador que sepa sacarle partido. Hemosaprendido prácticamente todo lo quenecesita saber para hacer aplicacionescomplejas con la infraestructura de blo-ques, desde los fundamentos hasta lascaracterísticas más avanzadas. Espero queestos contenidos le hayan resultado útilesy provechosos.

dotN

etM

anía

<<

20

dnm.asp.net<<

<?xml version=”1.0” encoding=”utf-8”?><webParts><webPart xmlns=”http://schemas.microsoft.com/WebPart/v3”><metaData>

<type name=”Jose.WebParts.UsuarioWebpart” /><importErrorMessage>No se puede importar este elemento Web.</importErrorMessage>

</metaData><data>

<properties><property name=”AllowClose” type=”bool”>False</property><property name=”Width” type=”unit” /><property name=”AllowMinimize” type=”bool”>True</property><property name=”ExportMode” type=”exportmode”>All</property><property name=”AllowConnect” type=”bool”>True</property><property name=”ChromeType” type=”chrometype”>Default</property><property name=”TitleIconImageUrl” type=”string” /><property name=”Description” type=”string” /><property name=”Hidden” type=”bool”>False</property><property name=”TitleUrl” type=”string” /><property name=”AllowEdit” type=”bool”>True</property><property name=”Height” type=”unit” /><property name=”HelpUrl” type=”string” /><property name=”Title” type=”string”>Usuario Windows actual</property><property name=”CatalogIconImageUrl” type=”string” /><property name=”Direction” type=”direction”>NotSet</property><property name=”ChromeState” type=”chromestate”>Normal</property><property name=”AllowZoneChange” type=”bool”>True</property><property name=”AllowHide” type=”bool”>False</property><property name=”HelpMode” type=”helpmode”>Navigate</property><property name=”Mayusculas” type=”bool”>False</property>

</properties></data>

</webPart></webParts>

Fuente 6

Figura 7

Page 21: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos
Page 22: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

hemos presentado los fun-damentos de LINQ (Language INtegrated Query),una combinación de extensiones al lenguaje ylibrerías de código manejado que permite expresarde una manera uniforme consultas sobre coleccio-nes de datos provenientes de las más diversas fuen-tes: objetos en memoria, bases de datos relaciona-les o documentos XML, entre otros. Si bien losejemplos que acompañaban a ese artículo estabancodificados en C#, entonces mencionamos que latecnología LINQ estaría disponible no solo paralos programadores de este lenguaje, sinoque Visual Basic 9.0 (la versión del len-guaje que implementará “Orcas”)también ofrecería las mismas facili-dades (e incluso algunas más, podría-mos añadir ahora) para expresardirectamente con los recursos dellenguaje colecciones de datos dediferente naturaleza y consultas sobreellas.

Requisitos preliminaresPara probar los ejemplos de código que acom-

pañan al artículo, el lector deberá instalar la presen-tación preliminar de LINQ, disponible en la URLque se indica en la bibliografía [1]. El software demayo de 2006 incluye versiones previas de los com-piladores de C# 3.0 y VB 9.0, varios ensamblados enlos que se implementan las novedades y la tecno-logía LINQ, y un conjunto de plantillas de pro-yectos que se muestra en la figura 1.

Adicionalmente, se ofrece un directorio de ejemplosde código y otro de documentación. Recomendamosespecialmente la lectura de los documentos incluidosen el directorio Docs, así como el análisis y ejecuciónde los ejemplos.

Los ejemplos que se presentan en este artículo seapoyan en la clase Persona de entregas anteriores.Aunque está claro que en principio no habría sidonecesario (uno de los objetivos centrales de .NET esprecisamente facilitar la interacción de módulos desa-rrollados en diferentes lenguajes), el fuente 1 presen-

Lo que nos traerá Orcas:VB 9.0 y LINQ

Este artículo presenta las novedades que incluirá (probablemente con algunasvariaciones) Visual Basic 9.0, incluyendo la sintaxis de las expresiones de con-sulta, que constituyen el principal reflejo en el lenguaje de la tecnología LINQ,y las extensiones para el soporte directo de XML.

Octavio Hernández

dnm.futuro

<< Ya en una entrega anterior

Octavio Hernándezes colaborador habitual

de dotNetManía,Ingeniero en

Informática de Sistemasy MVP de C#.

Page 23: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

ta una versión de la clase implementa-da en Visual Basic 9.0.

Nuevas características “bási-cas” de VB 9.0

En este punto introduciremos lasnovedades de más bajo nivel que inclu-ye Visual Basic 9.0 y que en mayor omenor medida sirven como fundamen-to o pueden ser utilizadas en combina-ción con aquellas que directamenteestán relacionadas con LINQ y sus tec-nologías “derivadas”. Estas novedades“básicas” son las siguientes:• Determinación implícita del tipo de

variables locales.• Inicializadores de objetos y colec-

ciones.• Tipos anónimos.• Tipos anulables*.• Métodos extensores.• Interfaces dinámicas.• Identificadores dinámicos*.• Relajación de delegados.

Las características marcadas con *no están aún implementadas o lo estánsolo parcialmente en la versión actualde la presentación preliminar de LINQpara VB.

Determinación implícita del tipo delas variables locales

En Visual Basic 9.0 será posibleobviar la especificación del tipo de unavariable local que se vaya a inicializarexplícitamente. El compilador deter-minará de forma implícita el tipo dela variable en base al tipo de la expre-sión de inicialización. Por ejemplo, enel fragmento de código que se mues-tra en el fuente 2 el compilador infie-

dotN

etM

anía

<<

23

dnm.futuro<<

Public Enum SexoPersonaMujer = 0Varón = 1

End EnumPublic Class Persona

‘ camposPrivate _nombre As String = Nothing‘ en VB 9.0 se podrá utilizar:‘ Private _sexo As SexoPersona? = NothingPrivate _sexo As Nullable(Of SexoPersona) = NothingPrivate _fechaNac As Nullable(Of DateTime) = Nothing‘ constructoresPublic Sub New()

‘ nadaEnd SubPublic Sub New(ByVal nombre As String, ByVal sexo As SexoPersona)

MyClass.New()_nombre = nombre_sexo = sexo

End SubPublic Sub New(ByVal nombre As String, ByVal sexo As SexoPersona, _

ByVal fechaNac As DateTime)MyClass.New(nombre, sexo)_fechaNac = fechaNac

End Sub‘ propiedadesPublic Property Nombre() As String

GetReturn _nombre

End GetSet(ByVal value As String)

_nombre = value.ToUpper()End Set

End PropertyPublic Property Sexo() As Nullable(Of SexoPersona)

GetReturn _sexo

End GetSet(ByVal value As Nullable(Of SexoPersona))

_sexo = valueEnd Set

End PropertyPublic Property FechaNac() As Nullable(Of DateTime)

GetReturn _fechaNac

End GetSet(ByVal value As Nullable(Of DateTime))

_fechaNac = valueEnd Set

End PropertyPublic ReadOnly Property Edad() As Nullable(Of Integer)

GetIf _fechaNac.HasValue Then

Return Convert.ToInt32(DateTime.Today. _Subtract(FechaNac.Value).TotalDays / 365.25)

ElseReturn Nothing

End IfEnd Get

End Property‘ métodosPublic Overrides Function ToString() As String

Dim s As String = “”If _nombre Is Nothing Then s &= “ANONIMO” Else s &= _nombreIf _sexo.HasValue Then

If _sexo.Value = SexoPersona.Mujer Thens &= “ (M)”

Elses &= “ (V)”

End IfEnd IfIf _fechaNac.HasValue Then s &= “ (“ & Edad.ToString() & “)”Return s

End FunctionEnd Class

Fuente 1. Clase Persona utilizada en los ejemplos

Figura 1. Plantillas de proyectos LINQ en Visual Basic

Page 24: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

re que la variable N es de tipo Integer por el tipo dela constante que se le intenta asignar. Este meca-nismo puede utilizarse también en otras construc-ciones del lenguaje, como los bucles For..Next yFor Each..Next.

Independientemente del estado de la opciónOption Strict, el acceso a las variables cuyo tipo esinferido por el compilador siempre se realizamediante enlace temprano. De hecho, cuando estaopción esté en On (lo que vienen recomendando des-de hace mucho nuestros columnistas - vea por ejem-plo [3]), para utilizar el enlace tardío sobre unavariable en VB 9.0 se deberá declararla explícita-mente como As Object. Este cambio hacia unamayor utilización en situaciones “normales” delfuerte control de tipos hace posibles nuevas apli-caciones del enlace tardío que presentaremos másadelante en este artículo.

Inicializadores de objetos y colecciones

VB 9.0 añadirá nuevas construcciones sintácticaspara permitir la especificación directa de constantesde clases y colecciones, que aportarán una mayorcomodidad y economía de expresión al lenguaje.

a) Inicializadores de objetos

En el fuente 3 se muestra cómo se podrá asignaruna “constante” construida ad hoc a una variable deuna clase cualquiera. En lugar de la llamada al cons-tructor con argumentos, o de la llamada al construc-tor básico seguida de un bloque With..End With, enesta variante más “declarativa” los valores de las pro-

piedades o campos del objeto se especifican median-te un inicializador de objeto.

Para que este mecanismo funcione es requisitoindispensable que la clase ofrezca un constructor sinargumentos, como ocurre en el caso de las clases queno tienen un constructor definido explícitamente yde aquellas que son sintetizadas artificialmente por elcompilador (“tipos anónimos”, que presentaremos acontinuación).

b) Inicializadores de colecciones

La extensión de la sintaxis para la inicialización deobjetos se ampliará también a las colecciones genéri-cas. El tipo al que se aplica el inicializador de colec-ción debe implementar la interfaz genéricaSystem.Collections.Generic.ICollection(Of T), y lainicialización se traduce en la construcción de la colec-ción, seguida de una secuencia de llamadas al méto-do ICollection(Of T).Add(T) para añadir cada ele-mento de la lista. El propio fuente 3 muestra más ade-lante cómo puede hacerse la inicialización de una varia-ble Hijos de tipo List(Of Persona).

dotN

etM

anía

<<

24

dnm.futuro<<

Sub Ejemplo1()‘ Declaración implícita del tipo de la variableDim N = 2 ‘ equivale a Dim N As Integer = 2

‘ Declaración implícita del tipo de la variable‘ y los elementos del array Dim Arr = {1, 2, 3, 4, 5, 6, 7, 8, 9}

‘ También en bucles for y foreachFor Dim k = 1 To 10

Console.WriteLine(k)NextFor Each Dim i In Arr

Console.WriteLine(i)Next

‘ Enlace tardío con Strict OnDim M As ObjectM = 27M = “abc”

End Sub

Fuente 2. Determinación implícita del tipo de las variables‘ a nivel de módulo para utilizarla en varios métodosDim Hijos As List(Of Persona) = Nothing

Sub Ejemplo2()‘ Inicializador de objetoDim ag = New Persona { _

Nombre := “Amanda”, _Sexo := SexoPersona.Mujer, _FechaNac := New DateTime(1998, 10, 23) _

}‘ ** Equivale a:‘ Dim ag = New Persona()‘ With ag‘ .Nombre = “Amanda”‘ .Sexo = SexoPersona.Mujer‘ .FechaNac = New DateTime(1998, 10, 23)‘ End With

‘ Inicializador de colecciónHijos = New List(Of Persona) { _

{ _Nombre := “Diana”, _Sexo := SexoPersona.Mujer, _FechaNac := New DateTime(1996, 2, 4) _

}, _{ _

Nombre := “Dennis”, _Sexo := SexoPersona.Varón, _FechaNac := New DateTime(1983, 12, 27) _

} _}‘ ** Equivale a:‘ Dim hijos = New List(Of Persona)‘ hijos.Add(New Persona(“Diana”, SexoPersona.Mujer,_

New DateTime(1996, 2, 4)))‘ hijos.Add(New Persona(“Dennis”, SexoPersona.Varón,_

New DateTime(1983, 12, 27)))End Sub

Fuente 3. Inicializadores de objetos y colecciones

Page 25: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

Tipos anónimos

La expresión “tipos anónimos” se refiere a la posi-bilidad de que el compilador de VB 9.0 sintetice deforma automática nuevos tipos de datos a partir de laspropiedades que se le indiquen en expresiones de ini-cialización. Por ejemplo, a partir del fragmento decódigo que se muestra en el fuente 4, el compiladorgenerará un tipo dotado de las propiedades que se indi-can en su expresión de inicialización, Nombre yEjemplares. El nombre que asigne internamente elcompilador al tipo es irrelevante; lo realmente impor-tante del ejemplo es que las variables rev1 y rev2 seránde un mismo tipo anónimo y no de dos tipos diferen-tes. El compilador “combina” las definiciones de tiposanónimos siempre que en las expresiones de iniciali-zación se incluyan las mismas propiedades, los tiposde éstas coincidan y estén declaradas en el mismoorden.

Tipos anulables

.NET Framework 2.0 implementó el tratamien-to de los tipos genéricos a nivel de motor de ejecu-ción, y a partir de esa posibilidad C# 2.0 y Visual Basic2005 incorporaron al lenguaje la capacidad para defi-nir y manipular tipos genéricos. Adicionalmente, entrelas clases base de .NET 2.0 se incluye el tipo genéri-co Nullable(Of T), que nos permite dotar a los tiposvalor de la semántica de valor nulo que caracteriza alos tipos referencia. Por ejemplo, declarando el cam-po privado _sexo de la clase Persona del fuente 1 detipo Nullable(Of SexoPersona) podremos inicializar-lo con el valor Nothing. Tal asignación se traduce enla asignación del valor False a la propiedad HasValuedel tipo.

Aparte de permitir aprovechar las característicasintrínsecas del tipo, la versión actual de Visual Basic

no ofrece ninguna facilidad lingüística directa paratrabajar con los tipos anulables. Corrigiendo esa limi-tación, y equiparándose en este sentido a C#, VB 9.0integrará en el lenguaje el tratamiento de los tiposanulables. En primer lugar, ofreciendo una sintaxismás cómoda para la definición de estos tipos: en lugarde Nullable(Of Integer) ahora podremos usar la nota-ción Integer?, mucho más concisa. Pero lo más impor-tante es que se integrará en el lenguaje la operaciónsobre estos tipos en función de sus tipos subyacentes,utilizando una semántica de valor nulo similar a la deSQL. Por ejemplo, la primera suma que se muestraen el fuente 5 producirá Nothing, dado que uno de susoperandos tiene ese valor. Por el contrario, la segun-da suma producirá 7, dado que ambos operandos tie-nen asignado un valor.

Para lograr un efecto similar a éste en VB 2005sería necesario encapsular el tipo Nullable(Of Integer)dentro de una estructura y definir para ésta los ope-radores correspondientes, como se ha hecho en [4].

Métodos extensores

Los métodos extensores (extension methods) son unrecurso de conveniencia que permite extender oampliar la funcionalidad de una clase sin necesidad demodificar su código fuente ni recurrir a la herencia.Los operadores de consulta de LINQ que veremosmás adelante se implementan utilizando métodosextensores.

Suponga que tenemos a nuestra disposición laclase Persona del fuente 1, pero únicamente en suforma compilada, como parte de una librería de cla-ses. Suponga además que quisiéramos extender arti-ficialmente la clase con métodos adicionales – porejemplo, añadirle métodos lógicos que nos permi-tan conocer si la persona cumple años durante elmes actual o es mayor de edad. Usando los nuevosrecursos que brindará VB 9.0, la solución consis-tiría en crear un módulo (que se muestra en el fuen-te 6), dotándolo de los métodos extensores corres-pondientes.

Para poder utilizar los métodos de este tipocomo métodos extensores, tanto el módulo comolos propios métodos deberán marcarse con el atri-buto System.Runtime.CompilerServices.Extension.

dotN

etM

anía

<<

25

dnm.futuro<<

Sub Ejemplo3()‘ Tipos anónimosDim rev1=New {Nombre:=“DotNetManía”, Ejemplares:=12}Dim rev2=New {Nombre:=“MSDN Magazine”, Ejemplares:=12}‘ ** Equivale a:‘ Dim rev1 As _Anonimo1_ = New _Anonimo1_()‘ ‘_Anonimo1_ es una clase que implementa propiedades‘ ‘Nombre y Ejemplares (ver código fuente)‘ With rev1‘ .Nombre = “DotNetManía”‘ .Ejemplares = 12‘ End With‘ Dim rev2 As _Anonimo1_ = New _Anonimo1_()‘ With rev2‘ .Nombre = “MSDN Magazine”‘ .Ejemplares = 12‘ End With

End Sub

Fuente 4. Generación de tipos anónimos

Sub Ejemplo4()Dim m As Integer? = NothingDim n As Integer? = 4Dim p As Integer? = 3

Dim x As Integer? = m + n ‘ x = NothingDim y As Integer? = n + p ‘ y = 7

End Sub

Fuente 5. Declaración y uso de tipos anulables

Page 26: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

Los métodos extensores deben tener un primerparámetro del tipo que se pretende extender, y dadoque estos métodos se van a utilizar como métodosde instancia, surge naturalmente la idea de llamaral parámetro [Me] (los corchetes son necesarios,dado que Me es palabra reservada), como muestra elejemplo.

Una vez que tenemos nuestros métodos progra-mados, solo tenemos que “ponerlos en ámbito” en elcódigo donde queremos utilizarlos, mediante la direc-tiva Imports. A partir de ese momento, podremos apli-car los métodos extensores a objetos de la clase “exten-dida” como si de un método de instancia corriente deésta se tratase. En el fuente 7 se muestra un fragmentode código en el que se aplican los métodos extenso-res definidos anteriormente a un objeto de la clasePersona.

Tenga en cuenta que muchos de los métodos exten-sores que se utilizan en LINQ requieren en calidad

de parámetros a delegados que “apunten” a la fun-cionalidad a ejecutar cuando llegue el momento ade-cuado. Por ejemplo, el fuente 6 ofrece un métodoextensor CumpleCondicion que recibe como paráme-tros la referencia a un objeto de la clase Persona parael que se desea comprobar si cumple una condiciónlógica determinada, y la condición en sí, expresada enforma de delegado genérico del tipo Func(Of Persona,Boolean). El fuente 7, por otra parte, muestra un ejem-plo de su utilización.

Interfaces dinámicas

En aras de la completitud, mencionaremos bre-vemente tres nuevas características propuestas paraVB 9.0 que no tienen relación directa con LINQ yque están orientadas a hacer el lenguaje más dinámi-co, en línea con las posibilidades que ofrecen otroslenguajes modernos como Python o Ruby.

En primer lugar están las interfaces dinámicas,que permiten cobijar temporalmente bajo un mis-mo “paraguas” a objetos no relacionados entre sípero que comparten (por azar o diseño consciente)una serie de características. Por ejemplo, el códigoque se presenta en el fuente 8 define la interfaz diná-mica ITieneNombre, en la que tiene cabida cualquierobjeto que disponga de una propiedad alfanuméricallamada Nombre. A continuación, se define una funciónque devuelve una persona o una revista (en este últi-mo caso utilizando un tipo anónimo).

Un objeto declarado como de tipo correspondientea una interfaz dinámica es accedido siempre median-te enlace tardío (dinámico), pero la suscripción a lainterfaz dinámica nos permite disponer de las venta-jas del tipado estático al acceder a los miembros, y enparticular disponer de la ayuda Intellisense.

dotN

etM

anía

<<

26

dnm.futuro<<

<System.Runtime.CompilerServices.Extension()> _Module Persona_Extension

‘ métodos extensores<System.Runtime.CompilerServices.Extension()> _Public Function CumpleAñosEsteMes(ByVal [Me] As Persona) As Boolean

Return [Me].FechaNac.HasValue AndAlso _[Me].FechaNac.Value.Month = DateTime.Today.Month AndAlso _[Me].FechaNac.Value.Day >= DateTime.Today.Day

End Function<System.Runtime.CompilerServices.Extension()> _Public Function MayorDeEdad(ByVal [Me] As Persona) As Boolean

Return [Me].Edad.HasValue AndAlso [Me].Edad.Value >= 18End Function‘ método extensor con parámetro-función<System.Runtime.CompilerServices.Extension()> _Public Function CumpleCondicion(ByVal [Me] As Persona,

ByVal F As Func(Of Persona, Boolean)) As BooleanReturn F([Me])

End FunctionEnd Module

Fuente 6. Módulo que implementa los métodos de extensión

Sub Ejemplo5()Dim ag = New Persona { _

Nombre := “Amanda”, _Sexo := SexoPersona.Mujer, _FechaNac := New DateTime(1998, 10, 23) _

}

If ag.MayorDeEdad() ThenConsole.WriteLine(“Amanda es mayor de edad!”)

ElseConsole.WriteLine(“Amanda es menor de edad.”)

End If‘ llamada a través de delegadoIf ag.CumpleCondicion(AddressOf MayorDeEdad) Then

Console.WriteLine(“Amanda es mayor de edad!”)Else

Console.WriteLine(“Amanda es menor de edad.”)End If

End Sub

Fuente 7. Utilización de métodos extensores

Dynamic Interface ITieneNombreProperty Nombre() As String

End InterfacePublic Function ObtenerObjetoConNombre(_

ByVal N As Integer) As ITieneNombreSelect Case NCase 1Return New Persona(“Paco Marin”,

SexoPersona.Varón)Case 2Return New {Nombre:=“DotNetManía”, Ejemplares:=12}

Case ElseReturn Nothing

End SelectEnd Function

Public Sub Ejemplo6()‘ ** interfaces dinámicasDim objetoConNombre As ITieneNombreobjetoConNombre = ObtenerObjetoConNombre(_

New Random().Next(3))ObjectDumper.Write(objetoConNombre)

End Sub

Fuente 8. Utilización de interfaces dinámicas

Page 27: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

Identificadores dinámicos

Un caso extremo de dinamismo es aquel en elque en tiempo de compilación no conocemos elnombre del método al que debemos llamar, losargumentos de la llamada o incluso la clase a la queel método pertenece. Los identificadores dinámi-cos permiten cubrir tales situaciones, y lograr unaeconomía de expresión muy alta con respecto a sifuera necesario hacer las mismas tareas utilizandoreflexión.

El fuente 9 presenta ejemplos de llamadas diná-micas a los métodos de una clase Prueba. Como pue-de verse, en el código se llama a funciones cuyos nom-bres se almacenan en variables o expresiones de tipoString.

Relajación de delegados

Por último, otro cambio que se incorporará al len-guaje en la próxima versión hará consistentes las reglasde asociación de delegados a las reglas de llamadas amétodos, basadas en la contravarianza de los argu-mentos. Por ejemplo, en la aplicación WindowsForms cuyo código se muestra en el fuente 10 (pro-yecto LINQ_VB2), la firma del gestor asociado al even-to Click ha sido modificada de forma tal que el segun-do argumento es de un tipo (Object) más general queel que originalmente requiere ese evento (EventArgs).Esta novedad permitirá crear métodos delegados másgenerales y por lo tanto aplicables a un mayor núme-ro de situaciones.

LINQ en VB 9.0Como hemos dicho al principio de este artículo en

nuestra definición de LINQ, la clave de esta tecnologíareside en que abre al programador la posibilidad de expre-sar las consultas sobre datos provenientes de las más disí-miles fuentes (colecciones en memoria, bases de datosrelacionales, documentos XML) utilizando recursos desu propio lenguaje de programación.

No repetiremos aquí todo lo relacionado con losfundamentos, la arquitectura y el funcionamiento deLINQ, sino que referiremos al lector a [2]. El pro-gramador de VB que haya seguido este artículo hastaaquí ya dispondrá del bagaje conceptual necesario(tipos anónimos, métodos extensores) para compren-der todo lo que en aquella referencia se trata. LINQes una tecnología 100% multi-lenguaje, diferenciassintácticas aparte. Basaremos nuestra exposición enejemplos que ayuden a comprender la sintaxis de lasexpresiones de consulta en VB 9.0.

Expresiones de consulta

Las expresiones de consulta (la documentaciónde VB se refiere a ellas como query comprehensions,mientras que la de C# las denomina query expres-sions) son el principal mecanismo mediante el quecobra vida la tecnología LINQ. No son otra cosaque expresiones responden a una nueva sintaxis aña-dida al lenguaje y que pueden actuar sobre cual-quier objeto que satisfaga la interfaz genéricaSystem.Collections.Generic.IEnumerable<T>, trans-formándolo mediante un conjunto de operadores en otracolección que implementa la misma interfaz.

En el fuente 11 se muestran algunos ejemplosde expresiones de consulta basadas en la colecciónde objetos Hijos que hemos creado e inicializadoen el fuente 3. Cualquiera que esté familiarizadocon SQL reconocerá en las expresiones de consul-ta las operaciones del álgebra relacional como selec-ción, proyección, ordenación o agrupación. Algunasoperaciones, como los agregados (Count, Sum, etc.),aún no están presentes en la sintaxis VB imple-mentada en la versión actual de la presentación pre-liminar, pero en cualquier caso, como muestra elsegundo ejemplo, están disponibles si se utiliza lasintaxis explícita de llamadas que hemos descritodetalladamente en [2].

dotN

etM

anía

<<

27

dnm.futuro<<

Public Class PruebaPublic Sub Saludo()

Console.WriteLine(“Hola!”)End SubPublic Function Sumar(_

ByVal ParamArray nums As Integer()) As IntegerDim suma = 0For Each i As Integer In nums

suma += iNextReturn suma

End FunctionEnd Class

Public Sub Ejemplo7()‘ ** identificadores dinámicosDim p As Object = New Prueba()

‘ As Object es imprescindible!Dim método As String = “Saludo”

‘ el nombre del método a llamarp.(método)() ‘ equivale a p.Saludo()Dim args = {1, 2, 4, 8}Console.WriteLine(“La suma es: “ & p.(“Sumar”)(args))

End Sub

Fuente 9. Utilización de interfaces dinámicas

Public Class Form1‘ firma del gestor de eventos modificada!Private Sub Mensaje(ByVal sender As System.Object,

ByVal e As Object) Handles Button1.ClickMessageBox.Show(“Hola desde VB 9.0”, “Saludo”)

End SubEnd Class

Fuente 10. Ejemplo de relajación de delegados

Page 28: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

Resultados de consultas como conjuntos de datos

Otra de las novedades importantes relacionadascon LINQ e incorporadas en esta presentación pre-liminar es la posibilidad de tratar los resultados deconsultas como conjuntos de datos. Específi-camente, esta versión incorpora un nuevo opera-dor, ToDataTable, que permite convertir el resulta-do de una consulta en un objeto DataTable para, porejemplo, pasarlo a otra capa de la aplicación oconectar a él controles visuales. La figura 2 mues-tra una rejilla en la que se visualiza el resultado deuna consulta sobre una colección de libros famo-sos. El código que produce la imagen se muestraen el fuente 12.

Soporte directo para XLinq en el lenguaje

VB 9.0 ofrece varias nuevas características destina-das específicamente a dar soporte intrínseco a XML yXLinq, la tecnología derivada de LINQ para la ejecu-ción de consultas integradas sobre documentos XML.El tema merece un artículo independiente, y aquí solopresentaremos las principales novedades, que son:

• Literales XML.• Importación y uso de espacios de nombres XML.• Enlace tardío sobre XML.

dotN

etM

anía

<<

28

dnm.futuro<<

Public Sub Linq1()‘ lista de chicas, ordenada alfabéticamenteDim chicas = From h In Hijos _

Where h.Sexo.HasValue AndAlso _h.Sexo.Value = SexoPersona.Mujer _

Select New {Nombre := h.Nombre, Edad := h.Edad}Order By Nombre

ObjectDumper.Write(chicas)End Sub

Public Sub Linq2()‘ cantidad de hijos mayores de edadDim promedio = (From h In Hijos _

Where h.MayorDeEdad() _Select h).Count()

‘ ** en un futuro próximo:‘ Select Count() From h In Hijos ...ObjectDumper.Write(promedio)

End Sub

Public Sub Linq3()‘ agrupación por sexosDim grupos = From h In Hijos _

Group By h.Sexo.Value _Select It ‘ It - significa aquí “el grupo”

‘ cuántos de cada sexoFor Each Dim g In grupos

Console.WriteLine(g.Key & “ - “ & g.Count)Next

End Sub

Fuente 11. Ejemplos de expresiones de consulta

Figura 2. Enlace a datos de resultado de consulta

Private Sub Button2_Click(ByVal sender AsSystem.Object,

ByVal e As System.EventArgs) Handles Button2.Click

Dim consulta = From l In libros _Select l _Order By Año

Dim tabla As DataTable = consulta.ToDataTable()DataGridView1.DataSource = tabla

End Sub

Fuente 12. Enlace a datos sobre el resultado de una consulta

‘ ** importación de espacio de nombres XMLImports ns = “http://www.w3.org/1999”

Public Sub Xml1()‘ ** literales XMLDim ag =

<PersonaNombre=”Amanda”Sexo=<%= SexoPersona.Mujer %>FechaNac=<%= #10/23/1998# %>>

</Persona>Console.WriteLine(ag.GetType().ToString())ObjectDumper.Write(ag)

‘ ** ahora con elementos y espacio de nombresDim ag2 =

<Persona xmlns=”http://www.w3.org/1999”><Nombre>Amanda</Nombre><Sexo><%= SexoPersona.Mujer %></Sexo><FechaNac><%= #10/23/1998# %></FechaNac>

</Persona>‘ ** uso de espacio de nombres XMLConsole.WriteLine(

“Amanda nació el “ + ag2. <ns:FechaNac>.Value)

Dim sobrinos = <Sobrinos>

<PersonaNombre=”Adrián”Sexo=<%= SexoPersona.Varón %>FechaNac=<%= New DateTime(2005, 8, 2) %>>

</Persona><%= ag %>

</Sobrinos>Console.WriteLine(sobrinos.GetType().ToString())ObjectDumper.Write(sobrinos)

Fuente 13. Ejemplos de literales XML

<%=<%=

<%=<%=

<%=<%=

<%=

%>%>

%>%>

%>%>

%>

Page 29: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

Literales XML

VB 9.0 permite insertar directamente en el códi-go fuente fragmentos de documentos XML. Los valo-res que se asocian a los atributos y elementos no tie-nen que ser especificados necesariamente medianteconstantes, porque el lenguaje incorpora una sintaxisque recuerda a la de ASP para “rellenar” las estructu-ras XML con el resultado de expresiones del lengua-je de programación. El fuente 13 muestra algunosejemplos claros.

Una aplicación muy potente de esta nueva carac-terística de VB 9.0 es la que permitirá obtener un lite-ral XML a partir del resultado de una consulta LINQ,como se muestra en el fuente 14.

Los objetos resultantes de la compilación de losfragmentos XML son de tipo XmlElement, definido enel ensamblado System.Xml.XLinq, lo que garantiza latotal interoperabilidad con otros lenguajes que utili-cen XLinq.

Importación y uso de espacios de nombres XML

Para dar consistencia a la inserción de XML ennuestro código fuente, VB 9.0 permitirá importar almismo espacios de nombres XML usando la senten-cia Imports, como se muestra en el fuente 13. A todoespacio de nombres XML importado siempre deberáasignársele un alias. Más adelante en el ejemplo semuestra la sintaxis que permite hacer uso de estos aliaspara cualificar elementos o atributos.

Enlace tardío sobre XML

Además de permitir la codificación directa de XML,VB 9.0 también simplifica el acceso a las estructuras XMLmediante el enlace tardío sobre XML. Mediante esta téc-

nica, las variables de nuestro código se pueden enlazaren tiempo de ejecución a atributos y elementos XML através de construcciones sintácticas especiales. El fuen-te 14 muestra un bucle en el que se utilizan dos de estasconstrucciones: la notación hijosXML...Persona repre-senta al “eje descendiente”: la colección de todos losnodos Persona que descienden de hijosXML, no importaa qué nivel de profundidad; por otra parte, la notaciónx.@Nombre tiene que ver con el “eje de atributos” y pro-duce una referencia al objeto XAttribute asociado al atri-buto Nombre del elemento x.

ConclusiónEn este artículo hemos presentado las nuevas carac-

terísticas que incluirá la versión 9.0 de Visual Basic,que estará disponible oficialmente junto con Orcas,la próxima versión de Visual Studio. En particular,hemos hecho mayor énfasis en las nuevas caracterís-ticas de VB 9.0 que sirven de soporte para LINQ yXLinq. A esta última tecnología dedicaremos ínte-gramente una de nuestras próximas entregas.

AgradecimientosEl autor quiere agradecer la ayuda de Guillermo

“Guille” Som, que ha contribuido a mejorar este artí-culo con múltiples sugerencias y puntualizaciones degran utilidad.

dotN

etM

anía

<<

29

dnm.futuro<<

Public Sub Xml2()‘ ** literal XML a partir de consulta LINQDim hijosXML =

<Hijos><%= Select <Persona Nombre=<%= h.Nombre %>

Sexo=<%= h.Sexo.Value %>FechaNac=<%= h.FechaNac.Value %>></Persona> _

From h In Hijos %></Hijos>

Console.WriteLine(hijosXML.GetType().ToString())ObjectDumper.Write(hijosXML)

‘ ** enlace tardío sobre XMLFor Each Dim x In hijosXML...Persona

Console.WriteLine([email protected])Next

End Sub

Fuente 14. Literal XML obtenido de una consulta LINQ

%><%=

Bibliografía

[1] Recursos relacionados con VB 9.0 y LINQ:http://msdn.microsoft.com/vbasic/future/default.aspx.

[2]Hernández, Octavio “Lo que nos traerá Orcas: la tec-nología LINQ”, publicado en dotNetManía Nº 25,abril de 2006.

[3] Som, Guillermo “Generics y Visual Basic .NET”,publicado en dotNetManía nº 8, octubre de 2004.

[4]Som, Guillermo “Definición de estructura paraoperar sobre tipos anulables”, publicado enhttp://www.elguille.info.

%>%>

%>

<%=<%=

Visual Basic 9.0 permite insertardirectamente en el código fuente fragmentos de documentos XML

Page 30: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

Servicios Web nativos con SQL Server 2005

Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimien-tos almacenados como las UDF de nuestra base de datos sin tener que usar nin-guna otra herramienta ni abrir puertos TCP para SQL Server 2005.

<< cómo mediante el uso de los HTTPEndPoints podemos exponer a la Web tanto los procedi-mientos almacenados como las UDF de nuestra base dedatos prácticamente sin esfuerzo. Estos objetos nos per-mitirán crear interfaces de acceso vía HTTP o TCP paraSOAP, T-SQL, Service Broker e incluso para DB-Mirroring. Nos centraremos en el objetivo de este artí-culo y hablaremos exclusivamente de la creación deHTTP/SOAP EndPoints en SQL Server.

En cierta forma, esta habilidad ya estaba disponiblecon SQL Server 2000. SQLXML 3.0 nos proveía de unconjunto de herramientas que nos permitían enviar yrecibir datos en formato XML y además permitía crearservicios Web con posibilidad de ejecución de procedi-mientos y UDF, al igual que los EndPoints.

Una de las mejoras más notables que se han aña-dido con la aparición de los EndPoints es la supresiónde IIS para gestionar las peticiones HTTP de los ser-vicios Web. Pero alguien debe hacerse cargo de estasredirecciones, por lo que para poder crear estos ser-vicios necesitaremos que la máquina en la que va aresidir SQL Server funcione bajo Windows 2003 oWindows XP con SP2. Ya que será http.sys el encar-gado de realizar todo este trabajo.

El funcionamiento de http.sys (HTTP ListenerProcess) es el siguiente. Imaginemos que hemos crea-do un EndPoint en la dirección http://miServer/dot-netmania. Al crearlo, queda automáticamente regis-trado en http.sys. Cuando llega una petición SOAP,la recoge en primera instancia el servidor especifica-do en la llamada, en nuestro caso miServer. El siguien-te paso es comparar el resto de la cadena con la listade EndPoints que el servidor tiene registrados y, en

caso de coincidencia, éste envía la petición directa-mente al EndPoint correspondiente, omitiendo así elpaso por IIS. En la figura 1 vemos claramente dife-renciadas las distintas metodologías.

Veamos un ejemplo

Ahora que ya hemos visto quiénes somos y haciadónde vamos, es el momento de entrar en materia.

Para crear un servicio Web en SQL Server 2005son necesarios tres pasos:1. Crear el origen de datos. Un procedimiento alma-

cenado, una UDF o incluso, como veremos másadelante, un proceso batch.

2. Crear un EndPoint especificando algún WebMethodque nos proporcione el acceso a esos datos.

3. Crear una aplicación cliente que solicite esos datos.

En este ejemplo crearemos un servicio Web quenos ofrecerá una lista de todos los artículos de los

David Perona

dnm.servidores.sql

En este artículo veremos

David Perona Martíneztrabaja como desarrollador paraClave Informática, S.L. Es Técnico

Superior en Administración deSistemas Informáticos y

MCAD.NET.

Figura 1

Page 31: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

que disponemos y que al seleccionarlo, cualquierade ellos nos enseñará su foto. Para ello, usaremosla base de datos AdventureWorks que adjunta SQLServer 2005.

El primer paso será crear los objetos que nos ofre-cerán los datos. En nuestro caso crearemos un proce-dimiento almacenado, que podemos ver en el fuente1, y que nos devolverá un listado básico (código y nom-bre) de la tabla de Productos.

En el fuente 2 tenemos el segundo procedimien-to almacenado que nos hará falta. Este nos devuelvela imagen y el nombre del artículo que le pasemoscomo parámetro, de la tabla ProductPhoto.

Con los procedimientos almacenados ya creados,el único paso que nos queda es crear nuestro EndPoint.Para ello, usaremos el código del fuente 3.

Sencillo, ¿verdad? Ya tenemos nuestro EndPointcreado y listo para su uso. Podremos comprobar sucorrecto funcionamiento si por ejemplo desde cual-quier navegador le pedimos que nos devuelva el docu-mento WSDL (Web Service Description Language)correspondiente al servicio. Con http://miServer/dot-netmania?WSDL nos mostrará una página con toda lainformación del EndPoint.

Ahora que tenemos todos los requisitos a punto,crearemos una aplicación muy simple que nos mos-trará el listado de artículos y que, al movernos porellos, nos mostrará las fotos de cada uno. Para ello,abrimos Visual Studio y creamos un nuevo proyectoWindows, al que llamaremos EndPoints. Al formula-rio lo llamaremos frmEndPoint, y añadiremos lossiguientes controles:

• Un DataGridView, que llamaremos oGrid.• Un PictureBox, que llamaremos PicImagen.• Un Label, que llamaremos LblImagen.• Un Button, que llamaremos Button1.

Con lo que conseguiremos que tenga una apa-riencia parecida la que vemos en la figura 2.

Lo primero que debemos hacer es añadir una refe-rencia Web a nuestro proyecto. Cuando se nos pre-gunte dónde se encuentra nuestro servicio, simple-mente escribiremos la dirección del WSDL (que ennuestro caso será http://miserver/dotnetmania?WSDL).Una vez que lo tengamos localizado, le daremos elnombre Local_EndPoint.

En el fuente 4 podemos ver el código del ejemplo.Como con cualquier servicio Web, tendremos que

importar el espacio de nombres de la clase de este ser-vicio en el encabezado del módulo en el que lo vaya-mos a usar. Importaremos también los espaciosSystem.Data y System.Data.SqlClient, que nos haránfalta para el desarrollo del ejemplo.

En la cabecera de la clase inicializamos el objetoque contendrá el servicio y un array de objetos, pues-

dotN

etM

anía

<<

31

dnm.servidores.sql<<

CREATE PROCEDURE dbo.GetArticulosAS

SELECT P.ProductID, P.NameFROM Production.Product P

ORDER BY P.ProductID

Fuente 1

CREATE PROCEDURE dbo.GetImagenArt@ProductID int

ASSELECT PF.LargePhoto, PF.LargePhotoFileName

FROM Production.Product P LEFT JOIN Production.ProductProductPhoto PPF

ON P.ProductID = PPF.ProductIDLEFT JOIN Production.ProductPhoto PF

ON PPF.ProductPhotoID = PF.ProductPhotoIDWHERE P.ProductID = @ProductID

Fuente 2

CREATE ENDPOINT sql_DotNetManiaSTATE = STARTED

AS HTTP (PATH = ‘/DotNetMania’,AUTHENTICATION = (INTEGRATED),PORTS = (CLEAR),SITE = ‘miServer’)

FOR SOAP (WEBMETHOD ‘GetProducts’

(Name=’AdventureWorks.dbo.GetArticulos’),WEBMETHOD ‘GetImageProd’

(Name=’AdventureWorks.dbo.GetImagenArt’),BATCHES = DISABLED,WSDL = DEFAULT,DATABASE = ‘AdventureWorks’,NAMESPACE = ‘http://Adventure-Works/’)

Fuente 3

Figura 2

Page 32: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

to que el EndPoint no siempre nos va a devolver obje-tos de tipo DataSet. Dependiendo del tipo de consul-ta, podemos obtener distintos elementos, como pode-mos ver en la tabla 1.

A continuación, pasaremos nuestras credenciales alservicio Web. Y si son aceptadas, ya podemos acceder

a todas los WebMethods que hayamos definido en nues-tro EndPoint. Si nos fijamos en el código de Button1,está comprobando el tipo que ha devuelto la funciónGetProducts; en caso de ser un DataSet, lo asigna a unobjeto DataSet local a la función y lo establece comoDataSource del DataGridView. Con esto ya tendremos

cargada toda la información de los artí-culos en la rejilla.

El último paso es comprobar elmovimiento por las filas de la reji-lla para ir cargando las imágenes.Como puede comprobarse, el códi-go es muy parecido al de la carga delos artículos.

Todo el código de este ejemplopuede descargarse de www.dotnetma-nia.com.

dotN

etM

anía

<<

32

dnm.servidores.sql<<

Imports System.DataImports System.Data.SqlClientImports EndPoints.local_EndPoint

Public Class frmEndPointDim myEndPoint As New EndPoints.local_EndPoint.sql_DotNetManiaDim oReturned() As Object

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.ClickDim oSet As New DataSet

oGrid.AllowUserToAddRows = FalseoGrid.AllowUserToDeleteRows = FalseoGrid.EditMode = DataGridViewEditMode.EditProgrammatically

myEndPoint.Credentials = System.Net.CredentialCache.DefaultCredentialsoReturned = myEndPoint.GetProductsIf oReturned(0).ToString = “System.Data.DataSet” Then

oSet = CType(oReturned(0), DataSet)oGrid.DataSource = oSetoGrid.DataMember = oSet.Tables(0).ToStringoGrid.Refresh()

End IfEnd Sub

Private Sub oGrid_RowEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs)Handles oGrid.RowEnter

Dim oSet As New DataSetDim oByte() As ByteDim oRow As DataRow

If Not oGrid.Item(e.ColumnIndex, e.RowIndex).Value.ToString.Trim = “” ThenmyEndPoint.Credentials = System.Net.CredentialCache.DefaultCredentialsoReturned = myEndPoint.GetImageProd(oGrid.Item(0, e.RowIndex).Value.ToString.Trim)If oReturned(0).ToString = “System.Data.DataSet” Then

oSet = CType(oReturned(0), DataSet)oRow = oSet.Tables(0).Rows(0)‘oByte = oRow(0)PicImagen.Image = New Bitmap(New System.IO.MemoryStream(oByte))lblImagen.Text = oRow(1)

End IfEnd If

End SubEnd Class

Fuente 4

Elemento en SQL Server Objeto .NET

Resultado de SELECT System.Data.DataSet

Resultado de SELECT especificando FOR XML System.Xml.XmlElement

Raise error SqlMessage (del WSDL)

Parámetro de salida SqlParameter (del WSDL)

Filas Afectadas SqlRowCount (del WSDL)

Valor devuelto por una consulta System.Int32

Tabla 1

Page 33: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

Entrando en detalle

En la propia instrucción de creación del EndPointpodemos especificar el nombre que le queremos dar,un login válido para SQL Server o Windows, que seráel propietario de dicho servicio y el estado del servi-cio una vez que se haya creado.

CREATE ENDPOINT AUTHORIZATION =

usrDavid STATE = STARTED

Los posibles valores para el parámetro STATE, sonStarted, Stopped (valor por defecto) y Disabled. Cuandoel servicio está en el estado Stopped, sigue escuchandoy recibiendo peticiones, aunque devuelve un mensa-je de error al cliente. Por el contrario, cuando está enel estado Disabled, está “físicamente” desconectado,no recibe las peticiones.

Obviando la propia definición del EndPoint, el res-to de la sintaxis consta de dos partes claramente dife-renciadas:

En la primera parte, especificamos el protoco-lo de trasporte (TPC o HTTP), el servidor en elque residirá nuestro servicio, el puerto de escucha,el método de autentificación del EndPoint y una lis-ta de direcciones IP a la que queramos restringir elacceso. • PATH – Especifica la URL de nuestro EndPoint, En

nuestro caso, “/dotnetmania”. Esta es la direcciónque tendremos que escribir para acceder al servi-cio. Con lo que la sintaxis queda de la siguienteforma: http://miServer/dotnetmania.

• AUTHENTICATION – Especifica el tipo de autenti-ficación que usaremos para nuestro servicio. Losposibles valores son: Basic, Digest, Integrated(usará la configuración de Windows), NTLM oKerberos.

• PORTS – Indica el tipo de puerto a usar. Los posi-bles valores son CLEAR (HTTP) o SSL (que acep-tará HTTPS).

• Clear_Port y SSL_Port – Permiten especificarpuertos distintos a los que se asumen por defec-to al indicar el parámetro PORTS. Por defecto, laopción CLEAR usará el puerto 80 y la opciónSSL el 443.

• SITE – Mediante este parámetro especificamos elnombre de la máquina en la que reside el servicioWeb. Si omitimos este parámetro, se asumirá elvalor “*”, que indica que la escucha se efectuarásobre todos los posibles hosts de la máquina que noestén explícitamente reservados. Otro posible valores “+”, que indicará que la operación de escuchase efectuará sobre todos los posibles hosts de lamáquina, pero sin discriminar los que estén reser-vados. Otros valores aceptados por esta propiedadpueden ser LocalHost, el nombre DNS o incluso ladirección IP de la máquina.

Cuando creamos un EndPoint, implícitamen-te estamos reservando una URL para nuestro ser-vicio. Por ejemplo, en el caso que nos ocupa, siobservamos el fuente 5, estamos implícitamentereservando la dirección http://miServer:80/dot-netmania. Esto quiere decir que mientras nuestroservidor esté en ejecución, http.sys redireccio-nará cualquier petición que se haga a esta direc-ción a SQL Server. Sin embargo, podrá ser usa-da por cualquier otro servicio cuando el servidoresté detenido. Para evitar esta situación, una bue-na práctica es reservar la URL explícitamente,con ayuda del procedimiento almacenadosp_reserve_http_namespace. La sintaxis es la siguien-te: sp_reserve_http_namespace N'http://miServer:

80/DotNetMania'. De esta forma, la URL estará per-manentemente ocupada y evitaremos conflictos dedirección. De la misma forma, para cancelar lareserva de esta dirección, ejecutaremos lo siguien-te: sp_delete_http_namespace_reservation N'N'http://miServer:80/DotNetMania'. Si, por elcontrario, estuviésemos omitiendo el paráme-tro SITE, o le estuviésemos pasando como valorun “*”, la reserva que se crearía sería la siguien-te: http://*:80/dotnetmania.

En la segunda parte de la sintaxis de unEndPoint, informamos sobre el tipo de EndPointque estamos creando y a qué peticiones va a estarescuchando. Podremos especificar tanto SOAP,como T-SQL, Service Broker o incluso DatabaseMirroring. Para cada uno de ellos, tendremos laposibilidad de especificar un subconjunto de pará-metros para definir su configuración. Nos centra-remos en SOAP, que es el objetivo de este artícu-lo. Tendremos que definir como mínimo un

dotN

etM

anía

<<

33

dnm.servidores.sql<<

HTTP (PATH = ‘/DotNetMania’,AUTHENTICATION = (INTEGRATED),PORTS = (CLEAR),SITE = ‘miServer’)

FOR SOAP ( ...

Fuente 5

Con este sistema, haremos accesibleinformación de nuestro sistema

vía servicios Web

Page 34: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

WebMethod, que enlazaremos a un procedimeintoalmacenado o una UDF. Indicaremos si dejamoshabilitada la posibilidad de ejecutar Batches sobre elservidor. Es altamente recomendable dejar estaopción deshabilitada (el estado por defecto), a menosque sea de vital importancia tenerla habilitada, lo quenos obligará a extremar al máximo las medidas deseguridad de nuestro servicio. No hace falta que osexplique lo que podría pasar si no somos totalmen-te meticulosos en este aspecto.

Además, podremos definir otras propiedadescomo quién será el encargado de generar la infor-mación WSDL que ofreceremos. Por defecto, esel mismo servicio el encargado de generar estefichero, aunque tenemos la opción de crear unprocedimiento almacenado y que sea éste el que,a petición del cliente, ofrezca un XSD personali-zado. Si usamos la opción Default, el EndPoint pue-de producir dos versiones distintas del mismoXSD. Con http://miServer/dotnetmania?wsdl,devolverá un XSD con tipos derivados, para uncorrecto mapeo de los tipos de datos más com-plejos que se pueden almacenar en SQL Server.Por otra parte, podremos usar http://miServer/dotnetmania?wsdlsimple. Este es un formato

reducido del anterior y se diferencia en que estaversión mapea todos los tipos de SQL Server entipos nativos XSD.

• WEBMETHOD — Con este parámetro indicamos losdistintos métodos que estarán disponibles para elservicio. A cada uno de ellos deberemos asociar-les un procedimiento almacenado o una funciónal que quedará enlazado. Podremos definir variosWebMethods por EndPoint.

• BATCHES — Indica si es posible la utilización de T-SQL.

• WSDL — Indica dónde está el XSD que será devuel-to al cliente cuando nos lo solicite.

• DATABASE — Especifica la base de datos en la quereside nuestro servicio.

• NAMESPACE — Especifica el espacio de nombres paranuestro EndPoint.

• FORMAT — Indica qué posibles tipos ofrecerá el ser-vicio como respuesta. {ALL_RESULTS, ROW-SETS_ONLY, NONE}.

• LOGIN_TYPE — {MIXED, WINDOWS}.

Configurando aspectos de seguridad

Tipos de autentificación

Si os fijáis, en la opción AUTHENTICATION del servi-cio Web no hay posibilidad de especificar la autenti-ficación anónima, detalle éste que nos puede evitarmás de un problema. Echemos un vistazo al resto deposibles tipos.

Configurando permisos sobre EndPoints

La sintaxis para ofrecer permisos a un EndPoint esmuy parecida a la que se utiliza para el resto de obje-tos de SQL Server.

dotN

etM

anía

<<

34

dnm.servidores.sql<<

Tipo deAutentificación

Descripción

BASIC Este método se caracteriza por añadir a la cabecera HTTP, el usuario y la contraseña codificados en Base64.Requiere la utilización de SSL en la definición del servicio,ya que estamos pasando la información de la conexiónen la misma petición y es relativamente fácil decodificar un código en Base64.

DIGEST Al igual que el método BASIC, pasa tanto el usuario como la contraseña a través de la red, pero esta vez codifi-cados mediante MD5 (algoritmo de codificación unidireccional).Con este tipo de autentificación sólo podremosespecificar usuarios de un dominio de Windows; no acepta usuarios locales de la máquina. Cuando el servidorrecibe esta información,compara el hash de la contraseña con el que quedó almacenado cuando se creó el usua-rio. Como nota, diremos que este tipo de autentificación sólo acepta encriptación MD5 bajo controladores dedominio de Windows Server 2003.

NTLM Es el mecanismo de autentificación de Windows 95, 98 y NT 4.0. Ofrece un sistema más completo que Basic yDigest.A partir de Windows 2000, se implementó con SSPI.

KERBEROS Estándar en Internet. Soportado a partir de Windows 2000 por medio de SSPI. Cuando se usa este tipo, SQLServer asocia su instancia principal con la cuenta que la está ejecutando.

INTEGRATED Este tipo prepara a nuestro EndPoint para que responda a los tipos de autentificación NTLM y KERBEROS.

Tabla 2

Podremos especificar tanto SOAP,como T-SQL, Service Broker o

incluso Database Mirroring

Page 35: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

GRANT [Tipo_de_acción]

ON ENDPOINT::Nombre_EndPoint TO SQL_Login

WITH GRANT OPTION

Tipo_de_acción puede tomar valores como Alter,Connect, Control, Take Ownership y View Definition. Paraejecutar este comando, es necesario que estemos enla base de datos Master. Por ejemplo, el comando:

USE Master

Go

GRANT CONNECT ON ENDPOINT::sql_DotNetMania

TO usr_Clave

Otorga permisos para poder usar el EndPoint connombre sql_dotnetmania al usuario usr_Clave. El pará-metro WITH GRANT OPTION indica que usr_Clave estarácapacitado para asignar este mismo permiso a otroslogins.

Para denegar cualquier tipo de acción sobre unservicio:

USE Master

Go

DENY [Tipo_de_acción]

ON ENDPOINT::Nombre_EndPoint

TO SQL_Login CASCADE

El funcionamiento es el mismo. El parámetro CAS-CADE indica que se debe propagar la denegación delpermiso a todos los logins a los que el denegado se lohaya garantizado previamente.

Y para eliminar cualquier permiso establecido odenegado previamente, usaremos:

USE Master

Go

REVOKE [Tipo_de_accion]

ON ENDPOINT::Nombre_EndPoint

[FROM | TO] SQL_Login

Algunos consejosComo contrapartida a la facilidad de creación de

HTTP EndPoints, tenemos que tener en cuenta queestamos trabajando con un servicio Web como cual-quier otro, pero que está directamente conectado a labase de datos, por lo que el nivel de seguridad tieneque ser extremo. Aquí se exponen las prácticas bási-cas para asegurar nuestros servicios Web.• Usaremos autentificación Kerberos. En la propie-

dad AUTHENTICATION, especificaremos siempreKerberos, o bien Integrated, que permitirá a Windowsseleccionar la autentificación NTLM o Kerberos.

• Limitaremos tanto como podamos el alcance delos permisos que otorguemos. Siempre intentare-mos asignar permisos exclusivamente a personas

o grupos de personas que necesiten tener accesoa estos servicios. Desde luego, nunca debemos asig-nar ningún permiso al rol público.

• Usar SSL para información confidencial. De estemodo permitiremos la encriptación de los conteni-dos confidenciales que circulen por la red. SQL Serverrequiere la configuración de un certificado. En estepunto, tendremos especial cuidado, pues si configu-ramos un certificado para el puerto 443 (puerto pordefecto de SSL), estaremos aplicándolo a todo el trá-fico que circule por ese puerto. Por ejemplo, IIS pue-de estar recibiendo información por el mismo puer-to. En este caso, el certificado les afectaría a los dos.

• Configurar estos servicios en servidores que esténtras un firewall.

• Asegurarse de que la cuenta Invitado está desha-bilitada en el sistema operativo.

Otro aspecto importante a tener en cuenta es el ren-dimiento de estos servicios. Si la solución maneja muchocódigo XML o si hace un uso intensivo de procedimientosalmacenados, el rendimiento que pueden ofrecer losHTTP EndPoints es considerablemente bueno, puestoque permiten compartir la lógica de negocio fácilmentecon otras aplicaciones. Por otro lado, si nuestra aplica-ción hace uso de procesos transaccionales críticos, o tra-bajamos con tipos muy grandes, como Binary Image oText, el rendimiento no será optimo. Tened en cuenta lasobrecarga que se genera al tener que convertir estosobjetos en mensajes SOAP. Además, estamos hablandode un formato basado en texto, diferente al formato bina-rio nativo de SQL Server, Tabular Data Stream (TDS).Esto significa que el tamaño de los datos a enviar aumen-tará entre un 20 y un 30%.

ConclusiónCon HTTP Endpoints, SQL Server 2005 nos ofre-

ce una forma sencilla de crear interfaces para servi-cios Web, Service Broker e incluso para DB-Mirroring.Ahora nos será mucho más fácil acceder a nuestro ser-vidor SQL Server desde lugares desde los que antesnos era muy trabajoso, como pudieran ser aplicacio-nes en sistemas no Windows, dispositivos móviles yun largo etcétera.

dotN

etM

anía

<<

35

dnm.servidores.sql<<

El apartado más importante es la configuración de los aspectos de seguridad de estos objetos

Page 36: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

Detección de problemas de rendimiento enSQL Server 2000 y SQL Server 2005 (IV)

En esta cuarta entrega nos vamos a centrar en analizar qué tipo de informaciónhay almacenada en la memoria de SQL Server, división del uso de la memoria ycómo detectar bloqueos con las nuevas DMV de SQL Server 2005.

<<

En el segundo artículo de la serie identificamosla actividad que había en la memoria (contadorescomo Memory:Pages/sec y Memory:Available Bytes,KBytes y MBytes deberían resultar familiares al lec-tor); ahora veremos cuáles son los límites de memo-ria a los que debe hacer frente SQL Server y ademáscómo está repartida dicha memoria. Para ello utili-zaremos dos herramientas: el monitor de rendimien-to y, por otro lado, comandos DBCC y vistas de sis-tema de SQL Server.

Monitor de rendimiento

SQL Server tiene dos contadores de rendimientoque indican cuánta es la memoria del servidor que se estáutilizando y cuánta es la memoria máxima a la que pue-de aspirar SQL Server (memoria objetivo). Como nor-ma general, en mediciones largas de tiempo, el valor dela memoria reservada (SQL Server Memory:MemoryManager:Total Server Memory), debería tener valores infe-riores al 80 por ciento de la memoria objetivo (SQL ServerMemory:Memory Manager:Target Server Memory).Cuando la memoria objetivo se encuentra por encimade esos porcentajes, nos está indicando que SQL Servernecesita más memoria de la que puede disponer, que nonecesariamente indicará falta de memoria física. Porejemplo, el mes pasado vimos cómo encontrar patronesde ejecución de consultas; ¿qué pasaría si encontráramosun patrón de consultas que se resuelve de forma inefi-

ciente? Imagínese que analiza el plan de ejecución de laconsulta y se da cuenta que no existe un índice apropia-do para la consulta. ¿Cómo resuelve SQL Server esaconsulta? Evidentemente, leyendo muchísima informa-ción –probablemente recorriéndose un índice comple-to, en lugar de realizar búsquedas de índice (por rango,o búsqueda directa)– lo cual implicaría que SQL Servertendría que acceder mucho a disco para recuperar lainformación necesaria para procesar la consulta y, a suvez, localizar espacio en memoria para alojar las lectu-ras realizadas.

Con contadores del monitor de rendimiento tam-bién podremos ver cuáles son los tipos de informa-ción que ocupan los buffers de memoria de SQLServer; los contadores para la versión 2000 son losque puede ver en la tabla 1.

Para SQL Server 2005, los contadores son casilos mismos, excepto el último que en lugar de ser

Eladio Rincón

dnm.servidores.sql

¿Cómo está desglosada la información almace-nada en la memoria?

Eladio RincónEs Director de Tecnología de

Bases de Datos de SolidQuality Learning y

colaborador habitual dedotNetManía. Es MVP en SQL

Server y uno de los fundadoresdel grupo de usuarios de SQL

Server en España GUSE.

SQL Server tiene dos contadores de rendimiento que indican cuánta es la

memoria del servidor que se está utilizandoy cuánta es la memoria máxima a la que

puede aspirar SQL Server

Page 37: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

SQLServer:Cache Manager, se ha cam-biado por SQLServer:Plan Cache. Paracalcular la memoria total usada por losobjetos que exponen cantidad de pági-nas, deberá multiplicar el valor por 8(una página = 8Kb).

Con estos contadores obtenemoscómo está desglosado el contenido de lamemoria; como la memoria es un recur-so limitado, debemos hacer seguimientode cómo distribuye SQL Server la memo-ria entre cada uno de sus componentes.Por ejemplo, si vemos que la memoria uti-lizada para caché de procedimiento es alta,estaremos forzando a que otros compo-nentes de SQL Server, como la memoriapara página de datos, vean reducida su áreade trabajo. Lo mismo sucede para otroscomponentes como la memoria de blo-queos, como veremos más adelante. Sinembargo, estos contadores de rendimien-to no serán válidos si el servidor SQLServer tiene habilitado el uso de memo-ria mediante AWE; para estos casos debe-rá analizarlo con comandos DBCC comovemos a continuación.

Comandos DBCC

Para sistemas con AWE habilitado,el comando DBCC MEMORYSTATUS devuel-ve información más precisa relativa ala distribución de la memoria; aunquela información presentada varía muchoentre la versión 2000 y la versión 2005,los valores que deseamos comprobar seencuentran presenten en ambas versio-nes. El comando devuelve una instan-tánea del reparto de memoria de SQLServer. Información sobre el comandose puede encontrar en los documentosde KB de Microsoft referenciados alfinal del artículo ([1] y [2]). En nues-tro caso utilizaremos la informaciónque muestra la versión 2000. El primerconjunto de resultados puede aparecercomo se ve en la tabla 2.

La columna buffers está expresadaen páginas de 8Kb, y la columna bufferdistribution indica:• Stolen, buffers reservados para orde-

naciones, operaciones hash, bloque-os, transacciones, etc.

• Free, buffers disponibles para usar.• Procedures, buffers usados para caché

de procedimiento: planes de ejecu-ción, contextos de ejecución de pro-cedimientos, etc.

• Inram, buffers “pinned”. En desuso,se puede hacer que una tabla per-manezca en memoria con el coman-do DBCC PINTABLE (en desuso).

• Dirty, buffers con datos modificadosque todavía no se han volcado a disco.

• Kept, sin uso en SQL Server 2000,2005.

• I/O, buffers a la espera de completaroperación de I/O.

• Latches, buffers adquiridos para ope-raciones de latches (bloqueos paragarantizar la consistencia física delmedio).

• Other, el resto de los buffers; es decirpáginas de datos confirmados, ypáginas de índices principalmente.

En la tabla 2 podemos ver que casila mitad de los buffers se utilizan paracaché de procedimiento. Este es un caso

que nos encontramos con más frecuen-cia de la deseada en el que gran partede la memoria disponible por SQLServer es utilizada para guardar planesde ejecución de las consultas que se pro-cesan en el servidor.

Cómo gestiona SQL Server el cachéde procedimiento

No voy a explicar el funcionamien-to completo del caché de procedimien-to porque me llevaría más de un artí-culo, pero pretendo que se quede conla idea de qué hace SQL Server con elcaché de procedimiento cuando recibepeticiones de consultas:• Cuando llega una consulta a SQL

Server (consulta ad hoc, llamada a pro-cedimiento almacenado, consultaparametrizada, etc.), lo primero quehace es validar si existe una coinciden-cia de la consulta en caché; en caso queno exista, la consulta se compila, segenera su plan de ejecución, se guar-da el plan en caché, y a continuaciónse procesa la consulta. En el momen-to en que el plan se guarda en caché,queda disponible para que otras cone-xiones puedan utilizarlo.

• ¿Qué pasaría si llega el mismopatrón de ejecución de nuevo? Enlugar de recompilarla, el servidorreutilizará la que ya tiene en caché.

Veamos en qué consiste el patrónde ejecución de las consultas con algu-nos ejemplos:

1.Select id, cantidad from

dbo.Orders where id = 1

2.Select id, cantidad from

dbo.Orders where id = 2

3.Select id, cantidad from

dbo.Orders where id = [par0]

4.Exec dbo.ObtenerPedidos @par0 = 1

5. Exec dbo.ObtenerPedidos @par0 = 2

Para SQL Server las consultas 1 y2 suponen dos planes de ejecucióndiferentes; sin embargo, si las consul-tas 1 y 2 hubieran sido parametriza-das, habrían utilizado el plan de eje-cución “genérico” 3. Por otro lado, lasconsultas 4 y 5 de igual manera com-parten el mismo plan de ejecuciónporque los argumentos son parame-trizados. Alrededor de este proceso

dotN

etM

anía

<<

37

dnm.servidores.sql<<

SQLServer:Buffer Manager Procedure cache pages Páginas en caché de procedimiento

SQLServer:Buffer Manager Total pages Páginas totales reservadas

SQLServer:Memory Manager Connection Memory Memoria para conexiones de usuario

SQLServer:Memory Manager Lock Memory Memoria para bloqueos

SQLServer:Memory Manager Optimizer Memory Memoria reservada por el optimizador

SQLServer:Cache Manager Cache Pages – _Total Páginas utilizadas totales por el caché

Tabla 1

Buffer Distribution Buffers

Stolen 4290

Free 388

Procedures 13510

Inram 0

Dirty 4238

Kept 0

I/O 0

Latched 168

Other 19436

Tabla 2

Page 38: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

hay políticas que sigue SQL Serverpara invalidar planes de ejecución,auto-parametrización de consultas,recompilación, etc., que se puedenconsultar en los documentos de refe-rencia [4]. Fíjese que esta estrategiaes parecida a la que seguimos en elartículo anterior referente a la bús-queda de patrones de ejecución deconsultas :-).

Veamos ahora cuál es el contenido delcaché de procedimiento; para ello usare-mos las vistas de sistema que tenemos enSQL Server, tanto 2000, como 2005.

Vistas de sistema de SQL Server

Para ver el contenido de la caché deprocedimientos usaremos la vista de sis-tema syscacheobjects que se encuentraen la base de datos master. En la versión2005 también se puede consultar, pero serecomienda hacerlo a través de las vistasdinámicas de administración (DMV) sys.dm_exec_cached_plans, y sys.dm_exec_sql_text. Son vistas muy descriptivas sobre lainformación que contienen; quizás la úni-ca novedad en SQL Server 2005 es quepara “cruzar” ambas vistas haremos usodel nuevo operador CROSS APPLY de lasiguiente forma:

select

c.usecounts, c.cacheobjtype,

c.objtype, s.text

from sys.dm_exec_cached_plans c

cross apply sys.dm_exec_sql_text

(c.plan_handle) s

La misma consulta en SQL Server2000, sería la siguiente:

selectc.usecounts, c.cacheobjtype, c.objtype, c.sql

from master.dbo.syscacheobjects c

Analicemos las columnas quedevuelve la consulta:• Usecounts: número de veces que se

ha usado el plan desde el momentoen que se insertó en caché.

• Cacheobjtype: tipo de objeto decaché almacenado; puede ser plancompilado, plan ejecutable, árbol

relacional, procedimiento alma-cenado extendido…• Objtype: el tipo de objeto

referenciado; valores comoconsulta ad-hoc, vista, proce-dimiento almacenado, trig-ger, sentencia preparada...,son algunos de los valores quepuede tener.

• Text (“sql” en SQL Server2000): los primeros 3.900caracteres de la sentenciainterpretada que se ejecutó.

Generalmente buscamos lafrecuencia con que se reutilizanlos planes de ejecución y ése esun valor que nos da la columnausecount. Si el valor de usecount

es muy bajo indica que ese plan de eje-cución es muy poco reutilizado. ¿Quéquiere decir esto? Que SQL Server tuvoque soportar el coste de compilar el plande ejecución de la consulta, ponerlo encaché, y luego se reutilizó muy poco.Este es un caso típico que se produce enaplicaciones cliente que envían consul-tas ad hoc al servidor. La consulta adhoc, normalmente, tiene que pasar porel proceso de compilación excepto enlos casos de autoparametrización. Sinembargo, usando procedimientos alma-cenados, al tener su plan de ejecuciónen caché, no es necesario recompilarlos(la excepción es el uso de la opción WITHRECOMPILE, o invalidación del plan porestadísticas desactualizadas de los obje-tos asociados al procedimiento almace-nado). En el siguiente artículo de estaserie, analizaremos los casos en los quepueda ser recomendable recompilar pla-nes de ejecución y buscaremos solucio-

nes a potenciales problemas del uso deplanes de ejecución en caché no ópti-mos para todos los tipos de llamadas.

BloqueosOtro de los problemas frecuentes

que encontramos en nuestros clientesson esperas causadas por bloqueos;como deben recordar del primer artí-culo de la serie, si tuviera problemas debloqueos, habrían sido reportados conlos comandos DBCC y DMV relacionadoscon waitstats. Sin embargo, estos pro-blemas suelen ser solucionados conestrategias adecuadas de indexación.Hasta ahora hemos estado hablando deminimizar el número de lecturas quedebe hacer el sistema de discos; normal-mente se consiguen buenos resultadosoptimizando las consultas más frecuen-tes; a su vez, esto supondría que el sis-tema procesaría las consultas en menostiempo y, por lo tanto, bloquearía menostiempo recursos de SQL Server comotablas, índices, filas, etc.

Sin embargo, habrá ocasiones en queexisten pequeños bloqueos que necesi-ta detectar y, al ser tan pequeños, noestarían reportados en las consultaspatrones creadas en el artículo anterior.Para ello utilizaremos la técnica quevamos a explicar en la siguiente sección.

Cómo detectar bloqueos

La vista de sistema master.dbo.sys-processes expone información sobre lasconexiones que están activas en el servi-dor; las conexiones de usuario comienzana partir de spid 51; los valores anteriores a51 (no quiere decir que utilice todos), SQLServer se los reserva para procesos dedi-cados a tareas específicas, por ejemplo pro-ceso de checkpoint, proceso de truncado deregistro de transacciones, proceso de loca-lización de abrazos mortales, etc. En SQLServer 2005, la DMV que expone la infor-mación que necesitamos es sys.dm_exec_requests.

Concretamente lo que estaremosbuscando será la columna blocked en laversión 2000 y la columna blocking_session_id en la versión 2005. Dichascolumnas indican cuál es el proceso queestá bloqueando al actual, por lo queintentaremos buscar lo siguiente:

dotN

etM

anía

<<

38

dnm.servidores.sql<<

NOTA

Desde la versión 7.0 de SQL Server,Microsoft dejó de dar soporte alcomando DBCC MEMUSAGE;la ideadel comando era muy interesanteporque reportaba los 20 objetos quemás memoria usaban,sin embargo,sihace uso del comando estarácorriendo un riesgo que debería ana-lizar si está dispuesto a asumir;en lalista de recursos puede ver el docu-mento de KB relacionado [3]

][

Page 39: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

En este caso concreto, la conexión55 está bloqueando a los procesos 52,53, 54 y 56. Fíjese que la conexión 55está bloqueando la tabla dbo.tabla yno permite que pueda ser accedidapor el resto de peticiones (incluso unavista).

Ahora que conocemos cuál es elresultado que queremos obtener, debe-mos definir:• La frecuencia con que se ejecuta el

análisis. El ejemplo será cada 2minutos.

• El tiempo de duración de los bloque-os. En el ejemplo será 20 segundos.

• Dónde se reportan los bloqueoslocalizados.

El proceso será encapsulado en unprocedimiento almacenado, que conuna frecuencia de 2 minutos “busca-rá” procesos bloqueados en el siste-ma; además tomará una muestra de losprocesos que se encuentran bloquea-dos (la columna blocked o blocking_session_id) y, pasados 20 segundos, setomará otra muestra para ver si toda-vía siguen bloqueados, en cuyo casose tomarán las medidas correspon-dientes de auditoría.

El pseudocódigo del proceso sería elsiguiente:

<cada 2 minutos><capturar_procesos_bloqueados en v1><esperar 20 segundos><capturar_procesos_bloqueados en v2><si procesos bloqueados en v1 y v2><auditar/reportar estado>

El código completo lo puedesencontrar en [5], sin embargo vamos aexplicar su parte más importante (verfuente 1).

La variable de tabla @t representalas conexiones bloqueadas y sus blo-queadores. Su resultado se cruza conla DMV sys.dm_exec_requests paraobtener el handler (referencia a la con-sulta en ejecución) de la sesión, y así

poder hacer una operación cross applycon la DMV sys.dm_exec_sql_text dela que obtenemos la sentencia SQLque se está ejecutando en ese momen-to. El resto de la consulta realiza lamisma operación, pero en este casopara obtener información sobre elproceso bloqueador.

ConclusionesEn este artículo hemos visto cómo

analizar la distribución de la memoriade SQL Server entre los componen-tes del motor. También hemos apren-dido a ver el contenido del caché deprocedimiento e identificar la frecuen-cia de uso de los planes de ejecuciónlocalizados en memoria. Asimismohemos aprendido a localizar procesosque intervienen en bloqueos, desglo-

sando el bloqueo endos partes: el procesoque bloquea y los pro-cesos que sufren el blo-queo; de esta forma sepueden desarrollarprácticas de auditoríaen sus sistemas paradetectar largos tiemposde ejecución causadospor bloqueos.

dotN

etM

anía

<<

39

dnm.servidores.sql<<

Id_conexión Id_bloqueador sql_conexion sql_bloqueador

53 55 select * from dbo.tablawhere condicion

delete from dbo.tablawhere condicion

54 55 update dbo.tabla where condicion

delete from dbo.tablawhere condicion

56 55 select * from dbo.tablawhere condicion

delete from dbo.tablawhere condicion

52 55 select * from dbo.vistawhere condicion

delete from dbo.tablawhere condicion

Tabla 3

Referencias

[1]INF: Using DBCC MEMORYSTATUS toMonitor SQL Server Memory Usagehttp://support.microsoft.com/kb/271624/en-us

[2]

How to use the DBCC MEMORYSTATUScommand to monitor memory usage on SQLServer 2005. http://support.microsoft.com/kb/907877/en-us

[3]

BUG: DBCC MEMUSAGE Is Not Supportedin SQL Server 7.0. http://support.microsoft . com/default .aspx?sc id=kb;en-us;196629

[4]

Batch Compilation, Recompilation, and PlanCaching Issues in SQL Server 2005.http://www.microsoft.com/technet/prodtechnol/sql/2005/recomp.mspx

[5]

Cómo capturar procesos bloqueadores y procesosbloqueados en SQL Server 2005. http://siquel-net.etraducciones.com/default.aspx?Tema=MSSQL05&Seccion=ADM05&Articulo=003.xml

[6]

Hands-On SQL Server 2000 Troubleshooting:Locking and blocking de NetImpress. eBookescrito por Kalen Delaney en el que ana-liza todos los pormenores de los bloqueos,tipos de bloqueos, captura de bloqueos yabrazos mortales. Sólo se puede adquirir enformato electrónico en librerías virtuales.

NOTA

Fíjese que se hace una operación left join con el proceso bloqueador por-que es posible que el proceso que está bloqueando no se encuentre enejecución.

Para finalizar, el proceso puede rellenar los resultados en una tabla paraanalizarlo posteriormente, puede enviar un correo electrónico a una listade destinatarios,o incluso se puede configurar para matar al proceso queestá causando los bloqueos con el comando KILL. Mi recomendación esregistrarlo en una tabla para posteriormente analizar (y tirar del hilo),paraencontrar el proceso de negocio asociado a los bloqueos.

][

select cur1.session_id, cur1.blocking_session_id,sql1.text sql_bloqued, sql2.text sql_bloquer

from sys.dm_exec_requests cur1join @t laston cur1.session_id = last.session_id

cross apply sys.dm_exec_sql_text(cur1.sql_handle) sql1left join sys.dm_exec_requests cur2on cur2.session_id = last.blocking_session_id

outer apply sys.dm_exec_sql_text(cur2.sql_handle) sql2

Fuente 1

Page 40: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos
Page 41: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

Como pudimos comprobar en el número anterior,crear un formulario para acceder a una tabla o a un pro-cedimiento almacenado es muy fácil si nos apoyamos enlos asistentes de acceso a datos que Visual Studio 2005(y con sus limitaciones, las versiones Express) pone anuestra disposición. Pero algunos programadores de la“vieja escuela” preferimos o nos gusta más escribir códi-go para obtener casi la misma funcionalidad. Por tanto,en esta ocasión vamos a crear un proyecto en el que ten-dremos la misma funcionalidad que vimos en el núme-ro anterior, pero escribiendo todo el código de formamanual. Hacerlo de esta forma no es solo por caprichoo masoquismo, sino porque así tendremos una pers-pectiva diferente que nos permitirá entender mejor cómorealizar las tareas comunes de acceso a datos conADO.NET 2.0.

Detalles del proyecto que realizaremosusando solo código

Como hemos comentado anteriormente, creare-mos un proyecto que nos permitirá hacer, de formamanual, lo mismo que hicimos en el número ante-rior. Y para facilitar la tarea, vamos a relacionar lospasos que seguiremos para conseguir nuestro propó-sito, aunque antes resumiremos brevemente qué fun-cionalidad tendremos en nuestro proyecto.

El proyecto nos permitirá acceder a una base de datoscreada con SQL Server 2005 que estará definida en lainstancia de SQLEXPRESS. Esa base de datos será la mis-

ma que usamos en el número anterior (pruebaGuille) yque podremos crear usando una utilidad que incluimosen el ZIP con el código de ejemplo. Crearemos dos for-mularios; uno de ellos nos permitirá mostrar, modificary añadir nuevos datos, y el formato que usaremos con-sistirá en mostrar cada campo de la tabla (Prueba) en unacaja de texto. Además tendremos un segundo formula-rio en el que mostraremos los datos en un controlDataGridView; esos datos los obtendremos por medio deun procedimiento almacenado (StoredProcedure1) al quele indicaremos la fecha a partir de la que queremos mos-trar dichos datos.

Preparativos para realizar la conexión ala base de datos

Para poder acceder a los datos, tendremos queconectarnos a la base de datos que será del tipo SQLServer 2005, creada en la instancia de SQL Express,aunque no necesariamente tiene por qué ser así. Pararealizar dicha conexión, tendremos que establecer lacadena de conexión que le indicará a ADO.NET lascaracterísticas de la base de datos a acceder. Dichacadena será la siguiente:

Data Source=(local)\SQLEXPRESS;

Initial Catalog=pruebaGuille;

Integrated Security=True

Particularmente, tendremos que crear un objetode la clase SqlDataAdapter del espacio de nombres

Acceso a datos con ADO.NET 2.0 (sin asistentes)

Tal como comentamos en el número anterior, en esta ocasión vamos a ver cómopodemos acceder a una base de datos usando única y exclusivamente código, esdecir, sin usar los asistentes que Visual Studio 2005 pone a nuestra disposición yque, en honor a la verdad, a muchos les facilitará la tarea de crear aplicacionesADO.NET de una forma bastante sencilla.

<< Acceso a datos sin asistentes

dnm.inicio.fundamentos

Guillermo “Guille” Som

dnm.incio.taller

Guillermo “Guille” Somes Microsoft MVP de Visual Basic

desde 1997. Es redactor dedotNetManía,miembro de Ineta

Speakers Bureau Latin America,mentor de Solid Quality LearningIberoamérica y autor del libroManual Imprescindible de Visual

Basic .NET.http://www.elguille.info

dotN

etM

anía

<<

41

Page 42: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

SqlClient. Entre otras cosas, a ese objeto le podemospasar la mencionada cadena de conexión, además dela selección de los datos que queremos manipular. Laselección de datos que haremos será la de todas lascolumnas y todas las filas de la tabla Prueba, quedan-do dicha cadena de esta forma:

SELECT * FROM Prueba

Esta cadena la podemos adaptar a los datos que que-ramos manipular, y no solo podemos indicarla como unasentencia “directa” sino que también podemos usar unprocedimiento almacenado que hayamos definido ennuestra base de datos. En este primer ejemplo “manual”o sin asistentes usaremos un procedimiento almacena-do para seleccionar los datos que se hayan modificado apartir de una fecha. En una próxima ocasión veremosmás ejemplos en los que usaremos procedimientos alma-cenados no solo para mostrar o recuperar los datos, sinotambién para realizar operaciones de actualización, etc.Incluso crearemos esos procedimientos almacenadosusando código de C# (y de VB), pero por ahora es pre-ferible dejar las cosas simples.

La cadena de conexión la vamos a guardar en losdatos de configuración de la aplicación. Para ello usare-mos la ficha “Configuración” de las propiedades de laaplicación. Tal como podemos ver en la figura 1, en elnombre asignaremos conexionGuille y en el ámbito selec-cionaremos “Aplicación”; esto hará que se añada a nues-tro proyecto un fichero llamado app.config que será elque contenga todos los valores añadidos con el ámbitode aplicación; esos valores serán de solo lectura.

Para acceder a los valores de configuración pode-mos agregar una importación del espacio de nombresProperties que estará incluido en el espacio de nom-bres de nuestra aplicación. Por ejemplo, si el espaciode nombres predeterminado es sinAsistentesCS, ten-dremos que añadir la siguiente línea al principio delos ficheros de código en los que vayamos a usar esosdatos de configuración:

using sinAsistentesCS.Properties;

Esto nos permitirá acceder a ese valor de la siguien-te forma:

string cadenaConexion =

Settings.Default.conexionGuille;

Si no añadimos esa importación tendremos que acce-der a los valores de configuración indicando el espaciode nombres en el que está definida la clase Settings:

string cadenaConexion =

Properties.Settings.Default.conexionGuille;

Realizar la conexión a la base de datosUna vez que tenemos preparada la cadena de cone-

xión a la base de datos que queremos usar, es hora depreparar las clases de ADO.NET que nos permitiránrealizar la conexión y el acceso real a esos datos.Inicialmente necesitaremos un objeto del tipoSqlDataAdapter, que será el que se encargue de conec-tar a la base de datos. También necesitaremos un obje-to de tipo DataSet o DataTable, el cual recibirá los datosque indiquemos en la cadena de selección. Debido aque solo accederemos a los datos de una tabla, nosresultará más simple usar un objeto del tipo DataTable,ya que un objeto DataSet, entre otras cosas, puedecontener varias tablas, las relaciones entre ellas, etc.;por tanto no lo necesitaremos en esta ocasión.

En el fuente 1 podemos ver el código necesariopara realizar la conexión a la base de datos indicadaen el parámetro de configuración conexionGuille queanteriormente asignamos en las propiedades de la apli-cación; esa cadena de conexión la indicamos en el cons-

dotN

etM

anía

<<

42

dnm.inicio.taller<<

Figura 1.Asignar la cadena de conexión a laspropiedades de configuración.

NOTA

En Visual Basic 2005, los datos de configu-ración están incluidos en My.Settings, y pode-mos acceder a la cadena de conexión usando:

Dim cadenaConexion As String =

My.Settings.conexionGuille][

Fuente 1. Creamos los objetos que usaremos para acceder a losdatos de la base de SQL Server.

string cadenaConexion = Properties.Settings.Default.conexionGuille;

string sel = “SELECT * FROM Prueba”;

da = new SqlDataAdapter(sel, cadenaConexion);dt = new DataTable();

da.Fill(dt);

Page 43: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

tructor del objeto SqlDataAdapter, al que también leindicamos la cadena de selección con idea de que sepaqué datos debe traer de la base de datos para asignar-los al objeto DataTable, acción que indicamos median-te el método Fill del adaptador.

Crear los comandos de actualización,inserción y eliminación

Si nuestra intención es poder añadir, eliminar ymodificar los datos que manipularemos, tenemosque indicar los comandos correspondientes paraestas tres acciones. Esos comandos (que no son otracosa que instrucciones de Transact-SQL), los pode-mos crear de forma automática por medio de la cla-se SqlCommandBuilder, a cuyo constructor le pasare-mos un objeto del tipo SqlDataAdapter. Los mencio-nados comandos se crearán basándose en la cadena deselección que hemos utilizado, pero de esos detallesno tenemos que preocuparnos, ya que lo único quetenemos que hacer es algo como esto:

SqlCommandBuilder cb = new

SqlCommandBuilder(da);

Si usamos una tabla en la que tenemos un índi-ce automático, debemos asignar a la propiedadMissingSchemaAction del DataAdapter el valorAddWithKey, de forma que se genere automáticamen-te el valor del campo autoincremental. La asignaciónla haremos de esta forma:

da.MissingSchemaAction =

MissingSchemaAction.AddWithKey;

Dar funcionalidad a la aplicaciónUna vez que tenemos los datos en el objeto DataTable,

ya solo nos queda mostrar los datos, añadir nuevos, eli-minar y actualizar los cambios y, cuando creamos con-veniente, guardar esos cambios en la base de datos.

Debido a que no estamos usando un asistente, seránuestro trabajo la creación completa de la interfaz delusuario, por tanto tendremos que agregar los con-troles en los que mostraremos los datos, así como losbotones que nos permitirán navegar por los registrosde la tabla que vamos a utilizar.

Nuestro formulario de prueba tendrá el aspecto mos-trado en la figura 2, que como podemos comprobar esmuy parecido al que el propio asistente de Visual Studio2005 crearía. Aunque en esta aplicación de ejemplo hayciertos cambios, y no nos referimos solo a cambios enlas imágenes usadas, o en el número de botones.

En esta aplicación usaremos un control CheckBoxpara indicar si queremos asignar automáticamente loscambios que realicemos a los datos de la tabla; de estaforma, cada vez que nos desplacemos entre los regis-

tros, se guardarán los cambios que hayamos hecho.Pero si no queremos disponer de esta funcionalidad“auto-asignadora”, podemos quitar la marca de ese con-trol y será responsabilidad nuestra si guardamos o nolos cambios que realicemos. Para ese caso, tenemos elbotón de actualizar (la imagen con un disquete). Porsupuesto, esas asignaciones se harán solo si los datosrealmente han cambiado, comprobación que hacemoscada vez que cambia el contenido de las cajas de textoso el control DateTimePicker. Cuando los eventos decambio de esos controles se disparan, lo que hacemoses comprobar si realmente el contenido ha cambiado(ver el fuente 2), de forma que si se vuelve a dejar elmismo contenido que había antes, el registro no debemarcarse como modificado.

Moverse por los registros de la tabla,actualizando si es necesario

Como podemos comprobar en el código del fuen-te 2, tenemos una variable (filaActual) que controla lafila o registro con el que estamos trabajando en cadamomento, y es por medio de esa variable con la que

dotN

etM

anía

<<

43

dnm.inicio.taller<<

Figura 2. El formulario principal en modode diseño

Fuente 2. La función que comprueba si se ha modificado el contenido de las cajas detexto usadas para introducir los datos

private bool comprobarCambiado(){

bool cambiado = false;

if( txtNombre.Text != dt.Rows[filaActual][“Nombre”].ToString())cambiado = true;

if( txtEmail.Text != dt.Rows[filaActual][“e-mail”].ToString() )cambiado = true;

if( Convert.ToDateTime( txtFechaAlta.Text).Date.CompareTo( Convert.ToDateTime( dt.Rows[filaActual][“FechaAlta”]).Date) != 0 )cambiado = true;

if( txtComentario.Text != dt.Rows[filaActual][“Comentario”].ToString())cambiado = true;

return cambiado;}

Page 44: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

navegamos usando los primeros cuatro botones de labarra de herramientas. En cada método de evento deesos botones hacemos la asignación correspondiente paramantener adecuadamente el valor de la fila actual, y des-pués simplemente llamamos a un método que será el quese encargue de mostrar la información en las cajas detexto correspondientes. En ese mismo método (que pode-mos ver en el fuente 3), hacemos ciertas comprobacio-nes adicionales, con idea de que el valor de la fila actualesté en el rango adecuado, además de comprobar si tene-mos que guardar los datos o no.

Como podemos comprobar, será en el métodomostrarDatos en el que tendremos que escribir el códi-go necesario para mostrar los datos en los controles.Como es de suponer, si la fila que intentamos mostrarestá eliminada, simplemente salimos sin mostrar nada,aunque debemos comprobar a qué fila debemos despla-zarnos; esa parte la veremos a la hora de eliminar losregistros. En ese mismo método asignamos el valor aotra variable (filaAnt) que nos será de utilidad en el casode que haya cambiado el contenido de los controles, yla usaremos para indicar en qué fila debemos hacer laasignación de dichos cambios. Esta comprobación lahacemos en el método comprobarActualizar, desde elque llamamos al método actualizarDatos, que recibecomo parámetro la fila que hay que actualizar, tal comopodemos comprobar en el fuente 4.

Como vemos, también hay un solo método en el quehacemos todo lo necesario para asignar los cambios a lafila que se ha modificado. El método actualizarDatosrecibe un parámetro con el índice de la fila modificadaporque nos servirá también en caso de que pulsemos enel botón “Actualizar”, aunque en ese caso, el registro quedebemos asignar es el de la fila actual (ver fuente 5). Poresa razón, en vez de usar una de las variables “globales”hemos optado por usar un parámetro.

Eliminar y crear nuevos registros

Las otras dos acciones que utilizaremos para elimi-nar datos o para crear nuevos en principio no tienen

dotN

etM

anía

<<

44

dnm.inicio.taller<<

Fuente 3. Los métodos de navegación y el encargado de mostrar los datos en los controles

private void btnPrimero_Click(object sender, EventArgs e){

filaActual = 0;mostrarDatos();

}

private void btnAnterior_Click(object sender, EventArgs e){

filaActual—;mostrarDatos();

}

private void btnSiguiente_Click(object sender, EventArgs e){

filaActual++;mostrarDatos();

}

private void btnUltimo_Click(object sender, EventArgs e){

filaActual = dt.Rows.Count - 1;mostrarDatos();

}

private void mostrarDatos(){

if( dt.Rows.Count < 1 )return;

if( filaActual < 0 )filaActual = 0;

if( filaActual >= dt.Rows.Count - 1 )filaActual = dt.Rows.Count - 1;

if(dt.Rows[filaActual].RowState == DataRowState.Deleted){

// TODO: Comprobar a qué fila podemos desplazarnosreturn;

}

comprobarActualizar();filaAnt = filaActual;

txtID.Text = dt.Rows[filaActual][“ID”].ToString();txtNombre.Text = dt.Rows[filaActual][“Nombre”].ToString();txtEmail.Text = dt.Rows[filaActual][“e-mail”].ToString();txtFechaAlta.Text = dt.Rows[filaActual][“FechaAlta”].ToString();txtComentario.Text = dt.Rows[filaActual][“Comentario”].ToString();

txtActual.Text = (filaActual + 1).ToString();modificado = false;

}

Fuente 4.El código para asignar los cambios a la fila correspondientey el que comprueba si se deben actualizar los datos

private void comprobarActualizar(){

if(chkActualizarAuto.Checked && modificado && (filaActual != filaAnt))actualizarDatos(filaAnt);

}

private void actualizarDatos(int fila){

dt.Rows[fila][“Nombre”] = txtNombre.Text;dt.Rows[fila][“e-mail”] = txtEmail.Text;dt.Rows[fila][“FechaAlta”] =

Convert.ToDateTime(txtFechaAlta.Text);dt.Rows[fila][“Comentario”] = txtComentario.Text;

modificado = false;btnGuardarEnBase.Enabled = true;

}

Fuente 5. El método del evento del botón para actualizar

private void btnActualizar_Click(object sender,EventArgs e){

actualizarDatos(filaActual);}

Page 45: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

mayores complicaciones; al menos la de crear nuevosdatos, ya que simplemente añadiremos una nueva fila ala colección de filas de la tabla. Esa acción, tal como vemosen el fuente 6, consiste en obtener una nueva fila (DataRow)que nos proporciona el objeto DataTable, asignar los valo-res predeterminados que creamos conveniente y final-mente añadirla a la colección Rows.

A la hora de eliminar registros tampoco tendre-mos que hacer demasiado, ya que como vemos en elfuente 7, solo tenemos que llamar al método Deletede la fila actual.

Como vemos, el problema de eliminar registrosno está en la forma de eliminarlos, sino a la hora denavegar entre los registros, ya que es posible que nosencontremos con un registro eliminado, en cuyo casono debemos mostrarlo. En realidad, el problema noslo podremos encontrar cuando queramos navegar alprimero o al último y éstos estén eliminados, o inclu-so si hay varios seguidos que están eliminados. Portanto, en el método mostrarDatos debemos tener encuenta estas posibilidades y no “intentar” mostrar losdatos de los registros eliminados.

Para que todo funcione correctamente, debemoscambiar la comprobación de si la fila está eliminadaque mostramos en el fuente 3 por la del código fuen-te 8, de esa forma no entraremos en un bucle sin finque finalmente resultaría en un error de desborda-miento de la pila (stack overflow).

Guardar los cambios realizados en la basede datos

La forma en que estamos tratando los datos es de for-ma desconectada, es decir, esos datos los estamos mani-

dotN

etM

anía

<<

45

dnm.inicio.taller<<

Fuente 6. El código para crear nuevos registros

private void btnNuevo_Click(object sender, EventArgs e){

// Comprobar si los datos actuales hay queguardarlos automáticamente

comprobarActualizar();

DataRow dr = dt.NewRow();dr[“Nombre”] = “Nuevo”;dr[“FechaAlta”] = DateTime.Now;dt.Rows.Add(dr);btnGuardarEnBase.Enabled = true;habilitarBotones();btnUltimo.PerformClick();

}

Fuente 7. El método para eliminar registros

private void btnBorrar_Click(object sender, EventArgs e){

// Eliminar la fila actual// Comprobar si los datos actuales hay que

guardarlos automáticamentecomprobarActualizar();// Confirmar el borradoif( MessageBox.Show(“...”) == DialogResult.Yes ){

dt.Rows[filaActual].Delete();

btnGuardarEnBase.Enabled = true;

modificado = false;btnSiguiente.PerformClick();

}}

Fuente 8. Comprobación a incluir en el método mostrarDatos, de qué fila está disponible cuando hemos eliminado algunas

if( dt.Rows[filaActual].RowState == DataRowState.Deleted ){// Comprobar a qué fila podemos desplazarnos// Si la primera está borrada, buscar la siguiente que no lo estéif( filaActual == 0 ){

for( int i = filaActual + 1; i < dt.Rows.Count; i++ ){

if( dt.Rows[filaActual].RowState == DataRowState.Deleted ){

filaActual++;}else{

filaActual—;break;

}}btnSiguiente.PerformClick();return;

}else{

// Si la última está borrada, buscar la anterior que no lo estéif( filaActual == dt.Rows.Count - 1 ){

for( int i = filaActual - 1; i >= 0; i— ){

if( dt.Rows[filaActual].RowState == DataRowState.Deleted ){

filaActual—;}else{

filaActual++;break;

}}btnAnterior.PerformClick();return;

}}

if( (filaActual - filaAnt) >= 0 )btnSiguiente.PerformClick();

elsebtnAnterior.PerformClick();

return;}

Page 46: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

pulando en nuestro equipo, pero los cambios no se estánreflejando en la base de datos. Por tanto, si queremosque todos esos cambios se hagan efectivos en la base dedatos, debemos pulsar en el botón con el icono de variosdisquetes. Desde el método gestor de ese evento le indi-caremos al DataAdapterque use las instrucciones de actua-lización, eliminación o inserción que correspondan, locual logramos llamando al método Update del objetoSqlDataAdapter pasándole como parámetro la tabla quecontiene las filas modificadas, y finalmente le indicare-mos a la tabla que acepte los cambios. Todo esto lo hace-mos por medio de dos líneas de código, tal como pode-mos ver en el fuente 9.

Mostrar los datos a partir de una consul-ta realizada con un procedimiento alma-cenado

Por razones obvias de espacio no podremos ver condetalle la parte que nos falta de este proyecto: mostrarlos datos por medio de una consulta usando un proce-dimiento almacenado de SQL Server; pero al menosveremos el código que tendremos que usar, que ejecu-

taremos desde otro formulario (ver figura 3) en el quetendremos un control DataGridView y los controles paranavegar entre los registros mostrados, además de la cajade texto en la que indicaremos la fecha a usar para la con-sulta y el botón “Buscar” que será el encargado de asig-nar al grid los datos a mostrar.

En el fuente 10 tenemos el código de ese métodode búsqueda.

ConclusionesComo hemos visto, no es tan complicado crear códi-

go para acceder a datos sin apoyarnos en los asistentesde Visual Studio 2005, y la ventaja es que sobre este códi-go tenemos más control que en el caso del código gene-rado de forma automática. Sí, tiene un poco de más tra-bajo, pero en realidad lo más laborioso es el tema deldiseño del formulario de introducción de datos, el cualaunque lo generara el propio Visual Studio con sus asis-tentes seguramente acabaríamos modificando para adap-tarlo a nuestro gusto. Pero gracias a los nuevos contro-les y nuevas ayudas del diseñador de formularios de VisualStudio 2005, esto será una tarea relativamente fácil.

Como siempre, en el ZIP con el código completodel ejemplo usado en este artículo encontrarás tanto laversión para C# como para Visual Basic 2005.

dotN

etM

anía

<<

46

dnm.inicio.taller<<

Fuente 9.Debemos guardar en la base de datos los cambios realizados localmente

private void btnGuardarEnBase_Click(object sender, EventArgs e){try{

// Comprobar si los datos actuales hay que guardarlos automáticamentecomprobarActualizar();

da.Update(dt);dt.AcceptChanges();

btnGuardarEnBase.Enabled = false;}catch(Exception ex){

MessageBox.Show(“Error al guardar los datos en la base\n” +ex.Message, “Error”);

}}

private void btnBuscar_Click(object sender, EventArgs e){string cadenaConexion = Properties.Settings.Default.conexionGuille;try{SqlDataAdapter da = new SqlDataAdapter(“StoredProcedure1”,

cadenaConexion);da.SelectCommand.CommandType = CommandType.StoredProcedure;da.SelectCommand.Parameters.Add(“@Param1”, SqlDbType.DateTime);da.SelectCommand.Parameters[“@Param1”].Value =

Convert.ToDateTime(txtFecha.Text);

DataTable dt = new DataTable();da.Fill(dt);

if( dt.Rows.Count > 0 ){

dgvDatos.DataSource = dt;habilitarBotones(true);

}else{

dgvDatos.DataSource = null;habilitarBotones(false);

}filaActual = filaAnt = 0;mostrarDatos();

}catch(Exception ex){

MessageBox.Show(“Error\n\n” + ex.Message, “Error”);}}

Figura 3. El formulario usado para mostrar los datosa partir de una fecha

Fuente 10. El método para buscar datos usando un procedimiento almacenado

Page 47: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

dotN

etM

anía

<<

47

o mantenéis aplicacionesque generan informes semanal o mensualmente? Es unatarea común en muchas compañías y muchos camposde la industria. Hace unos años, Microsoft introdujoReporting Services como un añadido a SQL Server2000. Hoy la herramienta ha evolucionado y se acom-paña con sendos controles Windows y Web que mues-tran los informes del servidor, pero son también capa-ces de realizar gran parte del procesamiento en el clien-te con una mínima degradación de rendimiento.

¿Cómo crear informes imprimibles conASP.NET? ¿Los Reporting Services de SQL Serverson un requisito? Me gustaría crearlo como un PDFo una página Web navegable.

En Visual Studio 2005, hizo su debut un nuevocontrol –el control ReportViewer–. Está diseñado parapermitirte añadir características avanzadas de gene-ración de informes en las aplicaciones. Existen dosversiones del control, para aplicaciones Windows yWeb. Vamos a centrarnos en el control ASP.NET deservidor, ya que has mencionado esta opción expre-samente. Sin embargo, el comportamiento del con-trol Windows es muy similar.

Como sugiere el nombre, el control ReportViewermuestra un informe al usuario, pero no suministracapacidades de manipulación de datos. Esto es, seprecisa de la presencia de un origen de datos válido.A este respecto, funciona tanto en modo de procesa-miento local o remoto.

Cuando se trabaja en modo local, la definicióndel informe se toma de un fichero con extensión.rdlc. El fichero puede se referenciado por su nom-bre y ser local a la aplicación o funcionar como unrecurso incrustado en el ensamblado. En este caso,

el control abre una definición, la procesa y la cargaen el área de visualización.

En modo de procesamiento remoto, sin embargo,el control recupera un informe de un servidor con SQLServer 2005 Reporting Services instalado. Todo el pro-cesamiento de datos e interpretación estructural de losmismos se realiza en el servidor y requiere de la presen-cia de informes publicados previamente.

Para usar el visor de informes en modo remoto,se necesita una copia licenciada de SQL Server 2005Reporting Services. El procesamiento remoto ofre-ce una mayor escalabilidad y rendimiento y ofrececaracterísticas adicionales, tales como el uso de cachésy nuevos formatos de salida de informes.

Demos un rápido paseo por el visor de informes,y veamos cómo se construye un informe local.Comenzamos por añadir un control ReportViewer aun formulario Web y establecer su propiedadReportPath. La propiedad indica la fuente para elinforme a mostrar. Para proceso local, debe ser unfichero con extensión .rdlc. ¿Cómo se crea? Añadesun nuevo ítem al proyecto del tipo Informe (Report file).Después de abrir el RDLC para edición, los conteni-dos del cuadro de herramientas cambian para mostrarla lista de ítems disponibles. Añadamos una tabla y unobjeto Chart.

Lo siguiente es que tienes que especificar el ori-gen de datos para el informe. Seleccionamos “Orígenesde Datos del sitio Web” y optamos por la opción“Crear un Nuevo Origen de Datos”. El familiar asis-tente nos guiará en los pasos necesarios para la crea-ción de un DataSet con estructura, a partir de una con-sulta. Ahí se especifica la consulta a agregar e incluirdesde la base de datos. Pongamos esta misma:

Informes,autenticación y actualización por lotes

Dino Esposito

dnm.todotnet.qa

<< ¿Cuántos de vosotros escribís

Dino Esposito es mentor de Solid Quality

Learning y autor de “ProgrammingMicrosoft ASP.NET 2.0 CoreReference” y “Programming

ASP.NET 2.0 Applications AdvancedTopics”, ambos de Microsoft

Press.Afincado en Italia,Dino esun ponente habitual en los

eventos de la industria a nivelmundial.Visite su blog en:

http://weblogs.asp.net/despos.Puede enviarle sus consultas [email protected]

Esta semana, la primera de las 3 preguntas de rigor resuelve problemas relacionadoscon Reporting en ASP.NET.Otras preguntas se centran en la autenticación por Internety las actualizaciones por lotes en ADO.NET.

Page 48: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

dotN

etM

anía

<<

48

dnm.laboratorio.net<<

La consulta recupera la cantidad total de ventaspara cada uno de los empleados de la base de datosNorthwind en un año en concreto. Los datos recupe-rados muestran dos columnas, Employee (tipo String)y Sales (tipo double). Para mostrar los resultados dela consulta en el área de la tabla del informe, arrastra-mos los nombres de las columnas desde la ventana delexplorador de orígenes de datos. De igual forma, debe-mos seleccionar qué columnas suministran los datospara las series y cuáles las de las categorías. En estepunto la definición del informe está terminada. Puedemejorársele, posteriormente, incluyendo algún gráfi-co o información de estilo.

Para ser precisos, el informe simplemente contie-ne información de correspondencia entre un origende datos concreto y sus áreas visuales constituyentes:la tabla y el objeto Chart. La vinculación física delinforme con sus datos sucede a través del visor deinformes. El siguiente código de marcado expresa larelación entre ambos:

El visor de informes está enlazado a uno o más con-troles ObjectDataSource, cada uno de ellos apuntando aun adaptador de tabla o a un objeto de negocio defini-do por el usuario. El visor de informes puede enlazarmúltiples orígenes de datos debido a que –a su vez– elinforme puede contener varias vistas de datos, mostran-do distintos conjuntos de información. La figura 1 mues-tra un informe simple en una página ASP.NET.

Como puede verse, la salida del control en pan-talla contiene una barra de herramientas donde pue-de navegarse para seleccionar el formato de expor-

tación a PDF o Excel. Como ya hemos menciona-do, hay más formatos disponibles (así como servi-cios de caché) si el informe se genera medianteReporting Services.

Estamos construyendo una aplicación Web y que-remos que cualquier usuario se autentique de formaautomática en ASP.NET utilizando su propia cuen-ta de acceso. Todos los ejemplos de autenticaciónForms que hemos encontrado usan una base de datospara comprobar las credenciales. ¿Qué estamoshaciendo mal?

En teoría, las aplicaciones ASP.NET soportancuatro modos de autenticación: None, Passport,Windows y Forms. Se selecciona el adecuado en elfichero Web.Config a través de la sección <authenti-cation> en su atributo mode. En su conjunto, solo tie-nen sentido los dos últimos para la mayoría de apli-caciones Web.

El modo None, significa que no hay autentica-ción de ninguna clase. De cualquier forma, se tra-ta de una forma recomendada para aplicaciones decarácter anónimo ya que deshabilita el módulo deautenticación haciendo que el proceso de solicitudsea más rápido.

El modo Passport requiere que el usuario haya pasa-do por el proceso de adhesión a la iniciativa Passport,y, cuando se requiera autenticación, el usuario es redi-rigido al sitio Web de Passport donde se compruebansus credenciales. Olvida esta opción si estás constru-yendo una intranet o si la compañía no es parte delgrupo Passport.

Los dos modos restantes, –Windows y Forms–apuntan a escenarios distintos. El modo Forms espara aplicaciones Web en las que el códigoASP.NET es el encargado de comprobar las cre-denciales contra un almacén de datos administra-

1 Nota del traductor: tomada de la base de datos Northwind, que se instala de forma predeterminada en SQL Server 2000, perono en SQL Server 2005.

Figura 1. Un informe simple, mostrado mediante el control ReportViewer

SELECT e.lastname AS Employee, SUM(price) AS Sales FROM (SELECT o.employeeid, od.orderid, SUM(od.quantity*od.unitprice) AS price

FROM Orders o, [Order Details] odWHERE Year(o.orderdate) = @year AND od.orderid=o.orderid GROUP BY o.employeeid, od.orderid ) AS t1

INNER JOIN Employees e ON t1.employeeid=e.employeeid GROUP BY t1.employeeid, e.lastname1

Fuente 1

<rsweb:ReportViewer ID="ReportViewer1" runat="server" Width="100%"><LocalReport ReportPath="Samples\Core\Live\MyReport.rdlc">

<DataSources><rsweb:ReportDataSource DataSourceId="ObjectDataSource1"

Name="DataSet2_Employees" /></DataSources>

</LocalReport></rsweb:ReportViewer>

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="GetData"TypeName="DataSet2TableAdapters.EmployeesTableAdapter">

<SelectParameters><asp:Parameter DefaultValue="1997" Name="year" Type="Decimal" />

</SelectParameters></asp:ObjectDataSource>

Fuente 2

Page 49: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

dotN

etM

anía

<<

49

dnm.laboratorio.net<<

do por el usuario. El modo Windows es para aplica-ciones de intranet.

Cuando IIS recibe una petición de ASP.NET, pri-mero acredita al usuario utilizando el esquema deautenticación activo: Basic, Digest o Integrado conWindows. A continuación la clave de seguridad se pasaa ASP.NET junto con la petición. Lo que suceda acontinuación depende de la configuración de la auten-ticación en ASP.NET.

Cuando la autenticación es Windows, ASP.NETacepta la credencial enviada por IIS y copia la infor-mación al objeto Context de usuario. No se llevan acabo más acciones de autenticación. Si la autentica-ción se establece a Forms, ASP.NET ignora la infor-mación enviada por IIS y procede con su propio sis-tema de autenticación. En la mayoría de aplicacionesde Intranet, cuando los usuarios se conectan se lessolicita la credencial. Éstas son transmitidas al servi-dor (dependiendo el esquema de autenticación, enmodo de texto plano o codificado) y validadas contrael grupo de usuarios autorizados.

Si configuras IIS para soportar Windows Integrado,no aparece ninguna caja de diálogo, sino InternetExplorer y la información introducida es transmitidaal servidor automáticamente sin intervención poste-rior. En este punto, si ASP.NET se configura comoautenticación Windows, el nombre de login del usua-rio se utiliza para rellenar el campo Name del objetoUser, siempre que éste sea reconocido y aceptado porel servidor Web.

En suma, para obtener el comportamiento dese-ado tienes que habilitar la opción “Integrada conWindows” como esquema de autenticación IIS y dejarel modo autenticación ASP.NET en su forma prede-terminada –Windows.

Por último, hay que recalcar que la autenticación“Integrada con Windows”, no está soportada fuera dela familia de navegadores Internet Explorer (aunquefunciona incluso en versiones tan arcaicas comoInternet Explorer 2.0) y es impracticable con la pre-sencia de cortafuegos.

Sé que la opción de actualización por lotes deADO.NET está diseñada para actualizar una tabla ala vez. Sin embargo, tengo un montón de tablas rela-cionadas y quiero usar esta técnica para persistir loscambios periódicamente a una base de datos. ¿Algunasugerencia?

La opción de actualización por lotes de ADO.NETes cualquier cosa menos una herramienta mágica queahorre a los desarrolladores el esfuerzo de codificarun montón de código complejo. Puede ahorrarte tiem-po, pero no es mágica. Ni siquiera es muy lista. Laactualización por lotes, implementa una especie decaché de escritura donde volcar los cambios que quie-res realizar en la base de datos en un momento dado.

El mecanismo recorre las filas de una tabla daday comprueba el estatus de actualización de esas filas:

añadida, borrada o modificada. Para cada estatus, defi-ne un comando ADO.NET (o procedimiento alma-cenado) y ejecuta el comando correspondiente paracada fila. Punto.

No hay razón estructural por la que una actua-lización por lotes no soporte actualizaciones mul-titabla. Este tipo de actualización no se basa enninguna característica oculta del sistema –es, sola-mente, código de ayuda escrito por algunos desa-rrolladores para ahorrar código a otros desarrolla-dores. ¿Por qué las actualizaciones por lotesADO.NET solo soportan escenarios de actualiza-ción de tabla única? Porque fue diseñado de estaforma y porque hacerlo así simplifica notablemen-te el código necesario.

¿Qué puede hacerse? El método GetChanges() dela clase DataSet permite la selección de un array contodas las filas de una tabla con un estatus particular:añadida, borrada o modificada. De esta forma, es muysencillo almacenar en distintos contenedores todas lasfilas borradas o actualizadas para cada tabla implica-da. A continuación, llamas a una sobrecarga pococonocida del método Update en el adaptador asocia-do que –justamente– acepta un array de objetosDataRow.

int Update(DataRow[] rows);

Mediante la llamada a la sobrecarga de Update convarios arrays de objetos DataRow se nos permite cons-truir nuestra propia lógica de actualización para múl-tiples tablas. Por ejemplo, dadas un par de tablas dePedidos y Detalles_de_Pedidos, cuando el usuario soli-cita el borrado de un pedido puedes, primero, actua-lizar todas las filas de Detalles_de_Pedidos que estánborradas en forma lógica y, posteriormente, actuali-zar las filas de Pedidos marcadas para borrado. Todavíase utilizan actualizaciones por lotes, pero usando tablasrelacionadas.

Con toda seguridad, este código parece códigoestándar que se implementa de forma manual. Porotra parte, se trata de una forma de atajo y no es prac-ticable en todos los casos.

To

do

tNet.

qa@

do

tnetm

an

ia.c

om

To

do

tNet.

qa@

do

tnetm

an

ia.c

om

Traducción por Marino Posadas

No hay razón estructural por laque una actualización por lotes nosoporte actualizaciones multitabla

“”

Page 50: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

destinada a facilitar el pro-cesamiento de información proveniente de ficherosplanos. Estos ficheros suelen crearse mediante unaplanificación temporal y depositarse en una ubica-ción física. Dentro de los ficheros, los registros sealmacenan en líneas, con los campos delimitados porcaracteres de separación preestablecidos o represen-tados sobre un ancho fijo.

Tradicionalmente, el tratamiento de estos datosse realiza mediante las conocidas funcionesReadLine(), Substring(), Split(), Convert(), etc.FileHelpers evita tener que escribir este tipo decódigo, gracias a un potente asistente al que podre-mos indicarle de qué forma queremos que se hagala extracción de los datos y que generará automá-ticamente una estructura de clase para dar sopor-te al formato.

Veamos un ejemplo muy sencillo. Supongamos queel archivo a tratar tiene la siguiente estructura:

La clase que se generará para leer esos datos es laque vemos en el fuente 2.

En nuestro código, el primer paso parautilizar la librería consistiría en agregar unareferencia al ensamblado FileHelpers.dll.

Para leer y escribir archivos con el formato espe-cificado, debemos crear una instancia de la claseFileHelperEngine y usarla tal y como podemos ver enel fuente 3.

FileHelpers

Es relativamente frecuente que el trasvase de información desde/hacia una aplica-ción se realice mediante archivos planos generados periódicamente. En tales fiche-ros, los registros se almacenan en líneas de texto que deben ser interpretadas parasu posterior explotación. En el laboratorio de esta semana analizamos una libreríaque permite importar, exportar y explotar con gran comodidad archivos de estetipo en aplicaciones .NET.

Lorenzo Ponte

dnm.laboratorio.net

<< FileHelpers es una librería

Lorenzo Ponte es redactor dedotNetManía. Es Arquitecto de

Sistemas y Aplicaciones .NET.Experto en Datawarehousing yBusiness Intelligence,Marketing

Intelligence,CRM analítico.Actualmente es consultor de la

empresa Matchmind yWebmaster de clikear.com

FileHelpers es una librería destinada a facilitar el procesamiento

de información proveniente de ficheros planos

10248|VINET|04071996|32.38

10249|TOMSP|05071996|11.61

10250|HANAR|08071996|65.83

10251|VICTE|08071996|41.34

Fuente 1

Page 51: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

La variable res es un array en el que cada elemen-to se mapea a un registro del archivo original. Conlo cual podríamos recorrer la información de lasiguiente manera:

Algunas de las características principales deFileHelpers son:

• Fácil de usar.• Funciona tanto para archivos delimitados como

para los de ancho fijo.• Ofrece conversores de tipos automáticos y per-

sonalizados.• Trabaja también en modo asincrónico.• Soporta cualquier lenguaje de .NET: C#,

VB.NET, J#.• Soporta .NET Compact Framework.• Soporta plantillas CodeSmith para generar las

clases automáticamente.• Puede trabajar tanto con archivos o flujos (streams).• Soporta diferentes tipos de manejo de errores.• Soporta cadenas entrecomilladas como en MS

Excel.• Soporta la posibilidad de establecer el tipo de

codificación de los datos.• Permite interpretar el valor nulo en caso de que

existan campos vacíos.• Posibilidad de modificar dinámicamente diver-

sas características.• Documentación en inglés bastante completa.

ConclusionesDesde el laboratorio de dotNetManía tenemos que

decir que FileHelpers nos ha dejado muy buen saborde boca, destacando su facilidad de uso y las posibilida-des que ofrece para la explotación de datos almacena-dos en ficheros. Felicitamos a su creador Marcos Melipor el gran trabajo realizado y animamos a la comuni-dad a seguir su ejemplo.

Ficha técnicaNombre FileHelpers

Versión 1

Autor Marcos Meli

Web http://filehelpers.sourceforge.net

Categoría Gestión de archivos

Precio Gratis (código fuente incluido)

Valoración

dotN

etM

anía

<<

51

dnm.laboratorio.net<<

FileHelpers nos ha dejado muy buen sabor de boca, destacando su

facilidad de uso y las posibilidades queofrece para la explotación de datos

almacenados en ficheros

[DelimitedRecord("|")]

public class Orders

{

// No se necesitan conversores para

// los tipos básicos

public int OrderID;

public string CustomerID;

[FieldConverter(ConverterKind.Date, "ddMMyyyy")]

public DateTime OrderDate;

public decimal Freight;

}

Fuente 2

FileHelperEngine engine = new

FileHelperEngine(typeof(Orders));

// Para leer usamos:

Orders[] res = (Orders[])

engine.ReadFile("Archivo de Entrada.txt");

// Para escribir usamos:

engine.WriteFile("Archivo de Salida.txt", res);

Fuente 3

foreach (Orders order in res)

{

Console.WriteLine("Información del pedido:");

Console.WriteLine(order.CustomerID + " - " +

order.OrderDate.ToString("dd/MM/yy"));

}

Fuente 4

Page 52: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

Microsoft organizó el día 31 demayo en Madrid, el Microsoft DeveloperDay, el mayor evento que la compañíaorganiza para el colectivo de desarrolla-dores españoles, al que asistieron más de600 personas. En esta ocasión estuvodedicado a las nuevas funciones de segu-ridad de Windows Vista para desarro-lladores y las ventajas que ofrece la pla-taforma .NET en materia de seguridad.

Después de la keynote introductoriade Héctor Sánchez Montenegro, direc-tor de seguridad corporativa de MicrosoftIbérica, empezaron las charlas técnicascon Marino Posadas de Alhambra-Eidosy redactor jefe de esta publicación, quejunto a Jesús Villalobos de Certia expu-sieron su sesión “Procesos para un desa-rrollo seguro”. En esta sesión se explicóel modelo de amenazas y las estrategiasde defensa, así como las herramientaspara el desarrollo seguro o cómo se arti-culan dichas estrategias en una aplica-ción ASP.NET 2.0.

Continuó Fernando Guerrero,regional director de Solid Quality Learning,con su ponencia “Seguridad en SQL Ser-ver 2005 para desarrolladores”, empe-zando por ganarse al público en clave dehumor con una serie de barbaridades queusuarios y desarrolladores acostumbra-mos a realizar y que le sirvió para conven-cernos de lo necesario del principio de menorprivilegio, por el cual la mayor parte de ser-vicios están parados o deshabilitados deinicio. Aprendimos nuevas característicasde seguridad en SQL Server 2005, inclu-yendo el cifrado de los datos almacena-dos con certificados digitales y las técni-cas de funcionamiento aislado del CLR.

Después de un merecido descanso,vino la ponencia “Autorización, autenti-cación y cifrado en .NET” que expusoPablo Abbate, de Danysoft, en la queaprendimos cómo incorporar las técni-cas de autorización, autenticación y cifra-do de datos que incorpora el nuevo .NETFramework, en nuestras aplicaciones.

Entonces intervino César de laTorre, de Renacimiento, uno de los prin-cipales expertos de WCF y Web Servicesen nuestro país, para exponer su ponen-cia “Aplicaciones distribuidas seguras conWS-Security”. La gran de mayoría delas aplicaciones desarrolladas en la actua-lidad exponen o utilizan componentes yservicios distribuidos. César nos mostrólas tecnologías incluidas en WSE 3.0 yWindows Communication Foundation paraevitar que estas comunicaciones distri-buidas sean un punto débil en la seguri-dad de nuestras aplicaciones.

“Defensa contra ataques Web comu-nes” era el título de la ponencia de IsabelGomez de Microsoft Ibérica y de MiguelJiménez de Ilitia, en la que nos enseña-ron las técnicas que utilizan los atacan-

tes en los sitios Web como buffer overrun,inyección SQL, cross-site scripting, robo desesión, etc., y cómo defendernos de ellos.

Ya en el turno de tarde, tuvimos oca-sión de escuchar la distendida charla“Seguridad para el cliente rico. Presentey futuro” de David Carmona de MicrosoftIbérica (el cliente) y Pablo Peláez, regio-nal director de Visual Programming (elrico). El nuevo concepto de smart clienttambién plantea cuestiones de seguridadque hay que atajar de raíz. En esta sesiónvimos cómo publicar nuestra aplicaciónWindows Forms o Windows PresentationFoundation para que nuestros usuariospuedan acceder a su aplicación de unaforma transparente y segura.

Los dos MVP de Windows SecurityChema Alonso, de Informática 64 y JuanLuis Rambla expusieron su ponencia“Implantación de una infraestructurasegura” en la que nos explicaron que lamultitud de servicios del sistema opera-tivo y del propio hardware que utilizannuestras aplicaciones, también puedenañadir puntos vulnerables. Aprendimoslas mejores prácticas para que estos sis-temas externos a nuestras aplicacionesestén bien configurados y actualizadospara que no proporcionen una puerta deentrada a los atacantes.

Para finalizar, “Novedades de segu-ridad en Windows Vista” de José ParadaGimeno, ITPro evangelist de MicrosoftIbérica. Un completísimo repaso a laseguridad en Windows Vista y las impli-caciones que tienen las nuevas carac-terísticas del sistema operativo en el desa-rrollo de sus aplicaciones.

dotN

etM

anía

<<

52

dnm.comunidad.eventos<<dnm.comunidad.eventos

Microsoft celebró el Developer Day de Madrideven

tos.

even

tos.

even

tos.

even

tos.

even

tos.

even

tos

Microsoft reunió a más de 600 personas con las que compartió algunas delas nuevas funcionalidades sobre seguridad para desarrolladores.

“La naturaleza de los ataques a la seguridad es muy variada y,de hecho, también lo es la defensa contra dichos ataques.Buenaparte de esa defensa tiene que ver con la administración delpropio sistema operativo, pero nuestro código puede, enocasiones,permitir lo que el propio sistema impide y eso suponeun planteamiento serio de todo el modelo de amenazas.”(Marino Posadas, Seguridad en .NET Framework).

El cuaderno técnico “Programación segura con .NETFramework” de Marino Posadas se regaló a cada

asistente de este evento centrado en la seguridad enel desarrollo de aplicaciones.

Page 53: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

dnm.comunidad.eventos<<

dnm.comunidad.eventos

dotN

etM

anía

<<

53

En Málaga, el 6 dejunio, tuvo lugar lareunión inaugural delGrupo de Usuarios.NET de Málaga. Ellanzamiento fue todoun éxito, con más de35 asistentes. Comoponente invitado,Miguel Katrib de-leitó a los asistentes con las novedades másinteresantes en C# 3.0, así como LINQ. Seexplicó los objetivos del grupo y se fijó fechapara próxima reunión. El grupo de usuariosde .NET nació en 2006, en un intento depromover de alguna forma a los usuarios detecnología Microsoft .NET y en concretodesarrolladores que se encuentran en Málagay su alrededor. El fundamento del grupo esla de fomentar la comunicación entre susmiembros, así como a través de la Web parauna audiencia más amplia. Como cualquiergrupo de usuarios, se hacen reuniones men-suales donde se comparte información, sediscute sobre distintos aspectos relaciona-dos con la vida profesional y, en general,todo lo que puede ayudar para progresar enla tecnología .NET.

Más información: www.malagadnug.org.

Grupo de Usuarios .NET de MálagaCODECAMP - VIC 2006

MSDN y Spain.NET han organiza-do, con el apoyo del Ayuntamiento de Vic,el segundo CodeCamp, un evento de finde semana enmarcado en el proyectoEmprendia y dirigido a desarrolladoresde software que quieran conocer las opor-tunidades que la tecnología puede brin-darles a la hora de desarrollar sus nego-cios. Siguiendo este objetivo, entre lassesiones del CodeCamp se incluyerontemas como la construcción de un plan denegocio, la formación de una sociedad ola búsqueda de subvenciones. Además, sepresentaron casos de éxito contados enprimera persona por los responsables deempresas emprendedoras.

Durantelos días 17 y18 de juniop u d i m o sasistir a unode los even-tos más inte-r e s a n t e scelebradosen nuestropaís. Total-mente gra-tuito (inclu-yendo alojamiento, comida y actividadeslúdicas) con ponencias de destacadísimosoradores entre los que se encontraban:David Carmona, Aurelio Porras,Guillermo Som, Salvador Ramos,Octavio Hernández, Jesús Villalobos,Vicenç Masanas, Daniel Seara, DinoEsposito, Nilda Díaz y Marta Santos.

La ciudad de Vic ha sido elegida paracelebrar la segunda edición del CodeCamppor el vínculo existente entre el munici-pio y Microsoft, ya que fue aquí donde secreó en el año 2001 Spain.NET, el primerGrupo de Usuarios de tecnología Micro-soft .NET en España y uno de los prime-ros en Europa.

Solid Quality Learning University celebró el II SQLU Summit

Durante la semana del 19 al 23 de junio, SolidQuality Learning repitió su exitoso summit en Madrid.

En esta oportunidad, las distintas sesiones se divi-dieron en dos grandes grupos: la Sala de los índices

y la Sala de los cubos. En la primera, temas relacionados con laoptimización, alta disponibilidad y programabilidad fueron losmás importantes, mientras que en la segunda se vieron en pro-fundidad temas de inteligencia de negocios, análisis de informa-ción y generación de informes.

La calidad de las sesiones ha sido determinada por sus men-tores, como Fernando Guerrero, Adolfo Wiernik, AlejandroLeguizamo, Antonio Soto, Daniel Seara, David Carmona(Microsoft), Eladio Rincón, Eugenio Serrano, FranciscoGonzález, Guillermo Som, Javier Loría, Jordi Rambla,Miguel Egea y Salvador Ramos.

Además de los trascendentes temas tratados a nivel de basede datos, también fue posible estudiar temas relacionados conel desarrollo de aplicaciones relacionadas con datos, así comolas últimas novedades acerca de la administración de proyectosde bases de datos con Team System Edición para desarrolla-dores de bases de datos.

De esta forma, Solid Quality Learning continúa con sustareas de capacitación y formación para todos los especialistasrelacionados con el mundo de las aplicaciones que administraninformación. Capacitación que continuará en sus instalacionesde formación así como con sus capacidades de entrenamientoen línea. Para saber más de próximos eventos y entrenamien-tos, visita www.sqlu.com.

Miguel Katrib

Alfonso Rodríguez y Pep LluisBaño, los padres del invento

David Carmona en el momento en que eraentrevistado por la cadena televisiva “La Sexta”

El equipo de mentores de Solid Quality Learning en el Summit de Madrid

Page 54: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

dotN

etM

anía

<<

54

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

EmprendiaLa iniciativa para los e-mprendedores

repetir el éxito de la fre-gona o el chupa-chups? Todos los desarrolladores tenemosese gusanillo desde jóvenes, aunque en contadas ocasionesse hace realidad. Y no suele ser por falta de ideas, que las hayy muy buenas en España, sino por el momento de empezara ponerlas en práctica. Ahí es donde empiezan los proble-mas: ¿Cómo empiezo a desarrollar? ¿De dónde saco infor-mación? ¿Cómo lo doy a conocer? ¿A quién se lo vendo?

En MSDN Comunidades llevamos conociendo a gen-te con estas inquietudes desde nuestros inicios. Al contrarioque en otros sectores, el perfil de desarrollador emprende-dor suele ser muy técnico, con talento, escasos conocimientosde negocio y trabajador por cuenta ajena que araña tiempoa los amigos o la familia para seguir desarrollando softwareen su casa. Ésta es la magia del software: sin apenas inver-sión, cualquier persona con ganas y talento puede lanzar almercado un producto innovador que consigue competir conlas grandes corporaciones. De hecho la mayoría de estas cor-poraciones nacieron así, en un garaje americano entre variosamigos con gafas, pantalones de pana y seguidores de LaGuerra de las Galaxias.

Tengo la gran suerte de trabajar en una empresa queempezó así. No fue un ejecutivo agresivo recién salido deun MBA el que fundó Microsoft, sino dos “geeks” que dis-frutaban escribiendo código y sin aspecto de empresarios.Aunque puede sonar a broma, algunas veces todavía se veese espíritu en Microsoft; solo hay que ver algunas iniciati-vas que se llevan a cabo (véase www.on10.net o www.chan-nel9.msdn.com).

Hace poco me encontré de cerca con este espíritu degaraje en Microsoft. Desde MSDN Comunidades quería-mos ayudar a estos desarrolladores inquietos que se quedantrabajando por la noche en una idea loca. Cuando solo eraun esbozo, se la contamos a varios miembros de la direcciónde Microsoft Ibérica y el resultado fue increíble. No solonos animaron con la idea, sino que nos apoyaron directa-mente, ilusionados como si fueran ellos los emprendedoresque se encierran en sus garajes.

Así nació Emprendia. Con esta iniciativa queremos ayu-dar a los desarrolladores de software españoles con ideasinnovadoras en la puesta en marcha de un proyecto empre-sarial. El objetivo es claro: colaborar con los desarrollado-res para que sus ideas puedan convertirse en una realidad.Para ello dentro del programa Emprendia se ofrecen trestipos de ayudas:• Formación (¡Aprende!): los proyectos de software inno-

vadores requieren en muchas ocasiones tecnologías diver-

sas que utilizan los últimos avances de la industria.Dispositivos móviles, comunicaciones distribuidas, ser-vicios ofrecidos por Internet o nuevas experiencias deusuario requieren una formación técnica que no está dis-ponible en muchas ocasiones. El programa Emprendiaincluye múltiples recursos gratuitos para la formaciónnecesaria en estas tecnologías. Estos cursos se añaden alos que ya estaban disponibles online en MSDN y com-plementan la formación requerida por un emprendedor.No podemos olvidar tampoco la formación de negocionecesaria para tener éxito: finanzas, subvenciones, cons-titución de empresas, etc. Este tipo de formación tam-bién se añade al porfolio de MSDN, estando disponibleon line para todos los desarrolladores.

• Puesta en marcha (¡Construye!): una vez hayamosdecidido ser emprendedores, llega la hora de empezar atrabajar. Los participantes del programa tienen acceso amultitud de recursos subvencionados para la puesta enpráctica del proyecto. En esta línea se ofrecen losCodeCamps, encuentros de fin de semana donde cono-cer a otros emprendedores y aprender las tecnologíasmás “calientes” del mercado e información de los exper-tos en cómo formar una empresa. También se ofreceacceso gratuito a sesiones de negocio intensivas de dosdías impartidas por la prestigiosa escuela de negociosIDE-CESEM. Tampoco podemos olvidarnos de losrecursos necesarios para desarrollar el software. Los par-ticipantes tienen acceso a una subvención íntegra o casiíntegra (dependiendo del volumen) de todo el softwarenecesario de Microsoft durante el primer año. Se ofre-ce también la posibilidad de asistir al MicrosoftTechnology Center que Microsoft comparte con elGobierno de Aragón para una consultoría tecnológicasobre el proyecto.

• Comunicación (¡Comunica!): Microsoft ofrece a losproyectos participantes del programa Emprendia diver-sos medios de comunicación para dar a conocer su idea.Los emprendedores que así lo deseen pueden publicarsu proyecto en la Web de Microsoft o participar en even-tos de forma conjunta.

Para más información sobre Emprendia puedes accederal sitio web www.msdnemprendia.com. ¡Contamos contigo!

David CarmonaGrupo Desarrolladores y Plataforma

Microsoft Ibérica

<< ¿Quién no ha soñado con

Page 55: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

dotN

etM

anía

<<

55

<<

Programming Microsoft ASP.NET 2.0 Core ReferenceDino Esposito

Editorial: Microsoft PressISBN: 0735621764Páginas: 336Primera edición: Noviembre, 2005Idioma: Inglés

Nuestro admirado colaborador italiano, Dino Esposito, ha reunido algunos de sus mejo-res consejos sobre el desarrollo en ASP.NET 2.0 dentro de esta obra de calado, dondenos ilustra con la precisión que en él es característica y, sobre todo, nos permite teneruna auténtica “voz de la experiencia” sobre esta herramienta, con la que lleva trabajan-do desde las primeras versiones alfa.

La obra, que ha tenido una acogida espectacular en Amazon, con 5 estrellas por partede todos los comentarios de lectores, es un trabajo perfecto para el que desea saber deverdad cómo funciona ASP.NET en su interior y cómo eso se refleja en todos los aspec-tos de nuestras aplicaciones, desde la flexibilidad hasta la escalabilidad o el rendimien-to. De obligada lectura, que se dice…

Visual C# 2005:A Developer’s NotebookJesse Liberty

Editorial: O'Reilly MediaISBN: 059600799XPáginas: 221Primera edición: Mayo, 2005Idioma: Inglés

Jesse Liberty es bien conocido por la capacidad divulgativa de sus obras (numerosísi-mas, sobre la plataforma .NET), dando cobertura tanto a los lenguajes principales (C#y Visual Basic .NET), como a la plataforma y los más destacados espacios de nombrespara desarrollo (ASP.NET, ADO.NET). Este libro también ha tenido una acogida esplén-dida por la comunidad de desarrolladores y tiene –además– la ventaja de resultar unaauténtica actualización (sin repeticiones) de la versión anterior.

El autor se centra en todas las novedades del lenguaje, las explica y decora con códigofuente explicativo y nos ofrece aspectos no vistos en otras obras de divulgación sobreC# 2.0, dentro de un marco conciso pero exacto donde se dice justamente lo que se quie-re decir y nada más. Una excelente actualización.

dnm.biblioteca.net<<

dnm.biblioteca.net

Page 56: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

dnm.club >>> dnm.club >>> dnm.club >>> dnm.club >>>[ ]

Page 57: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

dnm.club >>> dnm.club >>> dnm.club >>> dnm.club >>> dnm.club >

Page 58: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos

Blog de Aaron Margosis,de similar corte al anterior, y tam-bién con la seguridad en mente (http://blogs.msdn.com/aaron_margosis). A destacar, varias series de artículos sobretécnicas seguras de programación y testeo.

20 Consejos para los autores de una bitácora (CorporateWeblog Manifesto): Un código de comportamiento efi-caz y ético para los autores de bitácoras. Para los no auto-res, algún consejo interesante en otros campos. PorScobleizer (http://scoble.weblogs.com/2003/02/26.html).

Control de usuario deGoogle Maps paraASP.NET. En el sitiohttp://googlemaps.subgu-rim.net puede encontrarseuna interesante aportaciónde un grupo español. Es

un control que emula Google-Maps, y posee un montónde opciones de configuración y programación, a través deuna sencilla API. Requiere de un registro, eso sí.

Microsoft desvela los contenidos de su nueva certificaciónde arquitectura (MCA:Microsoft Certified Architect)

La compañía deRedmond explicaba aprimeros del pasadomes de junio los conte-nidos y objetivos perse-guidos durante más deun año de proceso de

diseño de esta certificación, que se prevé, con mucho, lamás exigente de todas las propuestas hasta el momento.Casualmente, en la entrevista con Arvindra Sehmi queel lector encontrará en páginas interiores, comentába-mos con él esta certificación y nos ampliaba informaciónal respecto. Independientemente, ya existe una página

oficial sobre MCA: http://www.microsoft.com/learning/mcp/architect/overview.

Microsoft integrará todas sus herramientas de BI en lasolución PerformancePoint Server 2007

Según BI-Spain.com (http://www.bi-spain.com),Microsoft está trabajando en la integración de sus herra-mientas de BI (Business Scorecard Manager 2005 y ProClarityAnalytics Server) en un mismo producto llamadoPerformancePoint Server 2007. La versión beta (se dice),estará lista para noviembre de este año y el producto, paramediados de 2007. Además, PerformancePoint Server 2007mejorará las capacidades de análisis y reporting de SQLServer 2005, utilizando el nuevo Office 2007.

dotN

etM

anía

<<

58

dnm.desvan<<

Marino Posadas

Vídeo de BJ Ostergren, para la CNN,en el que se muestra qué fácil resultarobar datos de identidad en Internet.Entre sus quejas, la más importanterecae sobre los gobiernos, que -a veces-dejan información confidencial en la red. Accesible enhttp://www.cnn.com/2006/TECH/internet/06/12/idtheft.inter-net/index.html.

Documentos en la Red

Utilidades del mes

no

tici

as.

no

tici

as

Sitios del mes

Nuevos foros MSDN y TechNeten castellano: Disponibles en lasdirecciones http://forums.microsoft.com/msdn-es/default.aspx?

siteid=11 y http://forums.microsoft.com/TechNet-ES/default.aspx?SiteID=30 respectivamente. Puro desarrollo.

Sitio de DavidCervigón,evangelis-ta de Microsoft y ponente habitual en conferencias y even-tos, además de especialista en interioridades de los siste-mas. Sin desperdicio: http://blogs.technet.com/davidcervigon.

Blog de Robert Hensing, miembro de la división SecurityEngineering and Communications en Redmond. Buenoscomentarios sobre seguridad, y sobre todo, de primeramano. En http://blogs.technet.com/robert_hensing.

Los sitios de Lluís Franco:Este MVP en Visual Basic,no se conforma con el sitio Web de su empresa (larecomendable http://www.uyssoft.com), sino que des-

de hace algún tiempo actualiza una interesante bitácora denoticias sobre desarrollo en todas las tecnologías .NET:http://msmvps.com/blogs/lfranco/archive/category/1118.aspx.

Page 59: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos
Page 60: dotNetManía - Tecnología, Tips de Programación y … · 2011-04-22 · las novedades de VB 9.0 para imple ... Con el uso de HTTP EndPoints podemos exponer a la Web tanto los procedimientos