2.5.1 Comparando los diseñadores de datos de ADO.NET...

42
código (diseñadores) que se invocan arrastrando los nodos de tabla o de campo desde el nuevo panel Orígenes de datos. El panel Orígenes de datos de VS 2005 substituye al Explorador de servidores como punto inicial para añadir los juegos y las tablas de datos a los proyectos. VS 2005 substituye los controles de datos del Cuadro de herramientas de versiones ante- riores de Windows – excepto DataSet- con los siguientes objetos y encapsuladores (wrappers) nuevos: TableAdapters sustituyen a los adaptadores de conexión y de datos especificos del proveedor, como son SqlConnection y SqlDataAdapter. Los adaptadores de datos y de conexión específicos del proveedor ya no aparecen en la categoría Datos del Cuadro de herramientas. BindingSources son encapsuladores para las fuentes de datos del proyecto, que nor- malmente, aunque no necesariamente, son tablas de datos (DataTables) miembros de un DataSet tipificado. BindingSources permite, mediante código, navegar por los datos y las listas y editarlos. BindingSources sirve asimismo como fuente de vincu- lación de la DataGridView con otros controles vinculados de edición. BindingNavigators son controles ToolStrip para fines específicos, que se asocian a una BindingSource para hacer posible, al estilo de un cuadro de herramientas, la navegación por listas o el grabado de datos, y otras operaciones relacionadas como son añadir nuevas entradas, borrarlas y guardar datos editados. Los controles DataGridView sustituyen al control DataGrid. Los DataGridViews se pueden vincular a los DataConnectors, DataTables, y ArrayLists. A diferencia de los DataGrid, los DataGridViews no pueden mostrar en pantalla datos jerarquizados. Los adaptadores de datos y conexión específicos del proveedor ya no aparecen en el formulario de la bandeja del diseñador. Los miembros privados de la clase PartialPu- blicClassTableNameTableAdapter del juego de datos definen el tiempo de ejecución de SqlConnections, SqlDataAdapters, y SqlTransactions para los proyectos basados en el SQL- Server. Las clases parciales para el código generado por el diseñador, guardadas en los archivos ClassName.Designer.vb, permiten añadir código a las clases DataSet que no han sido sobreescritas por el diseñador al reconfigurar nosotros los DataSets. En las secciones siguientes se introducen los nuevos controles y actualizados de ADO.NET 2.0, así como los formularios de edición y de muestra en pantalla de datos parametrizados autogenerados, y la nueva propiedad de actualización de batchs para las tablas de datos. 2.5.1 Comparando los diseñadores de datos de ADO.NET 1.x y 2.0 Como ya se mencionó en el capítulo anterior, uno de los objetivos básicos del equipo de desarrollo de VS 2005 es suavizar la curva de aprendizaje de los desarrolladores –especialmente los de VB que emigran de VS 6.0 a VS 2005. Añadir el nombre-espacio My y sus clases a los proyectos VB.NET es un ejemplo de cómo se ha simplificado el 69 Las novedades de ADO.NET 2.0

Transcript of 2.5.1 Comparando los diseñadores de datos de ADO.NET...

Page 1: 2.5.1 Comparando los diseñadores de datos de ADO.NET …galeon.com/melissacalleja1/basesdatos3.pdf ·  · 2012-11-09riores de Windows – excepto DataSet- con los siguientes objetos

código (diseñadores) que se invocan arrastrando los nodos de tabla o de campo desdeel nuevo panel Orígenes de datos. El panel Orígenes de datos de VS 2005 substituye alExplorador de servidores como punto inicial para añadir los juegos y las tablas de datos alos proyectos.

VS 2005 substituye los controles de datos del Cuadro de herramientas de versiones ante-riores de Windows – excepto DataSet- con los siguientes objetos y encapsuladores(wrappers) nuevos:

TableAdapters sustituyen a los adaptadores de conexión y de datos especificos delproveedor, como son SqlConnection y SqlDataAdapter. Los adaptadores de datos yde conexión específicos del proveedor ya no aparecen en la categoría Datos delCuadro de herramientas.BindingSources son encapsuladores para las fuentes de datos del proyecto, que nor-malmente, aunque no necesariamente, son tablas de datos (DataTables) miembrosde un DataSet tipificado. BindingSources permite, mediante código, navegar por losdatos y las listas y editarlos. BindingSources sirve asimismo como fuente de vincu-lación de la DataGridView con otros controles vinculados de edición.BindingNavigators son controles ToolStrip para fines específicos, que se asocian auna BindingSource para hacer posible, al estilo de un cuadro de herramientas, lanavegación por listas o el grabado de datos, y otras operaciones relacionadas comoson añadir nuevas entradas, borrarlas y guardar datos editados.Los controles DataGridView sustituyen al control DataGrid. Los DataGridViews sepueden vincular a los DataConnectors, DataTables, y ArrayLists. A diferencia de losDataGrid, los DataGridViews no pueden mostrar en pantalla datos jerarquizados.

Los adaptadores de datos y conexión específicos del proveedor ya no aparecen en elformulario de la bandeja del diseñador. Los miembros privados de la clase PartialPu-blicClassTableNameTableAdapter del juego de datos definen el tiempo de ejecución deSqlConnections, SqlDataAdapters, y SqlTransactions para los proyectos basados en el SQL-Server. Las clases parciales para el código generado por el diseñador, guardadas en losarchivos ClassName.Designer.vb, permiten añadir código a las clases DataSet que no hansido sobreescritas por el diseñador al reconfigurar nosotros los DataSets.

En las secciones siguientes se introducen los nuevos controles y actualizados deADO.NET 2.0, así como los formularios de edición y de muestra en pantalla de datosparametrizados autogenerados, y la nueva propiedad de actualización de batchs paralas tablas de datos.

2.5.1 Comparando los diseñadores de datos de ADO.NET 1.x y 2.0

Como ya se mencionó en el capítulo anterior, uno de los objetivos básicos del equipode desarrollo de VS 2005 es suavizar la curva de aprendizaje de los desarrolladores–especialmente los de VB que emigran de VS 6.0 a VS 2005. Añadir el nombre-espacioMy y sus clases a los proyectos VB.NET es un ejemplo de cómo se ha simplificado el

69

Las novedades de ADO.NET 2.0

VisualBasic2005_02.qxp 02/08/2007 16:15 PÆgina 69

Page 2: 2.5.1 Comparando los diseñadores de datos de ADO.NET …galeon.com/melissacalleja1/basesdatos3.pdf ·  · 2012-11-09riores de Windows – excepto DataSet- con los siguientes objetos

acceso a las propiedades del ordenador local y sus recursos, a expensas de una mayorcomplejidad en la estructura de archivos del código fuente.

Afortunadamente, los nuevos asistentes de VS 2005 y sus diseñadores para crear for-mualrios básicos de entrada de datos, la generación inicial de los juegos de datos, sinhacer el código más complicado. Las dos secciones siguientes comparan el proceso degeneración de un formulario de edición y de entrada de datos, basado en parrillas, conlos asistentes y diseñadores de ADO.NET 1.x y ADO.NET 2.0.

2.5.2 ADO.NET 1.xA continuación veremos el método convencional de ADO.NET 1.x para crear un juegode datos tipificado, con una tabla única especificada en una sentencia SQL, y para mos-trar registros en un control DataGrid:

1. Añada un SqlDataAdapter del Cuadro de herramientas a la bandeja del formulario.Eso abrirá el asistente para la configuración del adaptador de datos (Data AdapterConfiguration Wizard).

2. Seleccione una conexión al SQLServer ya existente, o cree una nueva, especifiquelas sentencias SQL y genere las sentencias SQLSELECT, INSERT, UPDATE, y DE-LETE. El diseñador añadirá a la bandeja los objetos SqlConnection1 y Sql-DataAdapter1.

3. Seleccione Data/Generate Dataset para crear un juego de datos tipificado con la tablade datos especificada en la consulta SELECT. El diseñador añade DataSetName1 ala bandeja.

4. Añada un control DataGrid al formulario, defina DataSetName1 como valor de supropiedad DataSource, y déle a la propiedad DataMember el nombre de la tablaespecificado en la consulta SELECT.

5. Añada un botón Fill y la instrucción SqlDataAdapter1.Fill(DataSetName1) al mane-jador de eventos btnFill_Click.

6. Añada un botón Update de actualización y una instrucción SqlDataAdapter1.Up-date(DataSetName1) al manejador de eventos btnUpdate_Click.

2.5.3 ADO.NET 2.0Los diseñadores de VS 2005 y ADO.NET 2.0 simpllifican la creación de los formulariosde una sola tabla al cambiar la sencuencia para la generación de juegos de datos y otroscomponentes relacionados. El proceso a seguir con ADO.NET 2.0:

1. Si es necesario, abra la ventana Orígenes de datos seleccinando Datos/Mostrar oríge-nes de datos, y pulse el enlace Agregar nuevo origen de datos para iniciar el Asistentepara la configuración de orígenes de datos.

2. Seleccione Base de datos como el tipo de fuente y seleccione una de las conexionesexistentes a la base de datos o cree una nueva en el cuadro de diálogo Agregar cone-xión. Opcionalmente, guarde la cadena de conexión en el archivo de configuraciónde la aplicación. Siguiendo los pasos del asistente se añade un árbol TableName

70

Bases de datos con Visual Basic

VisualBasic2005_02.qxp 02/08/2007 16:15 PÆgina 70

Page 3: 2.5.1 Comparando los diseñadores de datos de ADO.NET …galeon.com/melissacalleja1/basesdatos3.pdf ·  · 2012-11-09riores de Windows – excepto DataSet- con los siguientes objetos

bajo el nombre DataSetName ya existente en la parte superior de la ventanaOrígenes de datos.

3. Arrastre al formulario el árbol TableName. El diseñador añade los elementos Data-baseNameDataSet, TableNameBindingSource, TableNameTableAdapter, y TableName-BindingNavigator a la bandeja, y los controles TableNameDataGridView y TableName-BindingNavigator al formulario.

El paso 3 también añade una instrucción TableNameTableAdapter.Fill(DatabaseNameData-Set) al manejador de eventos Form1_Load y un manejador de eventos bindingNavigator-SaveItem_Click al formulario.

A diferencia del proceso ADO.NET 1.x, usted no tiene la oportunidad de crear o selec-cionar procedimientos almacenados para llenar o actualizar las tablas de datos creadaspor el asistente. No obstante, puede reconfigurar los DataTableAdapters para crear nue-vos procedimientos, o utilizar los que hay guardados, abriendo el archivo DataSet-Name.xsd en el Explorador de soluciones, pulsando con el botón secundario la cabeceradel TableNameTableAdapter y seleccionando la opción Configurar DataSet con el asistentepara iniciar el Asistente para la configuración de orígenes de datos. Pulse el botón Anteriorpara mostrar el cuadro de diálogo Elija la conexión de datos, y pulse el botón Nueva cone-xión y siga los pasos del asistente hasta el final.

Los diseñadores dse ADO.NET 2.0 hacen mucho más fácil la creación de formularios deedición de datos maestro con subformularios DataGridView de nivel único o múltiple,que VS 2005 llama formularios Master Detail. En el capítulo anterior describimos el pro-ceso para crear un formulario Northwind de Clientes-Pedidos. Más adelante, le mostra-mos cómo añadir un subformulario vinculado de segundo nivel. Y también es muchomás fácil crear formularios de entrada de datos parametrizados, tal como descubrirámás adelante en este mismo capítulo.

2.6 Añadir los controles ADO.NET que faltanSi desea utilizar los componentes de ADO.NET 1.x para crear objetos DataAdapter espe-cíficos del proveedor, tendrá que añadir los correspondientes controles Connection yDataAdapter al Cuadro de herramientas. Si tiene otros proveedores específicos de datos,como Oracle ODP.NET para Oracle 10g o anteriores, tendrá que añadir ODP.NETOracleConnection y OracleDataAdapter al Cuadro de herramientas. También puede añadirel control DataGrid de ADO.NET 1x para formularios Windows y crear con él nuevosproyectos similares en entorno y manejo a los de VS 2005.

Para añadir controles no estándar al Cuadro de herramientas, pulse con el botón secun-dario del ratón en la sección Datos y seleccione Elegir elementos para abrir el cuadro dediálogo Elegir elementos del cuadro de herramientas. Escriba las primeras letras del com-ponente o el control en el cuadro de texto Filtro para simplificar la selección. La siguien-te figura muestra el cuadro de diálogo con cuatro proveedores Oracle.DataAccess.Client.Marque las casillas de verificación de las entradas que quiera instalar y pulse Aceptarpara añadirlas al Cuadro de herramientas y cerrar el cuadro de diálogo.

71

Las novedades de ADO.NET 2.0

VisualBasic2005_02.qxp 02/08/2007 16:15 PÆgina 71

Page 4: 2.5.1 Comparando los diseñadores de datos de ADO.NET …galeon.com/melissacalleja1/basesdatos3.pdf ·  · 2012-11-09riores de Windows – excepto DataSet- con los siguientes objetos

Los controles no estándar añadidos al Cuadro de herramientas se pueden eliminar denuevo pulsando con el botón secundario el Cuadro de herramientas y seleccionandoRestablecer Cuadro de herramientas.

2.7 Actualizar proyectos de 1.x con componentes de ADO.NET 2.0

Al abrir un proyecto VS 2002 o VS 2003 en VS 2005 se abre el Visual Studio UpgradeWizard, que convierte el proyecto al formato VS 2005 y, opcionalmente, guarda unacopia de seguridad del proyecto original en el archivo que se especifique. Con los pro-yectos simples los únicos cambios que se perciben son referencias actualizadas a lasversiones .NET Framework 2.0 y las fuentes de datos para el formulario, que aparecenautomáticamente en la ventana Orígenes de datos. Actualizar el proyecto no añade archi-vos de código para mejorar o ampliar el nombre de espacio My, ni supone adicionesespecíficas de ADO.NET 2.0 al código DataSet.

Añadir la fuente de datos como un nodo de la ventana Orígenes de datos permite reem-plazar rápidamente un DataGrid con un DataGridView y añadir, automáticamente, loscontroles BindingSource y BindingNavigator para la edición y la navegación de datos.Borre el control DataGrid y arrastre el nodo TableName al formulario para añadir los doscontroles de ADO.NET 2.0. No verá el componente TableNameDataAdapter en la bande-ja, ni una ventana de diseñador de esquema porque DataSourceName.xsd no está actua-lizado al nuevo formato de esquema DataSet.

2.7.1 Añadir subformularios multinivelVS 2005 y VB Express automatizan la generación de formularios multinivel para laentrada y la edición de datos para tablas relacionadas. Al añadir tablas múltiples rela-cionales a la ventana Orígenes de datos, el diseñador de esquemas de VS 2005 determinaatuomáticamente las restricciones de clave foránea y establece relaciones entre las

72

Bases de datos con Visual Basic

VisualBasic2005_02.qxp 02/08/2007 16:15 PÆgina 72

Page 5: 2.5.1 Comparando los diseñadores de datos de ADO.NET …galeon.com/melissacalleja1/basesdatos3.pdf ·  · 2012-11-09riores de Windows – excepto DataSet- con los siguientes objetos

tablas basadas en restricciones preestablecidas de tabla base. El diseñador de esquemasnombre las relaciones FK_ManySideTable_OneSideTable, como muestra la siguiente figu-ra para las tablas Northwind Customers, Orders y Order Details.

Con VS 2002 y VS 2003 debía establecer manualmente todas las relaciones en el cuadrode diálogo Relation. Por defecto, VS 2005 no muestra en cascada los cambios de valoresclave en las operaciones de borrado y actualización, pero este comportamiento sepuede modificar definiendo otras propiedades de relación en el cuadro de diálogoRelación.

Primero, añada un DataGridView o, preferentemente, cuadros de texto vinculados y unDataNavigator para la fuente de datos maestra del formulario. Segundo, añada el primernivel de detalle arrastrando el nodo de tabla relacionado con la ventana Orígenes de datos(Orders en este ejemplo) al formulario para mostrar en un DataGridView los registrosrelacionados. A continuación, arrastre nodos de tabla de niveles más profundos; en estecaso Order Details, para mostrar niveles adicionales de registros relacionados.

Finalmente, compruebe que el diseñador ha añadido estas tres instruccionesDataTableTableAdapter.Fill al manejador de eventos FormName_Load:

73

Las novedades de ADO.NET 2.0

VisualBasic2005_02.qxp 02/08/2007 16:15 PÆgina 73

Page 6: 2.5.1 Comparando los diseñadores de datos de ADO.NET …galeon.com/melissacalleja1/basesdatos3.pdf ·  · 2012-11-09riores de Windows – excepto DataSet- con los siguientes objetos

Private Sub frmMasterDetails_Load(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles MyBase.Load

'TODO: This line of code loads data into the

'NorthwindDataSet.Order_Details' table. You can move, or remove it, as needed.

Me.Order_DetailsTableAdapter.Fill(Me.NorthwindDataSet.Order_Details)

'TODO: This line of code loads data into the 'NorthwindDataSet.Orders'

table. You can move, or remove it, as needed.

Me.OrdersTableAdapter.Fill(Me.NorthwindDataSet.Orders)

'TODO: This line of code loads data into the 'NorthwindDataSet.Customers'

table. You can move, or remove it, as needed.

Me.CustomersTableAdapter.Fill(Me.NorthwindDataSet.Customers)

End Sub

A continuación, pulse <F5> para construir y ejecutar el proyecto, que aparecerá tal co-mo se muestra en la siguiente figura.

2.8 Diseñar y mostrar informes con el control ReportViewer

Las versiones VB y VS anteriores a VS .NET se basaban en los complementos CrystalReports para diseñar, mostrar y publicar informes en forma de tabla, gráficos, o ambos,desde una fuente de datos específica. Otros fabricantes de software independientes(ISV, for Independent Software Vendors) ofrecen redactores de informes y diseñadores degráficos para VS 2002 y versiones posteriores. Para eliminar la dependencia de terceraspartes, Microsoft introdujo los servidores SQL de Servicios de informes (ReportingServices) como un complemento sin carga para SQLServer 2000. Todas las ediciones del

74

Bases de datos con Visual Basic

VisualBasic2005_02.qxp 02/08/2007 16:15 PÆgina 74

Page 7: 2.5.1 Comparando los diseñadores de datos de ADO.NET …galeon.com/melissacalleja1/basesdatos3.pdf ·  · 2012-11-09riores de Windows – excepto DataSet- con los siguientes objetos

SQLServer 2005, excepto SQLX, integran los Reporting Services, que incluyen un ReportServer y un Report Builder en la configuración del programa. Estas ediciones usan elReport Service Project del proyecto Business Intelligence de VS IDE, o el Report ServerProject Wizard o plantillas Report Model Project para diseñar y desarrollar los informesbasados en servidor (también llamados remotos), independientes de los proyectos deformulario de .NET Windows o la Web.

El control ReportViewer para los formularios Windows tiene capacidad para una barrade herramientas, parecido a un control BindingNavigator, y un área de visualiación delinforme para mostrar los informes convencionales (tablas) o los crosstab (matriciales), olos mapas vinculados a las fuentes de datos ADO.NET 2.0. Los mapas son muy pareci-dos a los Excel PivotCharts o a los creados con el control Office Web Components (OWC).La barra de herramientas tiene botones Page Setup, Page Layout, y Print para imprimir,y un botón Export que permite guardar los informes en la hoja de cálculo de Excel o enel formato Adobe PDF. Los informes creados con el control ReportViewer consumenmuchos menos recursos del cliente que sus correspondientes versiones con CrystalReports.

ReportViewer permite diseñar informes con un diseñador cliente (local) derivado delReportBuilder. El diseñador local de VS 2005 o VBX sirve para crear archivos de informedesde el cliente local en la carpeta del proyecto. La ayuda online le guiará a través delproceso de creación de un informe sencillo a partir de las tablas AdventureWorks. Lasiguiente figura muestra la aplicación ReportViewerDemo mostrando el mapa por cate-goría de producto de un área de pedidos recibidos en los diferentes trimestres de 1997.

75

Las novedades de ADO.NET 2.0

VisualBasic2005_02.qxp 02/08/2007 16:15 PÆgina 75

Page 8: 2.5.1 Comparando los diseñadores de datos de ADO.NET …galeon.com/melissacalleja1/basesdatos3.pdf ·  · 2012-11-09riores de Windows – excepto DataSet- con los siguientes objetos

77

Capítulo 3

Concretando proyectos realesLos negocios actuales requieren el acceso en tiempo real a una amplia variedad dedatos públicos y privados. Prácticamente todas las aplicaciones orientadas a negociosconectan a una o más fuentes de datos en red. Las tablas de bases de datos relacionalesson las fuentes más comunes, pero los sistemas de correo electrónico, hojas de cálculo,archivos de procesamiento de datos y, cada vez más, los documentos XML, también sir-ven como fuente de datos. ADO.NET requiere fuentes de datos en forma de tabla, porlo que este capítulo se centra en las mejores prácticas para procesar los datos conteni-dos en tablas relacionales, en juegos XML estructurados y mensajes SOAP.

Microsoft Access y Visual Basic ofrecen conectividad de datos en el propio escritorio amillones de usuarios de Windows. Ambas plataformas permiten un acceso rápido yrelativamente sencillo a las bases de datos locales y en la red. Access permite a los usua-rios de Office crear “front ends” de bases de datos y configurar bases de datos Jet mul-tiusuario para proyectos. Visual Basic ofrece a los desarrolladores profesionales y ama-teurs una amplia y variada gama de funciones para crear aplicaciones cliente paraservidores de bases de datos corporativas. Gran parte de esta temprana actividad dedesarrollo vino impulsada por la incapacidad, o la falta de voluntad, de los departa-mentos TI para proporcionar aplicaciones aprobadas oficialmente según un tiempoestablecido (o cuando fuera). Los proyectos no aprobados y ad-hoc, a menudo, queda-ban fuera del radar de la dirección TI y no se descubrían hasta que se hacía evidente lacontaminación de los datos, o las conexiones mal gestionadas repercutían en la eficaciade las bases de datos.

Las auditorías al cumplirse el año 2000 y las subsiguientes actualizaciones de bases dedatos descubrieron “front ends” con bases de datos defectuosas e irregulares. Los “backends” de servidores SQL con cuentas y contraseñas vacías o fáciles de adivinar, estabanaseguradas. Los departamentos TI de la mayoría de organizaciones se habían hechocon todo el control de las conexiones internas a bases de datos gubernamentales o cor-poraciones centralizadas. La administración centralizada de las bases de datos y el esta-blecimiento de las mejores prácticas para el desarrollo de bases de datos “front-end” seconviertieron en norma. Las posibilidades infinitas de conexión de Internet y la persis-tencia de los ataques externos se tradujeron en un énfasis aumentado por establecer lasmejores prácticas para garantizar la seguridad y la integridad de los datos. De todosmodos, muchas empresas pequeñas y medianas siguen funcionando con prácticasinformales en el desarrollo de sus aplicaciones con bases de datos.

VisualBasic2005_03.qxp 02/08/2007 16:18 PÆgina 77

Page 9: 2.5.1 Comparando los diseñadores de datos de ADO.NET …galeon.com/melissacalleja1/basesdatos3.pdf ·  · 2012-11-09riores de Windows – excepto DataSet- con los siguientes objetos

El fenómeno SQLSnake/Spida, en Mayo de 2002, probó que muchas de las bases de datos de losservidores SQL accesibles por Internet tenían contraseñas vacías o fáciles de adivinar. En enerode 2003, el virus Slammer/Sapphire demostraba que miles de instancias MSDE 2000 no regu-larizadas, así como los servidores SQL sin patches, controlados por los departamentos TI, eranaccesibles desde el puerto TCP 1433.

El U.S. General Accounting Office define las mejores prácticas como procesos y sistemasidentificados en organizaciones públicas y privadas de excelente rendimiento, amplia-mente reconocidas por mejorar el rendimiento y la eficacia de las organizaciones enáreas específicas. Identificar y aplicar con éxito las mejores prácticas puede reducir losgastos del negocio y mejorar la eficacia de la organización. Independientemente deltamaño de la empresa o de los clientes consultores, adoptar y reforzar un conjunto deprácticas óptimas en las áreas de desarrollo de las aplicaciones produce a corto y alargo plazo un incrémento en los réditos de inversión. Incluso si sus deberes en cuantoa desarrollo no están guiados por un conjunto oficial de "mejores prácticas", tómese eltiempo necesario para familiarizarse con las recomendaciones de Microsoft en cuandoa mejoras y arquitectura actuales de los proyectos .NET.

Este capítulo muestra las pautas para el desarrolo de las aplicaciones .NET, en secuen-cia descendiente desde la arquitectura general hasta las recomendaciones específicaspara incrementar la escalabilidad, interoperabilidad, rendimiento y seguridad, y la reu-tilización de código en todos los proyectos .NET centrados en datos.

3.1 Establecer la arquitecturaMantenerse al día en la evolución de los distintos marcos y arquitecturas en que se des-arrollan las aplicaciones de Microsoft puede ser una tarea a jornada completa. Los pro-yectos convencionales de cliente-servidor dieron paso los diseños de tres niveles, basa-dos en COM, y después a los de arquitecturas de n-niveles con componentes con-troladas por el servidor de transacciones de Microsoft (Microsoft Transaction Server). Lasarquitecturas Windows Distributed interNet Architecture (WinDNA) y Universal DataAccess (UDA), que Microsoft introdujo en 1997, formalizaron el diseño de las aplicacio-nes Web de tres niveles. En 1999, Windows DNA2000 añadió servicios XML y Web alacceso de datos. Bill Gates anunció en Julio de 2002 la joven plataforma .NET, queincorporaba todos los sistemas de servidor de Microsoft: Visual Studio .NET, y el mala-fortunado proyecto .NET My Services. La arquitectura más vigente de Microsoft es laMicrosoft Enterprise Application Platform que combina Windows 2003 Server, Visual Studio.NET 2003/5, y modelos y prácticas de guía arquitectónica.

Los P&P están desarrollados por el equipo Platform Architectural Guidance (PAG) deMicrosoft, que ha establecido una conferencia cumbre de tres días bajo el título de Inter-national Patterns and Practices Summit y ofrece información semanal en la Web sobretemas relacionados con el desarrollo de aplicaciones y la arquitectura .NET. A continua-ción se describen brevemente los cuatro elementos P&P:

Arquitecturas referenciales: identifican las decisiones en cuanto al diseño y hacenrecomendaciones generales para mejorar las soluciones con componentes interco-nexas. La guía de mejoras en los Data Services "Windows Server System Reference

78

Bases de datos con Visual Basic

VisualBasic2005_03.qxp 02/08/2007 16:18 PÆgina 78

Page 10: 2.5.1 Comparando los diseñadores de datos de ADO.NET …galeon.com/melissacalleja1/basesdatos3.pdf ·  · 2012-11-09riores de Windows – excepto DataSet- con los siguientes objetos

Architecture” (WSSRA) y Application Architecture for .NET: Designing Applicationsand Services son los documentos más útiles sobre arquitectura, de referencia paralos desarrolladores de ADO.NET.Modelos: son modelos de operaciones habituales realizadas por aplicaciones quese presentan como pares de problema/solución. Un ejemplo típico, tomado dellibro de 196 páginas, Data Patterns, es el modelo Master/Slave Snapshot Replicationpara copiar la información que cambia lentamente, como las listas de productos yclientes, desde las tablas de las bases de datos hasta los portátiles de usuarios amenudo desconectados.Bloques de aplicación: son componentes VB y C# que proporcionan un marcopara elementos específicos de aplicaciones o componentes. Un ejemplo es el blo-que de aplicación de Data Access para .NET. Hay varias guías de diseño con docu-mentación sobre los bloques de aplicación.Guías de diseño: proporcionan recomendaciones detalladas sobre arquitectura ymejoras para tipos específicos de aplicaciones, componentes y servicios. La .NETData Access Architecture Guide (2003) y Designing Data Tier Components and AccessingData Through Tiers (2002) son los dos miembros más importantes de este grupopara los programas de ADO.NET.

Los P&P originales no se han visto afectados significativamente por las actualizacionesde VS 2005 y ADO.NET 2.0 ni por la migración al SQLServer 2005. Los principios deldiseño son consistentes para todas las versiones .NET. Los apartados siguientes pro-porcionan información más detallada sobre los miembros de la lista anterior, enfatizan-do los elementos de mayor interés para los desarrolladores de bases de datos.

3.2 Las arquitecturas referencialesLas arquitecturas referenciales proporcionan a los arquitectos y desarrolladores de.NET una guía a nivel de sistema en situaciones típicas como son los sistemas distribui-dos de aplicaciones para venta al detalle por la Web y de banca. Las arquitecturas refe-renciales intentan ejemplificar las estructuras TI típicas y las operaciones de empresasgrandes y medianas. Los siguientes apartados describen las arquitecturas referencialesprimarias para los objetos controlados por datos y los multi-nivel.

La página Web de Microsoft sobre arquitecturas referenciales es http://msdn.microsoft.com-/architecture/. Esta página contiene vínculos al Microsoft Architects JOURNAL (archivosPDF), otras páginas relaciones y Weblogs.

3.2.1 Windows Server System Reference ArchitectureLa arquitectura referencial WSSRA es la actualización del servidor Windows Server 2003de Microsoft Systems Architecture 1.5 para Windows 2000 Server. WSSRA proporcionarecomendaciones sobre el hardware y la configuración de los sistemas operativos anivel de empresa. La guía de implementación de los Data Services toma como base elSQL Server 2000, pero las recomendaciones pueden aplicarse también al SQLServer2005.

79

Concretando proyectos reales

VisualBasic2005_03.qxp 02/08/2007 16:18 PÆgina 79

Page 11: 2.5.1 Comparando los diseñadores de datos de ADO.NET …galeon.com/melissacalleja1/basesdatos3.pdf ·  · 2012-11-09riores de Windows – excepto DataSet- con los siguientes objetos

3.2.2 Designando aplicaciones y serviciosApplication Architecture for .NET: Designing Applications and Services (2002) es un libro de169 páginas que describe la arquitectura recomendada para los sistemas distribuidos,construidos con múltiples niveles. Los capítulos individuales tratan las mejoras y metasreferenciales, el diseño de componentes y su interacción, los temas sobre seguridad,gestión y desarrollo. Esta publicación proporciona los fundamentos para todas lasdemás arquiteturas referenciales para .NET. Todos los desarrolladores de aplicaciones.NET no triviales deberían leer este libro.

La implementación de referencia es una aplicación relativamente sencilla para ventasal detalle por la Web que incluye los siguientes tipos de componentes:

User interface Agente de servicio

User process components Interfaz de servicio

Business workflows Securidad

Business components and entities Administración

Data access logic Comunicación

Más adelante en este capítulo se describen los componentes lógicos de acceso a datos(en inglés: data access logic components o DALCs). Los componentes interfaz de servicioy agente de servicio conectan a los servicios Web XML.

Microsoft publicó a principios de 2003 el PAG Enterprise Template: Application Architec-ture for .NET 2002 and 2003. PAG es el acrónimo de Prescriptive Architecture Guidance. Elinstalador añade una arquitectura de aplicación para el nodo del Ayudante .NET a lacarpeta de plantillas de VS 2003. Las plantillas de subnodo crean borradores de proyec-tos para 11 de los tipos de componentes descritos en el libro. La mayor parte de losborradores contienen referencias a los espacios-nombre de .NET que se requieren parael proyecto de los componentes, pero no incluyen código fuente.

3.2.3 Arquitecrura referencial para el desarrollo empresarialLa Microsoft Enterprise Development Reference Architecture (ERDA), versión 1.0 (original-mente codificada como Shadowfax) es un marco para las aplicaciones orientadas al ser-vicio de desarrollo con SQLServer, servicios Web ASP.NET, Microsoft Message Queue(MSMQ), y otros sistemas de “back-end”. La implementación de referencia, llamada Glo-balBank, es el punto de partida para un portal de banca online que permite a los clien-tes acceder a su información bancaria personal. Más adelante en este capítulo, describeel nuevo Integration Patterns, que utiliza Global Bank como implementación de referencia.

3.3 Encontrar modelos para proyectosUn modelo de software suele definir una solución común para las labores recurrentesespecíficas en TI, como restablecer o actualizar los datos de las tablas de bases de datoscon aplicaciones que muchas veces carecen de conectividad con las bases de datos enred durante un extenso periodo, la clásica situación del cliente desconectado. La regla

80

Bases de datos con Visual Basic

VisualBasic2005_03.qxp 02/08/2007 16:18 PÆgina 80

Page 12: 2.5.1 Comparando los diseñadores de datos de ADO.NET …galeon.com/melissacalleja1/basesdatos3.pdf ·  · 2012-11-09riores de Windows – excepto DataSet- con los siguientes objetos

general es que un modelo determinado debe ser aplicable al menos a tres instancias dela tarea. La página "What Is a Pattern" del sitio Web AntiPatterns (http://www.antipat-terns.com/whatisapattern/) describe la primera instancia como un evento, la segunda co-mo una coincidencia y la tercera como un posible modelo. Otras instancias adicionalesprestan mayor credibilidad al modelo.

Un modelo cada vez más utilizado en las organizaciones o comunidades de softwaretiene muchas posibilidades de convertirse en una plantilla. Una definición común deplantilla modelo es la de documentación estructurada para un modelo que se puedeañadir a un catálogo de plantillas o de modelos. Los apartados siguientes describenmodelos que se pueden aplicar a todas las aplicaciones .NET en general y las aplicacio-nes “data-driven” en particular.

3.3.1 Enterprise Solution Patterns Using Microsoft .NETEnterprise Solution Patterns Using Microsoft .NET (2003, versión 2.0) es la madre detodas las plantillas .NET. Este libro de 367 páginas recoge 32 plantillas divididas encinco grupos: Web Presentation, Data Access, Performance and Reliability, Services y Deploy-ment. "Data Transfer Object", "Implementing Data Transfer Object in .NET with a Data Set"e "Implementing Data Transfer Object in .NET with a Typed Data Set", temas tratados másadelante en este libro, son los miembros del grupo "Data Access”.

Se puede leer, o descargar una versión en PDF del libro en http://msdn.microsoft.com/libra-ry/en-us/dnpatterns/html/Esp.asp.

El libro define el objeto de transferencia de datos, Data Transfer Object (DTO), como unsimple contenedor para un conjunto de datos agregados que hay que transferir a tra-vés de un proceso o más allá de los límites de la red, y después dedica unas cuantaspáginas considerando los aspectos “hunky versus chatty" en las llamadas remotas dedatos. Se hace mucha referencia a "Data Transfer Object in .NET with Serialized Objects",aunque este tópico no aparece en la segunda edición. Su fuente se puede identificar enel Apéndice A, "Pattlets", como Microsoft P&P, pero una búsqueda más a fondo nolleva más allá de las entradas relacionadas con los temas relacionados con los juegos dedatos (DataSet). Las dos implementaciones del libro proporcionan código de ejemploC# para testar las unidades con el espacio-nombre NUnit.Framework. La sección poste-rior "Automate Test-Driven Development" da más detalles sobre cómo testar las plantillascon NUnit.

Hay un salto considerable en describir los DTOs como "simples contenedores" y reco-mendar a continuación su implementación con los juegos de datos no tipificados deADO.NET o, más aún, con los tipificados de ADO.NET 2.0. Las plantillas de implemen-tación reconocen la fiabilidad de la no interoperabilidad de los juegos de datos, pero ellibro no trata el tema del XML añadido por los juegos de datos tipificados, cuando vie-nen gestionados por .NET accediendo a XML o en formato binario, o serializados amensajes de servicios Web. A diferencia de Application Architecture for .NET: DesigningApllications and Services, aquí puede saltarse tranquilamente los tópicos sobre los datosde esta colección de modelos.

81

Concretando proyectos reales

VisualBasic2005_03.qxp 02/08/2007 16:18 PÆgina 81

Page 13: 2.5.1 Comparando los diseñadores de datos de ADO.NET …galeon.com/melissacalleja1/basesdatos3.pdf ·  · 2012-11-09riores de Windows – excepto DataSet- con los siguientes objetos

3.3.2 Data PatternsData Patterns (2003) es un libro de 196 páginas que identifica un grupo, o cluster, demovimiento de datos. Un cluster es un grupo de modelos relacionados entre sí, con unmodelo raíz para todo el grupo Moving Copy of Data es el cluster de la primera ediciónde Data Patterns. Los clusters de modelos tiene niveles variables de abstracción (arqui-tectura, diseño e implementación) sólo la implementación depende de la plataforma yes específica para cada vendedor de base de datos. Base de datos, aplicación, desarro-llo y puntos de vista estructurales son aspectos que representan a los miembros de undepartamento TI típico: DBAs, desarrolladores, administradores de red y arquitectosde sistema.

El cluster Moving Copy of Data engloba operaciones de extraer-transformar-cargar, eninglés extract-transform-load (ETL), y varios tipos de réplica basada en el servidor, comomaestro-maestro y maestro-esclavo, con diseños transaccionales e instantáneos. Lasimplementaciones, por supuesto, usan el servidor de Microsoft SQL 2000 o posteriores.Cada modelo tiene una plantilla con los tópicos Contexto, Problema, Fuerzas y Soluciones.

3.3.3 Modelos de sistemas distribuidosLa publicación oficial Distributed Systems Patterns (Version 1.1.0) esboza en líneas gene-rales un cluster de modelos para la colaboración de objetos a través de procesos y redes.El cluster incluye modelos para invocar objetos remotos con modelos Singleton y Brokerpara .NET remoting, y el objeto Data Transfer Object (DTO), que crea una copia local dela instancia de un objeto remoto. Este es uno de los pocos libros sobre modelos y publi-caciones oficiales que no trata de la arquitectura orientada a servicios ni de serviciosWeb.

3.3.4 Modelos de integraciónIntegration Patterns (2004) es un catálogo de modelos EAI para la integración de aplica-ciones de empresa, en inglés: enterprise application integration (EAI) patterns. El Diccio-nario de Comercio Electrónico (Electronic Commerce Dictionary, en http://www.tedhay-nes.com/haynes1/atol.html) define los EAI como:

Vincular y compartir muchos datos y aplicaciones de empresa, inclusive extensiones asocios, a través del uso de módulos aplicación-a-aplicación, o plataformas de servidor“multi-tier”. Una de las motivaciones de EAI es la necesidad de implementar rápida-mente los proyectos basados en la Web, la necesidad de vincularse a datos heredadosy la necesidad de crear vínculos a diferentes sistemas adquiridos a través de mezclado-res y adquisiciones corporados.

Integration Patterns marca los pasos que el grupo ficticio TI de desarrollo de Global Banksigue para desarrollar un portal Web de autoservicio para pagos del usuario. El portalconecta a diferencias fuentes de datos e implementa las operaciones de pago con losdiez modelos EAI:

Entity Aggregation Function Integration

Process Integration Service-Oriented Integration

82

Bases de datos con Visual Basic

VisualBasic2005_03.qxp 02/08/2007 16:18 PÆgina 82

Page 14: 2.5.1 Comparando los diseñadores de datos de ADO.NET …galeon.com/melissacalleja1/basesdatos3.pdf ·  · 2012-11-09riores de Windows – excepto DataSet- con los siguientes objetos

Implementing Process

Integration with BizTalk Server 2004 Implementing Service-Oriented Integration with ASP.NET

Portal Integration Implementing Service-Oriented Integration with BizTalk Server 2004

Data Integration Presentation Integration

El capítulo "Data Integration" de Integration Patterns trata de los tres métodos para res-tablecer y actualizar datos:

Base de datos compartida: da acceso directo desde muchas bases de datos a otrabase determinada; este método minimiza los datos latentes.Mantener copias de datos: proporciona a cada aplicación su propia base de datos,la cual copia los datos a y desde una base de datos maestra. El tipo de copia, oréplica, y su sincronización determinan la latencia y sincronización de los datos.Transferencia de archivo: implica mover archivos lógicos entre el almacén dedatos y las aplicaciones independientes. Enviar juegos de datos normalizados enarchivos XML para su almacenamiento permanente en el cliente es un ejemplo delmétodo por transferencia de archivo.

Como la mayor parte de las P&P, Integration Patterns también enfatiza el uso de los ser-vicios Web y la difusión en los proyectos EAI. Más adelante en este capítulo, se exami-nam las ventajas y los inconvenientes de utilizar servicios Web para acceder a los datos.

3.3.5 Utilizar librerías de bloques de aplicacionesLos bloques de aplicaciones (application blocks) son bibliotecas de clases con componen-tes reutilizables a nivel de subsistema para implementar los servicios de aplicacionescomunes, como son el acceso a datos, encriptamiento e incluso logging. Cada bloque deaplicación viene con un rápido ejemplo inicial, documentación y código fuente. El códi-go fuente permite modificar y ampliar los bloques para adaptarlos al propio entorno dedesarrollo y requisitos del sistema. Microsoft lanzó los bloques originales para VS 2002(entonces llamado Visual Studio .NET) y .NET 1.0 en 2002 como versión 1.0. Los bloquesse actualizaron como versión 2.0 con VS 2003 y .NET 1.1 en 2004. Muchas de las másoriginales bibliotecas de bloques de aplicación se reescribieron entonces como elemen-tos de los patterns & practices de Enterprise Library, que Microsoft lanzó en Enero de 2005.Enterprise Library incorpora partes de la Avenade Connected Architecture para .NET (ACA.-NET). Avenade, Inc., es una empresa independiente consultora de software formadapor Accenture y Microsoft en el año 2000.

A continuación mencionamos los bloques disponibles en las versiones .NET 1.x en elmomento de escribir este libro:

Aggregation Application Block Data Access Application Block*

Asynchronous Invocation Application Block Exception Handling Application Block*

Authorization and Profile Application Block Logging and Instrumentation Application Block*

Caching Application Block* Security Application Block*

83

Concretando proyectos reales

VisualBasic2005_03.qxp 02/08/2007 16:18 PÆgina 83

Page 15: 2.5.1 Comparando los diseñadores de datos de ADO.NET …galeon.com/melissacalleja1/basesdatos3.pdf ·  · 2012-11-09riores de Windows – excepto DataSet- con los siguientes objetos

Configuration Application Block* Smart Client Offline Application Block

Cryptography Application Block* Updater Application Block User Interface Process Application Block - V2

Los bloques de aplicación de la tabla anterior marcados con un asterisco (*) están incluidos enla descarga de bloques de aplicación de Enterprise Library de Enero de 2005.

Los bloques de aplicación de Enterprise Library requieren que compile el código fuentede .NET 1.1 con archivos de comandos o VS 2003 para crear Microsoft.Practices.Enter-priseLibrary.BlockName.dll. Después hay que añadir referencias en el proyecto VS 2005 alos ensamblajes apropiados. QuickStart clients implica escribir soluciones desde proyec-tos múltiples y con muchos archivos. Muchos de los ensamblajes de bloque dependende otros ensamblajes raíz, como Microsoft.Practices.EnterpriseLibrary.Common.dll yMicrosoft.Practices.EnterpriseLibrary.Configuration.dll. Versiones anteriores de los blo-ques de aplicación incluían bibliotecas VB y C#; Enterprise Library sólo tiene bibliotecasC#. De todos modos, los QuickStart clients incluyen código fuente VB y C#.

Los dos apartados siguientes describen el bloque Data Access Application Block (DAAB)y su QuickStart test client, un ejemplo de proyecto de formulario Windows que usa el blo-que Data Application para restablecer y actualizar datos del SQLServer 2000 o 2005. Elayudante VS 2005 Upgrade Wizard no es de gran ayuda con VS 2005 y el código fuentede la Enterprise Library de Enero del 2005, ya que hace fallar la actualización automáti-ca. A cambio, el proyecto de ejemplo DataAccessQuickStart.sln VB 2005 incluye los com-ponentes actualizados manualmente, necesarios para crear objetos DAB y ejecutar susmétodos en VS 2005.

3.4 El bloque de aplicación Data Access (Data Access Application Block)

El objetivo original del DAAB era minimizar el número de líneas de código que el usua-rio necesita para crear y manipular las componentes runtime de acceso de datos del ser-vidor SQL de ADO.NET 1.x. La versión de Enterprise Library permite integrar otros blo-ques de aplicación que proporcionan la condiguración estándar, instrumentación yseguridad para las operaciones de restablecimiento y actualización de datos. El DAABactualizado manipula DataSets, DataReaders, XmlReaders, y valores escalares de lastablas de base de datos SQL Server, Oracle y DB2. El DAAB de Enterprise Library es total-mente incompatible con las versiones anteriores. Lo único que tienen en común las dosversiones es que ambas utilizan la clase SqlCommandBuilder para autogenerar objetosSqlCommand.

Para instalar la base de datos de ejemplo, los procedimientos almacenados y para pro-bar el proyecto actualizado DataAccessQuickStart.sln, hay que seguir estos pasos:

1. Primero debemos bajar el DAAB desde la dirección http://www.microsoft.com/down-loads/details.aspx?FamilyId=F63D1F0A-9877-4A7B-88EC-0426B48DF275&display-lang=en

84

Bases de datos con Visual Basic

VisualBasic2005_03.qxp 02/08/2007 16:18 PÆgina 84

Page 16: 2.5.1 Comparando los diseñadores de datos de ADO.NET …galeon.com/melissacalleja1/basesdatos3.pdf ·  · 2012-11-09riores de Windows – excepto DataSet- con los siguientes objetos

Al terminar la instalación se crea un submenú en Inicio\Programas\MicrosoftApplication Blocks for .NET dentro de este hay un submenú Data Access dentro delcual encontraremos Documentación referente a DAAB y accesos para cargar el pro-yecto ya sea en VB o en C#.

Ya instalado el DAAB, abrimos el proyecto hecho en VB y seleccionamos la opciónGenerar Solución del menú Generar el la biblioteca ya que el archivo de instalaciónno lo tiene o bien no lo crea al instalar el DAAB.

2. Si trabaja con SQL Server 2000 2005, abra el script DataAccessQuickStart.sql en elprograma SQL Server Management Studio (SSMS), y ejecútelo para crear en localhostla base de datos de ejemplo EntLibQuickStarts del SQL Server con las tablas Custo-mers, Products, Credits, y Debits, ocho procedimientos almacenados y dos triggers enla tabla de Products.

Si trabaja con SQLServer Express, ejecute el script DataAccessQuickStart.sql conSqlCmd.exe. En este caso, debe cambiar el atributo value del parámetro server delarchivo dataConfiguration.config por .\SQLEXPRESS o \localhost\SQLEXPRESS enlugar de localhost, tal como ilustra el siguiente listado.

3. Abra DataAccessQuickStart.sln en VS 2005 o VBX, y pulse <F5> para crear y ejecu-tar el proyecto.

4. Si obtiene mensajes de error porque faltan espacios-nombre, borre las referenciasa las tres directivas Microsoft.Practices... y créelos de nuevo desde las copias DLL enla carpeta ...\DataAccessQuickStart\Assemblies folder.

5. Pruebe la conectividad de la base de datos y el código ejemplo actualizado clican-do en cada uno de los siete botones, lo cual invocará el método aplicable al bloquede aplicación de datos.

3.4.1 El archivo de configuración de datosEl archivo dataConfiguration.config contiene los valores de configuración de la cadena deconexión específica a la base de datos. El ensamblaje del bloque de aplicaciónConfiguration deserializa el archivo de configuración. A continuación vemos el archivodataConfiguration.config de la base de datos de ejemplo del EntLibQuickStarts SQLServerde DataAccessQuickStart, con los elementos databaseType y connectionString:

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

<dataConfiguration>

<xmlSerializerSection type=

“Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings,

Microsoft.Practices.EnterpriseLibrary.Data”>

<enterpriseLibrary.databaseSettings

xmlns:xsd=”http://www.w3.org/2001/XMLSchema”

xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”

defaultInstance=”DataAccessQuickStart”

xmlns=”http://www.microsoft.com/practices/enterpriselibrary/08-31-

2004/data”>

85

Concretando proyectos reales

VisualBasic2005_03.qxp 02/08/2007 16:18 PÆgina 85

Page 17: 2.5.1 Comparando los diseñadores de datos de ADO.NET …galeon.com/melissacalleja1/basesdatos3.pdf ·  · 2012-11-09riores de Windows – excepto DataSet- con los siguientes objetos

<databaseTypes>

<databaseType name=”Sql Server”

type=”Microsoft.Practices.EnterpriseLibrary.Data.Sql.SqlDatabase,

Microsoft.Practices.EnterpriseLibrary.Data” />

</databaseTypes>

<instances>

<instance name=”DataAccessQuickStart” type=”Sql Server”

connectionString=”LocalQuickStart” />

</instances>

<connectionStrings>

<connectionString name=”LocalQuickStart”>

<parameters>

<!-- For SQL Express value=”.\SQLEXPRESS” or “localhost\SQLEXPRESS” -->

<parameter name=”server” value=”localhost” isSensitive=”false” />

<parameter name=”database” value=”EntLibQuickStarts”

isSensitive=”false” />

<parameter name=”Integrated Security” value=”True”

isSensitive=”false” />

</parameters>

</connectionString>

</connectionStrings>

</enterpriseLibrary.databaseSettings>

</xmlSerializerSection>

</dataConfiguration>

En teoría, sólo hace falta un cambio en el archivo dataConfiguration.config para cambiara cualquiera de los tres de tipos de base de datos soportados. Especificar el databaseTypedetermina la conexión, comando y la clase del operador.

3.4.2 Código de restablecimiento de datosDespués de definir una conexión a una base de datos con el archivo de configuración yuna instrucción DimdbAsDatabase=DatabaseFactory.CreateDatabase(), se puede restable-cer o actualizar datos con sobrecargas del método db.DBCommandWrapper y una de lasinstrucciones siguientes:

db.ExecuteReader(dbCommandWrapper)

db.ExecuteXmlReader(dbCommandWrapper)

db.ExecuteScalar(dbCommandWrapper)

db.ExecuteDataSet(dbCommandWrapper)

db.UpdateDataSet(dbCommandWrapper)

db.ExecuteNonQuery(dbCommandWrapper)

A modo de ejemplo, el extracto siguiente devuelve un objeto no tipificado DataSet quepuede servir como valor de la propiedad DataGridView.DataSource:

Dim dbSQL as Database = DatabaseFactory.CreateDatabase()

Dim strSQL as String = SELECT * FROM Products WHERE CategoryID = 2

86

Bases de datos con Visual Basic

VisualBasic2005_03.qxp 02/08/2007 16:18 PÆgina 86

Page 18: 2.5.1 Comparando los diseñadores de datos de ADO.NET …galeon.com/melissacalleja1/basesdatos3.pdf ·  · 2012-11-09riores de Windows – excepto DataSet- con los siguientes objetos

Dim cwSQL as DBCommandWrapper = dbSQL.GetSqlStringCommandWrapper(strSQL)

Dim dsProducts As DataSet = dbSQL.ExecuteDataSet(cwSQL)

Las sobrecargas DBCommandWrapper.AddInParameteter() y DBCommandWrapper.Add-OutParameteter() manejan búsquedas parametrizadas y procedimientos almacenados.El siguiente esquema de código presupone que el procedimiento almacenadoGetProductDetails contiene un parámetro de entrada @ProductID, y los parámetros desalida @ProductName y @UnitPrice:

Dim dbSQL as Database = DatabaseFactory.CreateDatabase()

Dim cwSP as DBCommandWrapper = _

dbSQL.GetStoredProcCommandWrapper( GetProductDetails )

cwSP.AddInParameter( @ProductID , DbType.Int32, 2)

cwSP.AddOutParameter( @ProductName , DbType.String, 50)

cwSP.AddOutParameter( @UnitPrice , DbType.Currency, 8)

dbSQL.ExecuteNonQuery(cwSP)

Dim strReturn As String = cwSP.GetParameterValue( @ProductID ).ToString + , + _

cwSP.GetParameterValue( @ProductName ).ToString + , + _

Format(cwSP.GetParameterValue( @UnitPrice ), $#,##0.00 )

El tercer argumento del método AddInParameter es el valor proporcionado al parámetro del pro-cedimiento almacenado. El tercer argumento del método AddOutParameter es la longitud de losdatos.

Restablecer los metadatos de parámetro para el método GetStoredProceCommandWrap-per(strProcName) normalmente requiere ir hasta el servidor cada vez que se ejecuta unprocedimiento almacenado parametrizado. El bloque de aplicación de datos eliminalos restablecimientos repetitivos ocultando metadata de parámetro en una hashtable. Elmétodo restablece los parámetros de un procedimiento específico sólo si no están pre-sentes en la memoria cache. Los parámetros ocultos tienen soporte automático.

3.4.3 Código de actualización de datosEl método Database.UpdateDataSet (dsDataSet, strTableName, cwInsert, cwUpdate,cwDelete, intUpdateBehavior) realiza múltiples operaciones de actualización en la tablade datos especificada en el argumento strTableName. La enumeración UpdateBehaviordetermina la respuesta del método ante un error de actualización: Standard (0, por de-fecto) detiene la ejecución, Continue (1) actualiza las filas restantes, y Transactional (2)retrocede todas las actualizaciones.

La base de datos de ejemplo del DAAB incorpora los procedimientos almacenadosAddProduct, UpdateProduct, y DeleteProduct. El siguiente extracto, proveniente del pro-yecto de ejemplo DataAccessQuickStart, crea un nuevo juego de datos no tipificado,añade y puebla una tabla de datos Products, añade una fila nueva a la tabla baseProducts, actualiza una fila existente y anuncia que borrará la fila añadida:

Dim dbSQL As Database = DatabaseFactory.CreateDatabase()

Create an untyped DataSet; add and populate the Products table

Dim dsProducts As DataSet = New DataSet

87

Concretando proyectos reales

VisualBasic2005_03.qxp 02/08/2007 16:18 PÆgina 87

Page 19: 2.5.1 Comparando los diseñadores de datos de ADO.NET …galeon.com/melissacalleja1/basesdatos3.pdf ·  · 2012-11-09riores de Windows – excepto DataSet- con los siguientes objetos

Dim cwSelect As DBCommandWrapper = dbSQL.GetSqlStringCommandWrapper( SELECT * FROM

Products )

dbSQL.LoadDataSet(cwSelect, dsProducts, Products )

Dim dtProducts As DataTable = dsProducts.Tables( Products )

Add a new row to the Products table

Dim objRow(3) As Object

objRow(0) = DBNull.Value

objRow(1) = Added Row Product Name

objRow(2) = 11

objRow(3) = 12.5

dtProducts.Rows.Add(objRow)

Dim cwInsert As DBCommandWrapper = dbSQL.GetStoredProcCommandWrapper( AddProduct )

cwInsert.AddInParameter( @ProductName , DbType.String, ProductName ,

DataRowVersion.Current)

cwInsert.AddInParameter( @CategoryID , DbType.Int32, CategoryID ,

DataRowVersion.Current)

cwInsert.AddInParameter( @UnitPrice , DbType.Currency, UnitPrice ,

DataRowVersion.Current)

Dim cwDelete As DBCommandWrapper = dbSQL.GetStoredProcCommandWrapper(

DeleteProduct )

cwDelete.AddInParameter( @ProductID , DbType.Int32, ProductID ,

DataRowVersion.Current)

dtProducts.Rows(0).Item(1) = Modified Row Product Name

Dim cwUpdate As DBCommandWrapper = dbSQL.GetStoredProcCommandWrapper(

UpdateProduct )

cwUpdate.AddInParameter( @ProductID , DbType.Int32, ProductID ,

DataRowVersion.Current)

cwUpdate.AddInParameter( @ProductName , DbType.String, ProductName ,

DataRowVersion.Current)

cwUpdate.AddInParameter( @LastUpdate , DbType.DateTime, LastUpdate ,

DataRowVersion.Current)

Dim intRowsUpdated = dbSQL.UpdateDataSet(dsProducts, Products , cwInsert, _

cwUpdate, cwDelete, UpdateBehavior.Transactional)

Invocando el método dbSQL.UpdateDataSet() se ejecuta el comando cwDeletecommandpero no se borra la fila de la tabla Products que añade el comando cwInsert. El valor deDataRowVersion.Current para la fila añadida es DbNull.Value, por lo que el comando noborra ninguna fila de la tabla base. Puede comprobar que no se ha borrado la fila aña-dida, "New product", ejecutando el proyecto DataAccessQuickStart.sln, pulsando elbotón Update a Database Using a DataSet y abriendo la tabla EntLibQuickStarts.Productsen VS 2005 Standard Edition o superiores, SSMS, o XM.

Para resolver el problema anterior se puede añadir el siguiente código para devolver latabla Products a su estado original (exceptuando el valor current identity seed) despuésde los cambios realizados por el extracto anterior o el DataAccessQuickStartClient:

Dim dbSQL As Database = DatabaseFactory.CreateDatabase()

Dim strDeleteSQL As String = DELETE FROM Products WHERE ProductName = Added Row

88

Bases de datos con Visual Basic

VisualBasic2005_03.qxp 02/08/2007 16:18 PÆgina 88

Page 20: 2.5.1 Comparando los diseñadores de datos de ADO.NET …galeon.com/melissacalleja1/basesdatos3.pdf ·  · 2012-11-09riores de Windows – excepto DataSet- con los siguientes objetos

Product Name

Dim intCtr As Integer = dbSQL.ExecuteNonQuery(CommandType.Text, strDeleteSQL)

strDeleteSQL = DELETE FROM Products WHERE ProductName = New product

intCtr += dbSQL.ExecuteNonQuery(CommandType.Text, strDeleteSQL)

Dim strUpdateSQL As String = UPDATE Products SET ProductName = Chai WHERE ProductID

= 1

intCtr += dbSQL.ExecuteNonQuery(CommandType.Text, strUpdateSQL)

Los desarrolladores de la Enterprise Library invirtieron gran esfuerzo en el desarrollopor tests de los bloques de aplicación en C# y en añadir casos de prueba Nunit, peroapenas cambiaron la primera implementación del DataAccessStartClient de laEntreprise Library.

3.5 El cliente DataAccessQuickStartEl cliente DataAccessQuickStart incluye la clase VB salesData que simula un sencilloDALC específico de base de datos para el SQL Server y la base de datos de ejemploEntLibQuickStarts. Manejadores de eventos de siete botones invocan métodos salesDatacomo GetCustomerList(), GetProductsInCategory(intCategory), y UpdateProducts(). Lasiguiente figura muestra el formulario QuickStartForm después de pulsar el botón supe-rior (Retrieve multiple rows using a DataReader), que invoca el método SalesData.Get-CustomerList().

A continuación vemos código comentado para el método SalesData.GetCustomerList():

Public Function GetCustomerList() As String

Dim db As Database = DatabaseFactory.CreateDatabase()

Dim sqlCommand As String = SELECT CustomerID, Name, Address, City,

89

Concretando proyectos reales

VisualBasic2005_03.qxp 02/08/2007 16:18 PÆgina 89

Page 21: 2.5.1 Comparando los diseñadores de datos de ADO.NET …galeon.com/melissacalleja1/basesdatos3.pdf ·  · 2012-11-09riores de Windows – excepto DataSet- con los siguientes objetos

Country, PostalCode FROM Customers

Dim dbCommandWrapper As DBCommandWrapper = _

db.GetSqlStringCommandWrapper(sqlCommand)

Dim dataReader As IDataReader = db.ExecuteReader(dbCommandWrapper)

Dim readerData As StringBuilder = New StringBuilder

While dataReader.Read()

readerData.Append(dataReader(Name))

readerData.Append(Environment.NewLine)

End While

dataReader.Close()

Return readerData.ToString()

End Function

A continuación vemos código convencional ADO.NET 2.0 para acceder a los objetosSqlClient directamente desde el archivo de clase QuickStartForm.vb con la cadena deconexión guardada en el archivo app.config:

Private Sub compareUsingReaderButton()

strConn = My.Settings.QuickStartConnection

Dim cnQS As New SqlClient.SqlConnection(strConn)

Dim strSQL As String = SELECT CustomerID, Name, Address, City, Country,

PostalCode FROM Customers

Dim cmQS As New SqlClient.SqlCommand(strSQL, cnQS)

cnQS.Open()

Dim sdrData As SqlClient.SqlDataReader = cmQS.ExecuteReader

Dim sbData As New System.Text.StringBuilder

With sdrData

While .Read

sbData.Append(sdrData(1).ToString + vbCrLf)

End While

.Close()

End With

cnQS.Close()

Me.DisplayResults( Alternative Data Reader , sbData.ToString)

End Sub

Comparando los dos ejemplos de código anteriores, que tienen aproximadamente elmismo número de líneas activas, vemos que no hay una reducción apreciable en la can-tidad de código necesaria para implementar un DataReader con DAAB. Actualizar datoscon DAAB requiere menos código escrito manualmente, pero no implementa juegos dedatos no tipificados, ni grupos secuenciales de actualizaciones, entradas y eliminaciónde datos de las tablas base referentes a la actualización.

La empresa de estudios de mercado Gartner citaba Avenade como uno de sus cuatro"Cool Vendors in IT Services and Outsourcing 2005" debido a las nuevas funciones orien-tadas a la programación (en inglés aspect-oriented programming, AOP) que ACA.NET 4.0añade a los bloques de aplicación de la Enterprise Library basadas en ACA.NET. Uno delos principios de AOP es "separar preocupaciones". Las preocupaciones en torno a una

90

Bases de datos con Visual Basic

VisualBasic2005_03.qxp 02/08/2007 16:18 PÆgina 90

Page 22: 2.5.1 Comparando los diseñadores de datos de ADO.NET …galeon.com/melissacalleja1/basesdatos3.pdf ·  · 2012-11-09riores de Windows – excepto DataSet- con los siguientes objetos

aplicación pueden ser su rendimiento, precisión, auditabilidad, seguridad, estructurasde datos y flujos de datos. Si los programadores de la aplicación pueden confiar enencontrar métodos estándar seguros para gestionar las estructuras y los flujos de datos,no tendrán que preocuparse de escribir código para implementar estos métodos. Lacuestión es si el nivel adicional de abstracción en la gestión de datos que proporcionanlos, más allá del inherente al juego de herramientas de ADO.NET 2.0 y VS 2005 justifi-ca la curva de aprendizaje de DAAB, sus limitaciones potenciales, o ambas cosas.

3.6 Seguir las guías de diseñoLas guías de diseño son una formación predadora dentro del grupo de P&P y no com-parten una estructura o un estilo de escritura común con los modelos y arquitecturasreferenciales. Las guías no incluyen los nuevos objetos de ADO.NET 2.0 ni las propie-dades descritas en los dos capítulos anteriores, pero la mayor parte de sus recomenda-ciones se pueden aplicar a los proyectos con .NET 2.0.

3.6.1 La guía .NET Data Access Architecture GuideLa guía .NET Data Access Architecture Guide (2001, actualizada en 2003), de 86 páginas,es un documento dirigido a desarrolladores novicios en ADO.NET. La guía actualiza-da hace recomendaciones específicas sobre los siguientes tópicos de ADO.NET 1.1:

Managing Database Connections Performing Database Updates with DataSets

Error Handling Using Strongly Typed DataSet Objects

Performance Working with Null Data Fields

Connecting Through Firewalls Transactions

Handling BLOBs Data Paging

La guía enfatiza el uso de DataSets, lo cual no es sorprendente si se considera que losDataSets son una de las propiedades básicas distintivas de ADO.NET y que Microsofthizo una gran inversión para automatizar la creación de DataSet tipificados en todas lasversiones de VS.

3.6.2 Mejorando el rendimiento y la escalabilidad de la aplicación .NETImproving .NET Application Performance and Scalability (2004), con sus 1.124 páginas, esla más larga de todas las publicaciones sobre P&P, y va destinada específicamente a losdesarrolladores de la aplicación .NET 1.1, incorpora y actualiza consejos sobre rendi-miento sacados de libros anteriores sobre modelos de diseño y las mejores prácticas. Lamayoría de los capítulos incluyen una lista de chequeo donde se resumen en detalle lasrecomendaciones sobre rendimiento.

Los cuatro capítulos más interesantes para los desarrolladores de aplicaciones conbases de datos son los siguientes:

Capítulo 12, “Improving ADO.NET Performance”.Capítulo 14, “Improving SQL Server Performance”.

91

Concretando proyectos reales

VisualBasic2005_03.qxp 02/08/2007 16:18 PÆgina 91

Page 23: 2.5.1 Comparando los diseñadores de datos de ADO.NET …galeon.com/melissacalleja1/basesdatos3.pdf ·  · 2012-11-09riores de Windows – excepto DataSet- con los siguientes objetos

Capítulo 10, “Improving Web Service Performance”.Capítulo 11, “Improving Remoting Performance”.

El capítulo 12, publicado en Mayo del 2004, incluye algunas referencias sobre las mejo-ras de rendimiento que significan los objetos de las versiones pre-beta de ADO.NET 2.0.

3.6.3 Diseñar componentes Data Tier y pasar datos por tierDesigning Data Tier Components and Passing Data Through Tiers (2002) es una ediciónsobre papel, de 65 páginas, que incluye consejos para añadir nuevas capas a la presen-tación convencional de tres tiers, reglas de negocios y datos. La publicación define lasentidades de negocio (en inglés business entities – BEs), componentes lógicas de accesoa datos (DALCs, data access logic components), y componentes de proceso de negocios(BPCs, business process components) y trata las relaciones de BEs, DALCs y BPCs con lapresentación tier y el soporte físico de almacenamiento de datos. Es la publicación enpapel más citada de todas las relacionadas con .NET. A continuación describimos bre-vemente las tres capas definidas por la publicación:

Las BEs representan a los típicos elementos de una operación de negocios –comocliente, pedido, factura, producto o proveedor– como objetos de negocios. Las BEsnormalmente se mapean en forma de tablas relacionales, en cuyo caso la BE puedecontener datos de tablas relacionadas. Por ejemplo, las BE Pedido y Factura contie-nen miembros de ítem línea porque los pedidos y las facturas no son válidos sin,al menos, un ítem de línea. Si una tabla Clientes tiene otras tablas relacionadas enlas que se guardan contacto, dirección de factura o de envío, la BE Cliente incluiráesos mismos miembros. Los comerciantes y distribuidores pueden incluir datosdel proveedor relacionados con un producto BE.Las DALCs proporcionan BEs abstrayendo operaciones de creación, restableci-miento, actualización y borrado (CRUD: create, retrieve, update y delete) del soportede datos. Las DALC son clases sin estado que esconden datos sobre detalles deimplementación, como metadata de esquemas y propiedades de procedimientoalmacenado, de objetos que invocan sus métodos. Son igualmente responsables degestionar la consistencia de los datos y manejar los conflictos de concurrencia alejecutar las sentencias SQL más que los procedimientos almacenados para actuali-zaciones. Una DALC bien diseñada debería ser capaz de proporcionar una BE aformularios Windows o Web, servicios Web o periféricos manuales.Las BPCs implementan las reglas de negocio y añaden datos y gestión de manejode datos cuando las operaciones implican más de una BE. Las BPCs son responsa-bles de implementar un sinfín de relaciones, como las que hay entre las BEs Clientey Prodcuto. Si la BEs se mapea en tabla en bases de datos múltiples o depende delos servicios Web, para las actualizaciones son necesarias transacciones distribui-das. Las BPCs pueden incorporar gestión de workflow para transacciones de largaejecución, que pueden requerir transacciones compensativas para invertir los cam-bios realizados anterioremente en los almacenes de datos.

92

Bases de datos con Visual Basic

VisualBasic2005_03.qxp 02/08/2007 16:18 PÆgina 92

Page 24: 2.5.1 Comparando los diseñadores de datos de ADO.NET …galeon.com/melissacalleja1/basesdatos3.pdf ·  · 2012-11-09riores de Windows – excepto DataSet- con los siguientes objetos

Como en otras muchas guías de diseño e implementación .NET, los ejemplos de códi-go fuente están escritos sólo en C#, lo que refuerza la creencia de que VB.NET está con-siderado entre los desarrolladores de Microsoft como un "ciudadano de segunda clase".Por otra parte, esta publicación garantiza tiempos iguales para implementar BEs conobjetos custom data y DataSets. De todos modos, la implementación del objeto customdata de la clase OrderEntity especifica un miembro OrderDetails del tipo DataSet, quesupera la interoperabilidad entre plataformas. A continuación, un ejemplo sencillo deun objeto BE Order tipificado y jerárquico:

Public Class Order

Public OrderID As Int32

Public CustomerID As String

Public EmployeeID As Int32

Public OrderDate As Date

Public RequiredDate As Date

Public ShippedDate As Date

Public ShipVia As Int32

Public Freight As Decimal

Public ShipName As String

Public ShipAddress As String

Public ShipCity As String

Public ShipRegion As String

Public ShipPostalCode As String

Public ShipCountry As String

Public OrderDetails(24) As OrderDetail

End Class

Public Class OrderDetail

Public OrderID As Int32

Public ProductID As Int32

Public UnitPrice As Decimal

Public Quantity As Int16

Public Discount As Decimal

End Class

El diseño de la clase Order enfatiza la versatilidad e interoperabilidad, por lo que expo-ne campos públicos y representa ítems de línea en un sencillo array de ítemsOrderDetail con una longitud inicial máxima, más que un objeto ArrayList o un objetogenérico List(OfOrderDetail). (Una sentencia RedimPreserve elimina los elementosOrderDetail vacíos después de poblar el array.) Este diseño asegura la independencia deplataforma y lenguaje, y permite a los métodos Web de VS 2002 y 2003 serializar BEsPedido en mensajes SOAP. Los servicios WEB de .NET 2.0 también manejan objetos conmanejadores Get y Set para propiedades privadas de campo. A continuación, un ejem-plo de BE Order serializada:

<?xml version= 1.0 encoding= utf-8 ?>

<Order>

<OrderID>1617968</OrderID>

<CustomerID>QUICK</CustomerID>

93

Concretando proyectos reales

VisualBasic2005_03.qxp 02/08/2007 16:18 PÆgina 93

Page 25: 2.5.1 Comparando los diseñadores de datos de ADO.NET …galeon.com/melissacalleja1/basesdatos3.pdf ·  · 2012-11-09riores de Windows – excepto DataSet- con los siguientes objetos

<EmployeeID>9</EmployeeID>

<OrderDate>1996-08-15T00:00:00.0000000-07:00</OrderDate>

<RequiredDate>1996-09-02T00:00:00.0000000-07:00</RequiredDate>

<ShippedDate>1996-09-02T00:00:00.0000000-07:00</ShippedDate>

<ShipVia>3</ShipVia>

<Freight>76.07</Freight>

<ShipName>QUICK-Stop</ShipName>

<ShipAddress>Taucherstra e 10</ShipAddress>

<ShipCity>Cunewalde</ShipCity>

<ShipRegion />

<ShipPostalCode>01307</ShipPostalCode>

<ShipCountry>Germany</ShipCountry>

<OrderDetails>

<OrderDetail>

<OrderID>1617968</OrderID>

<ProductID>5</ProductID>

<UnitPrice>21.35</UnitPrice>

<Quantity>13</Quantity>

<Discount>0.18</Discount>

</OrderDetail>

<OrderDetail>

<OrderID>1617968</OrderID>

<ProductID>17</ProductID>

<UnitPrice>39</UnitPrice>

<Quantity>11</Quantity>

<Discount>0.12</Discount>

</OrderDetail>

</OrderDetails>

</Order>

Aquí tenemos un sencillo esquema XML para la BE serializada con atributos parasoportar las restricciones propias de la integridad referencial, un máximo de 25 ítemasde línea por pedido, y valores opcionales (nillable) dateTime, decimal, y string:

<?xml version= 1.0 encoding= utf-8 ?>

<xs:schema attributeFormDefault= unqualified elementFormDefault= qualified

xmlns:xs= http://www.w3.org/2001/XMLSchema >

<xs:element name= Order >

<xs:complexType>

<xs:sequence>

<xs:element name= OrderID type= xs:int />

<xs:element name= CustomerID minOccurs= 1 >

<xs:simpleType>

<xs:restriction base= xs:string >

<xs:length value= 5 fixed = true />

</xs:restriction>

</xs:simpleType>

</xs:element>

94

Bases de datos con Visual Basic

VisualBasic2005_03.qxp 02/08/2007 16:18 PÆgina 94

Page 26: 2.5.1 Comparando los diseñadores de datos de ADO.NET …galeon.com/melissacalleja1/basesdatos3.pdf ·  · 2012-11-09riores de Windows – excepto DataSet- con los siguientes objetos

<xs:element name= EmployeeID type= xs:int />

<xs:element name= OrderDate type= xs:dateTime />

<xs:element name= RequiredDate type= xs:dateTime nillable= true />

<xs:element name= ShippedDate type= xs:dateTime nillable= true />

<xs:element name= ShipVia type= xs:int />

<xs:element name= Freight type= xs:decimal nillable= true />

<xs:element name= ShipName type= xs:string minOccurs= 1 />

<xs:element name= ShipAddress type= xs:string minOccurs= 1 />

<xs:element name= ShipCity type= xs:string minOccurs= 1 />

<xs:element name= ShipRegion type= xs:string nillable= true />

<xs:element name= ShipPostalCode type= xs:string nillable= true />

<xs:element name= ShipCountry type= xs:string minOccurs= 1 />

<xs:element name= OrderDetails >

<xs:complexType>

<xs:sequence>

<xs:element minOccurs = 1 maxOccurs= 25 name= OrderDetail >

<xs:complexType>

<xs:sequence>

<xs:element name= OrderID type= xs:int />

<xs:element name= ProductID type= xs:int />

<xs:element name= UnitPrice type= xs:decimal />

<xs:element name= Quantity type= xs:short />

<xs:element name= Discount type= xs:decimal />

</xs:sequence>

</xs:complexType>

</xs:element>

</xs:sequence>

</xs:complexType>

</xs:element>

</xs:sequence>

</xs:complexType>

</xs:element>

</xs:schema>

El método Web GetOrderSP devuelve el pedido especificado en un parámetrointOrderID. El método UpdateOrInsertOrderSP actualiza un pedido individual; un valor0 en intOrderIDvalue inserta un nuevo pedido. El servicio Web es compatible con Java,Perl, y otros toolkits para los clientes de los servicios Web. A diferencia de otros servi-cios Web que proporcionan y actualizan juegos de datos, el esquema XML para losobjetos custom BE no contiene detalles sobre implementación.

VS 2005 convierte a los servicios Web que publican custom BEs en la fuente de datosequivalente a los juegos de datos tipificados. Cuando se añade una referencia Web a unservicio Web que publica un objeto BE serializado, fuertemente tipificado, la ventanade fuentes de datos muestra iconos de campo que son casi idénticos al par correspon-diente de datos relacionados. A modo de ejemplo, la representación de la fuente dedatos para la BE Orders es casi idéntica a las fuentes de datos para las tablas Northwind

95

Concretando proyectos reales

VisualBasic2005_03.qxp 02/08/2007 16:18 PÆgina 95

Page 27: 2.5.1 Comparando los diseñadores de datos de ADO.NET …galeon.com/melissacalleja1/basesdatos3.pdf ·  · 2012-11-09riores de Windows – excepto DataSet- con los siguientes objetos

Orders y Order Details, sólo cambian las secuencias de campos. Como con un par detablas de datos relacionadas, aquí también se puede arrastrar el nodo Orders hasta unformulario Windows y generar una OrderBindingSource, una OrderDetailsBindingSource,y un conjunto de cuadro de texto y controles DataGridView vinculados a los detalles-maestro.

El proyecto NWOrdersWSClient.sln ilustra la simplicidad de una aplicación de edicióncon formulario Windows para un pedido BE de ventas. Pulsando el botón Connect toWeb Service del formulario BoundClient.vb, se llena el cuadro combinado con una listade los diez últimos pedidos de venta. Pulsando el botón Get Selected Order se restable-ce el pedido de una determinada venta y sus items de línea con sólo cuatro líneas decódigo. Se puede editar los datos de la cabecera del pedido y los ítems de línea y des-pués actualizar la base de datos clicando el botón Update Order, ejecutando una solalínea de código. Los ítems de línea son un array sencillo, por lo que no se puede aña-dir o borrar ítems de línea en un DataGridView sin código adicional.

"Designing Data Tier Components and Passing Data Through Tiers" es una de las guías másútiles sobre arquitectura de aplicaciones para los proyectos .NET centralizados endatos, ya que proporciona ejemplos detallados de implementación en diferentes situa-ciones y con diferentes usos de las BE. Puede prescindir de los ejemplos que substitu-yen DataSets con arrays o colecciones de objetos hijo si su BE tiene que interoperar conaplicaciones en sistemas diferentes de Windows.

96

Bases de datos con Visual Basic

VisualBasic2005_03.qxp 02/08/2007 16:18 PÆgina 96

Page 28: 2.5.1 Comparando los diseñadores de datos de ADO.NET …galeon.com/melissacalleja1/basesdatos3.pdf ·  · 2012-11-09riores de Windows – excepto DataSet- con los siguientes objetos

3.7 Aplicar las directrices de diseño para la biblioteca de clas (Apply Class Library Design Guidelines)

Directrices de diseño para desarrolladores de la biblioteca de clases – Design Guidelines for ClassLibrary Developers es un documento de referencia que proporciona una guía detalladay prescriptiva para programar clases .NET. Para leer este miembro de .NET FrameworkGeneral Reference, busque el sitio MSDN para "Design Guidelines" (con las comillas). Lasdirectrices de la biblioteca de clases consisten en 14 tópicos principales que derivan anumerosos subtópicos. Dos de los tópicos más importantes son "Naming Guidelines" y"Class Member Usage Guidelines".

3.7.1 Naming GuidelinesLa mayoría de desarrolladores de VB6 y VBA aplican el estilo de notación húngaro(camelCase), prefijos tipificados para las variaables, nombres de formulario, controles,clases y miembros de clases. Esta práctica para prefijos de tres letras en nombres deobjeto tuvo su origen en la "Visual Basic Programmers Guide" de Microsoft en la era deVB3. Los servicios de consultoría de Microsoft extendieron la práctica recomendada delos prefijos de dos y tres letras para los objetos Jet de bases de datos. La mayoría de losejemplos de este libro y algunos ejemplos de código VB de Microsoft usan prefijos simi-lares para los nombres de instancias de tipo y variable de VB.NET.

El tópico "Naming Guidelines" contiene subtópicos para dar nombre a clases y sus miem-bros, pero no nombres de instancias. PascalCase es de rigor para los nombres de clasesy miembros en .NET, excepto los parámetros, que utilizan el camelCase, como entypeName. La BE Orders anterior seguía las prácticas .NET sobre nombres de PascalCase,pero no las recomendaciones de no usar campos de instancia Public. Las directricestambién recomendaban no usar guiones bajos en los nombres, pero el uso de _ o m_ co-mo prefijo para campos de instancia Private o Protected es una práctica común.

97

Concretando proyectos reales

VisualBasic2005_03.qxp 02/08/2007 16:18 PÆgina 97

Page 29: 2.5.1 Comparando los diseñadores de datos de ADO.NET …galeon.com/melissacalleja1/basesdatos3.pdf ·  · 2012-11-09riores de Windows – excepto DataSet- con los siguientes objetos

Finalmente, utilizar el tipo de clase como prefijo (C como en CTypeName) ha quedadofuera de uso, pero siempre se debe utilizar el prefijo I para identificar las interfaces.

Algunos desarrolladores tienen tendencia a utilizar camelCase al nombrar miembros yclases, por lo que las instancias serializadas son conformes de-facto a la convencióncamelCase para elementos y atributos XML. Todos los ejemplos de la recomendaciónW3C Extensible Markup Language (XML) 1.0 (tercera edición) usan nombres del tipocamelCase para elementos y atributos. En W3C XML Schema Part 0: Primer recommenda-tion en http://www.w3.org/TR/xmlschema-0/ se utiliza el modelo camelCase en las etioque-tas de elemento y en Infosets XML de ejemplo, como po-xml, que tiene una estructurasimilar a la de la BE Pedido. También verá ejemplos de nombres tipificados camelCase enalgunos métodos de servicio Web NWOrdersWS; estos nombres se crearon para cum-plir las convenciones de nombres XML de InfoPath 2003. Los nombres de las etiquetasXHTML requieren minúsculas, pero los Infosets XML no. Lo mejor es seguir las "NamingGuidelines" para las clases públicas y sus miembros, y elegir según criterio propiocamelCase o PascalCase para los nombres de elementos y atributos XML.

3.7.2 Class Member Usage GuidelinesEl tópico "Class Member Usage Guidelines" tiene subtópicos para todos los miembros declase. El subtópico "Field Usage Guidelines " recomienda no exponer los campos de ins-tancia Public o Protected a los desarrolladores porque convertir un campo público enuna propiedad no mantiene la compatibilidad binaria. En su lugar, es mejor utilizar losmétodos de acceso Get y Set. La guía también recomienda usar constantes para camposque no cambian de valor, ya que el compilador guarda las constantes directamente enel código que llama al objeto. Este tópico recomienda camelCase para distinguir losnombres de campo privados de los nombres de propiedad públicos, cosa que funcionacon C# pero no con VB, insensible a los casos.

El subtópico "Property Usage Guidelines" proporciona útiles consejos para determinarcuándo utilizar un método o una propiedad y, si se decide por la propiedad, como evi-tar los picos con las propiedades indexadas, como son las propiedades que definen ydevuelven arrays. Utilice una sola propiedad indexada por clase y hágala la propiedadindexada por defecto. Estas recomendaciones valen también para el miembroOrderDetails de la BE Orders, si cambia el miembro de un campo público a otro priva-do y añade la propiedad pública OrderDetails.

3.8 Prepararse para la arquitectura orientada al servicio La arquitectura orientada al servicio, en inglés Service-oriented architecture (SOA), esactualmente la referencia en a IT. Una búsqueda en Google por "service-oriented architec-ture" nos devuelve cerca de °25! millones de entradas con esas palabras. Los analistasde negocios, marketing y relaciones públicas son los máximos contribuyentes en la ali-mentación de la máquina SOA, que empezaron a ensamblar en los últimos estados dela combustión del punto-com. El auge de la SOA coincidió con el decaímiento de losservicios Web (XML) basados en SOAP.

98

Bases de datos con Visual Basic

VisualBasic2005_03.qxp 02/08/2007 16:18 PÆgina 98

Page 30: 2.5.1 Comparando los diseñadores de datos de ADO.NET …galeon.com/melissacalleja1/basesdatos3.pdf ·  · 2012-11-09riores de Windows – excepto DataSet- con los siguientes objetos

No es de estrañar que Microsoft subiera al tren de la SOA. Casi la mitad de las sesionesde la Tech*Ed 2004 sobre arquitectura incluían "service" y "oriented" en sus títulos (9 de19). El sitio MSDN devuelve más de 200 entradas con artículos en torno a la SOA, publi-caciones estatales, transmisiones Web (Web casts), y episodios de TV MSDN. El sitiowww.microsoft.com ofrece como cuatro veces más referencias a la SOA. Uno de los mayo-res incentivos de Microsoft en animar a los desarrolladores a comprar SOA es promo-ver la venta de licencias VS 2005 y que se adopte el sistema .NET Framework 2.0. VS 2002y 2003 simplifican considerablemente el proceso de escribir y publicar servicios WebASP.NET básicos; el jurado todavía tiene sus dudas sobre si VS 2005 simplifica o com-plica el código y los tests de los servicios Web.

3.8.1 El camino a la Arquitectura orientada al servicio (SOA)En el último medio siglo, la arquitectura de las aplicaciones de procesamiento de datosse ha desarrollado en las tres fases siguientes:

Arquitectura monolítica: encapsulaba la interfaz del usuario, la lógica de los nego-cios y las operaciones de almacenamiento de datos en una sola componente. Lasprimeras aplicaciones monolíticas consistían en terminales alfanuméricas conecta-das a bases de datos mainframe y gestores de transacciones. El PC permitió a usua-rios y desarrolladores beneficiarse de las ventajas del software de gestión de basede datos para escritorio, con programas como dBASE, Fox Pro, y Access, para crearaplicaciones monolíticas con almacenamiento de datos en los archivos locales o dered. La lógica orientada a los negocios incorporada en una aplicación no se puedeutilizar con otras aplicaciones.Arquitectura cliente-servidor: cambió la gestión y el almacenamiento de datos delescritorio a una aplicación de red, pero retuvo la UI, la lógica de los negocios, y loselementos de acceso a datos en un solo programa, como Visual Basic o algún otroejecutable, o un archivo .adp de Access. La arquitectura cliente-servidor permitíacentralizar la gestión de datos y pasar muchas de las aplicaciones CRUD (procesa-miento de búsquedas) del PC cliente al servidor con las bases de datos. Cada clien-te mantenía una conexión exclusiva con el servidor de la base de datos, lo cuallimitaba la escalabilidad de la aplicación. La lógica de negocios en el cliente y elcódigo de acceso a los datos no se podían compartir con otras aplicaciones.Arquitectura n-tier: encapsula la lógica de negocios y el acceso a datos en compo-nentes por capas individuales. Las UI del cliente acceden a la componente de lógi-ca de negocios, la cual conecta uno o más componentes de acceso de datos. Lascapas de acceso de datos sin estado comparten conexiones a la base de datos concomponentes múltiples de lógica de negocios, la cual comparten con el cliente lasresponsabilidades de la gestión de estado. DCOM, CORBA, y otras tecnologías decomponente permiten que los componentes de lógica de negocios y de acceso dedatos residan en múltiples servidores, haciendo así a las aplicaciones más escala-bles, robustas y fáciles de mantener.

La arquitectura cliente-servidor permite a los clientes operar con bases de datos backend que proporcionan controladores .NET, ODBC, JDBC u OLE DB y se ejecutan bajo

99

Concretando proyectos reales

VisualBasic2005_03.qxp 02/08/2007 16:18 PÆgina 99

Page 31: 2.5.1 Comparando los diseñadores de datos de ADO.NET …galeon.com/melissacalleja1/basesdatos3.pdf ·  · 2012-11-09riores de Windows – excepto DataSet- con los siguientes objetos

Windows, UNIX, Linux y sistemas operativos mainframe. Es mucho más difícil alcanzarinteroperabilidad entre componentes n-tier distribuidas, escritas en otros lenguajes deprogramación o que se ejecutan en sistemas operativos múltiples, o ambas cosas a lavez. Superar los problemas de interoperabilidad de los componentes distribuidos hahecho que proliferen los productos de software combinado y los servicios de consulto-ría, llamados "enterprise application integration (EAI)". El mercado de EAI se mantuvorelativamente fuerte durante la caída del punto-com y resurgió de nuevo más rápidoque ningún otro segmento del mercado IT cuando se recuperó la economía.

Añadir una capa exclusiva EAI entre componentes de otro modo incompatibles haceaumentar la fragilidad (brittlenesse en inglés) de la aplicación. Se dice que una aplica-ción es frágil cuando el menor cambio en un solo componente desemboca en un fallocatastrófico del sistema. Este fenómeno es parecido al de las fisuras que se producen enun avión puesto al límite y que finalmente pueden provocar que el avión se estrelle;sólo que en el caso de los sistemas n-tier todo sucede con mucha más rapidez.

Otro problema en la arquitectura n-tier son los componentes estrechamente vinculadosque se comunican por llamadas de procedimiento remoto, en inglés remote procedurecalls (RPC), implementadas en DCOM, CORBA, Java RMI, o J2EE Enterprise Beans. Loscomponentes tradicionales middle-tier utilizan RPC sincrónicos, los cuales requierenuna respuesta inmediata a cada petición; si no se obtiene la respuesta a tiempo de algu-no de los componentes, todo el proceso queda bloqueado. Los RPC asincrónicos y lossistemas de messaging –como Microsoft Message Queue Server (MSMQ) o IBM Qseries–mitigan este problema, aunque no dan necesariamente una solución válida a todos losniveles.

Ninguno de los anteriores métodos con RPC puede comunicarse traspasando los cortafuegos dered actuales, los cuales restringen el tráfico normalmente a los puertos TCP 80 y 443. Esta limi-tación hace que el acceso por Internet a componentes lógicos de negocios específicos resulte difí-cil, por no decir imposible.

3.8.2 Implementar SOA con servicios WebLa arquitectura orientada al servicio resuelve la mayor parte de los problemas de inte-roperabilidad de la arquitectura n-tier descritos en el apartado anterior. A continuación,los requisitos básicos para SOA:

Interfaces con puntos de acceso de base estándar a componentes de lógica de negocios.Encapsulamiento de los componentes de lógica de negocios y sus funciones paraocultar los detalles de implementación a quienes acceden desde fuera.Loose-coupling a través de métodos de acceso sin estado, asincrónicos o semi-sin-crónicos, implementados con mensajes basados en texto (normalmente enUnicode).Formatos de mensaje y descripciones de interfaz basados en estándares.Protocolos estándar para la comunicación con interfaces y funciones, incluyendola capacidad de transmitir mensajes a través de cortafuegos, si los hubiere.

100

Bases de datos con Visual Basic

VisualBasic2005_03.qxp 02/08/2007 16:18 PÆgina 100

Page 32: 2.5.1 Comparando los diseñadores de datos de ADO.NET …galeon.com/melissacalleja1/basesdatos3.pdf ·  · 2012-11-09riores de Windows – excepto DataSet- con los siguientes objetos

Propiedades basadas en estándares del tratamiento de error y la seguridad.Interoperabilidad estándar entre el proveedor de la interfaz y sus usuarios.

Implementar la SOA no implica necesariamente el uso de servicios Web basados enSOAP, pero sólo los servicios Web estándar SOAP, con alcance en toda la industria–Web Services Description Language (WSDL), y WS-Security– combinados con otros están-dares W3C, IETF y OASIS, cumplen actualmente con todos los requisitos mencionadosanterioremente para SOA.

Los documentos e infosets XML 1.0 son la base de los servicios Web. Los documentosWSDL definen las interfaces (puerto y operaciones) de los servicios Web y los puntosde acceso (direcciones) e incluyen un esquema XML para los documentos de mensajesde request y response SOAP. El esquema permite a los programadores de clientes deservicios Web utilizar una copia local de un documento WSDL para incorporar propie-dades IDE de tiempo de diseño, como por ejemplo IntelliSense. El esquema y los men-sajes no incluyen detalles sobre la implementación del servicio.

Los protocolos de transporte más comunes para los servicios Web basados en SOAPson HTTP y HTTPS, pero TCP, email (SMTP, POP3 y otros) y FTP son alternativaspotenciales. Independientemente del tipo de transporte, los servicios Web son sin esta-do y autónomos. El estado lo ha de mantener el cliente del servicio Web o alguno de losestándares derivados para las transacciones que implementan el servicio Web (WS-Coordination, WS-AtomicTransaction) o procesos de negocios (WS-BusinessActivity,Business Process Execution Language for Web Services [BPEL4WS], WS-Choreography).

Los temas relacionados con la seguridad de los servicios Web son el primer impedi-mento para la adopción generalizada de SOA. HTTPS encripta mensajes SOAP entredos puntos de acceso (a menudo llamados puntos final o end points), y HTTPS con cer-tificados de cliente puede autentificar a los usuarios particulares que llaman al servicio.Las implementaciones de seguridad más sofisticadas requieren firmas digitales yencriptación personalizada de mensajes, proporcionada por la especificación WS-Security. Implementar la WS-Security con servicios Web ASP.NET 2.0 implica instalarWeb Services Extensions (WSE) 2.0 SP3, o versiones posteriores, en el servidor del servi-cio Web y las máquinas cliente.

3.8.3 Garantizar total interoperabilidad del servicio WebLa mejor práctica para la arquitectura SOA exige que los servicios operen independien-temente del sistema y de los lenguajes de programación. Como ejemplo, un cliente deservicio Web programado con Java y ejecutado con FreeBSD o Linux debe tener intero-perabilidad con otros servicios Web VB.NET o C# ASP.NET proporcionados por un ser-vidor de Windows 2000 o 2003. VS 2005 ha intentado garantizar que los servicios WebASP.NET que usted crea sigan la normativa básica establecida en Basic Profile (BP) 1.0de la Web Services Interoperability (WS-I) Organization. BP 1.0 alcanzó estatus de "FinalSpecification" en Abril de 2004, más de dos años después de la fundación de WS-I y 53miembros más de la comunidad de servicios Web. BP 1.0 prohibe explícitamente el usode la codificación SOAP, sección 5, la cual excluye los formatos de mensaje rpc/encodedy documento/encoded por temas de interoperabilidad. BP 1.0 soporta ambos formatos:

101

Concretando proyectos reales

VisualBasic2005_03.qxp 02/08/2007 16:18 PÆgina 101

Page 33: 2.5.1 Comparando los diseñadores de datos de ADO.NET …galeon.com/melissacalleja1/basesdatos3.pdf ·  · 2012-11-09riores de Windows – excepto DataSet- con los siguientes objetos

document/literal (doc/lit) y rpc/literal, pero los servicios rpc/literal son muy infrecuentes.El formato estándar para los mensajes SOAP de ASP.NET es doc/lit.

La primera directriz en el apartado 1.3 de los "Guiding Principles" de BP 1.1 dice: "Noexiste garantía de interoperabilidad. Es imposible garantizar completamente la intero-perabilidad de un servicio concreto. De todos modos, el Perfil encara los problemas máscomunes que la práctica de la implementación ha sacado a la luz del día hasta ahora".Si esta cláusula no estuviera ahí, los desarrolladores más inocentes podría suponer quelos servicios Web ASP.NET 2.0 que proporcionan y actualizan objetos DataSet serializa-dos, y dicen ser conformes a los requisitos de BP 1.1, interoperan con clientes escritosen Java, Perl, Python, o cualquier otro lenguaje (inclusive VB6 o VBA) que contiene untoolkit SOAP 1.1 o 1.2 conforme a BP 1.0. Los toolkits de servicios Web hacen mapas demensajes SOAP a objetos haciendo referencia al esquema incluido en el documentoWSDL para los servicios Web doc/lit.

Microsoft desestimó el SOAP Toolkit 3.0 a favor de .NET Framework a principios de 2004 y elsoporte estándar quedó garantizado sólo hasta Abril del 2005 (el soporte extendido se mantienehasta Abril del 2008). El formato de mensaje original en Toolkit es rpc/encoded, que no cumpleel BP 1.0, y escribir servicios document (doc/lit) con el API (muy bajo nivel) de Toolkit es unaagonía, por decirlo suavemente. Otra razón para retirar Toolkit es que Windows Server 2003 nosoporta los componentes del servidor de Toolkit ni ISAPI Listener.

Los servicios Web ASP.NET 2.0 que proporcionan o actualizan DataSets genéricos nointeroperan con las versiones actuales de toolkits, excepto las de Microsoft. Los casu-santes son la referencia a s:schema y el elemento wildcard <s:any/> en los nodos de méto-do en la Web. Esta combinación es un flag que le dice al procesador WSDL de .NET queel esquema esta incrustado en el mensaje SOAP de respuesta. Aquí vemos un fragmen-to de un documento WSDL típico para un juego de datos tipificado o no:

<s:element name= GetAllCustomersResponse >

<s:complexType>

<s:sequence>

<s:element minOccurs= 0 maxOccurs= 1 name= GetAllCustomersResult >

<s:complexType>

<s:sequence>

<s:element ref= s:schema />

<s:any />

</s:sequence>

</s:complexType>

</s:element>

</s:sequence>

</s:complexType>

</s:element>

Los DataSets genéricos son presumiblemente dinámicos, por lo que exponen su esque-ma durante el tiempo de ejecución incrustándolo en el mensaje SOAP en lugar deldocumento WSDL. De todos modos, los DataSets tipificados estáticos producen nodosde esquema WSDL idénticos a los de los DataSets no tipificados. Eso significa que los

102

Bases de datos con Visual Basic

VisualBasic2005_03.qxp 02/08/2007 16:18 PÆgina 102

Page 34: 2.5.1 Comparando los diseñadores de datos de ADO.NET …galeon.com/melissacalleja1/basesdatos3.pdf ·  · 2012-11-09riores de Windows – excepto DataSet- con los siguientes objetos

toolkits que no son de Microsoft tienen que usar un API de bajo nivel para procesar elmensaje SOAP de respuesta como si fuera una XMLNodeList, lo cual implica un proyec-to de programación nada trivial. Escribir código Java para conseguir un diffgram conactualizaciones de juegos de datos en un mensaje SOAP de request sería una tarea her-cúlea que probablemente tendría el éxito de Sísifo.

Incrustar esquemas XML en mensajes SOAP no va contra las especificaciones de SOAP1.1 o 1.2, pero es una práctica muy poco convencional (y muy controvertida). Losesquemas de DataSets incorporan numerosos espacios-nombre (de propiedad) especí-ficos de Microsoft, como xmlns:msdata= "urn:schemas-microsoft-com:xml-msdata" y xml-ns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1". Los mensajes también se decorancon xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1". Los DataSets añaden atri-butos de propiedad a los esquemas y mensajes msdata:IsDataSet="true", msdata:-PrimaryKey="true", diffgr:id="Customers1" , y msdata:rowOrder=" 0" son dos ejemplos.

Los esquemas de DataSets tipificados de ADO.NET 2.0 contienen mucha más informa-ción detallada que las versiones ADO.NET 1.x, casi idénticas a los esquemas no tipifi-cados de DataSets. Como ejemplo, ADO.NET 2.0 añade ueve atributos msprop:Pro-pertyName a cada tag <xs:element...>. Estos elementos añadidos muestran detallesoperacionales del servicio Web a los clientes del servicio, lo cual contraviene el dictadoSOA de que los servicios han de ocultar los detalles de implementación a quienes acce-den a ellos. Los apartados siguientes son un adelanto de los servicios Web que se veránmás adelante en este mismo libro y testan a los clientes para demostrar temas de inte-roperabilidad con los servicios Web que procesan amobs tipos de DataSets.

3.8.4 Instalar y publicar el servicio Web DataSetWSEl proyecto de ejemplo DataSetWS.sln, un servicio Web ASP.NET 2.0, expone cuatro delos métodos Web que operan con el DataSet no tipificado dsNwind DataSet: GetAll-Customers, GetOrdersByCustomerID, UpdateCustomersDataSet, y UpdateOrdersDataSet.Para instalar, testar y publicar el servicio Web en su instancia local de IIS, siga los pasossiguientes:

1. Cargue el archivo DataSetWS.vb y cambie el valor del string de conexión strConnpara adecuarlo a las configuraciones de seguridad del SQLServer.

2. Pulse <F5> para iniciar el servicio DataSetWS, pulse el vínculo GetAllCustomers ypulse Generar para devolver un mensaje de respuesta que contenga un diffgram contodos los datos de los Clientes.

3. Vuelva a la página principal de ayuda del servicio Web, pulse el vínculo GetOr-dersByCustomerID, escriba RATTC en el cuadro de texto Customer ID ParameterValue y pulse Generar para volver al diffgram con los datos de los Orders de“Rattlesnake Canyon Grocery”.

4. Cierre la página DataSetWS.asmx o pulse <Mayús>+<F5> para finalizar la instanciadel servicio Web.

5. Seleccione Generar/Publicar para abrir el cuadro de diálogo Publicar Web, escribahttp://localhost/DataSetWS en el cuadro de texto y pulse Aceptar para crear el direc-

103

Concretando proyectos reales

VisualBasic2005_03.qxp 02/08/2007 16:18 PÆgina 103

Page 35: 2.5.1 Comparando los diseñadores de datos de ADO.NET …galeon.com/melissacalleja1/basesdatos3.pdf ·  · 2012-11-09riores de Windows – excepto DataSet- con los siguientes objetos

torio virtual IIS y añadir los archivos precompilados a la carpeta \Inetpub\-DataSetWS.

6. Para comprobar el desarrollo de IIS, abra Internet Explorer y navegue hastahttp://localhost/datasetws/datasetws.asmx, allí invoque los métodos GetAllCustomers yGetOrdersByCustomerIDWeb.

El incentivo principal para usar el atajo DataSet en la parte del servidor es que así elcódigo necesario para añadir métodos Web es mínimo. Como ejemplo, veamos el códi-go para implementar el método Web GetAllCustomers:

<WebMethod(Description:=strGetCustomers)> _

Public Function GetAllCustomers() As DataSet

Dim dsNwind As New DataSet

Dim daCusts As SqlDataAdapter = Nothing

Try

daCusts = New SqlDataAdapter("SELECT * FROM Customers", strConn)

daCusts.Fill(dsNwind)

dsNwind.DataSetName = "Northwind"

dsNwind.Namespace = "http://oakleaf.ws/webservices/datasetws/northwind"

With dsNwind.Tables(0)

'Assign the table name

.TableName = "Customers"

'Assigning a table namespace breaks the published Web service

'.Namespace = "http://oakleaf.ws/webservices/datasetws/north

wind/customers"

'Specify the primary key

.PrimaryKey = New DataColumn() {.Columns(0)}

'Require a CompanyName value (table constraint)

.Columns(1).AllowDBNull = False

End With

Return dsNwind

Catch excSys As Exception

Dim excSoap As New SoapException(excSys.Message, _

SoapException.ClientFaultCode, Context.Request.Url.AbsoluteUri)

Throw excSoap

Finally

dsNwind.Dispose()

daCusts.Dispose()

End Try

End Function

El código para actualizar un DataSet no tipificado es igual de sencillo. El objeto deADO.NET 2.0 SqlCommandBuilder genera automáticamente las sentencias SQL y, si estáespecificada, la colección Parameters necesaria para una concurrencia optimista en lasactualizaciones y borrados cuando se especifica cbCusts.ConflictOption=Conflict-Option.CompareAllSearchableValues, tal como aparece en negrita en el código siguiente:

104

Bases de datos con Visual Basic

VisualBasic2005_03.qxp 02/08/2007 16:18 PÆgina 104

Page 36: 2.5.1 Comparando los diseñadores de datos de ADO.NET …galeon.com/melissacalleja1/basesdatos3.pdf ·  · 2012-11-09riores de Windows – excepto DataSet- con los siguientes objetos

<WebMethod(Description:=strUpdateOrdersDataSet)> _

Public Function UpdateOrdersDataSet(ByVal dsNwind As DataSet) As Boolean

Dim cnNwind As New SqlConnection(strConn)

Dim daOrders As SqlDataAdapter = Nothing

Dim cbOrders As SqlCommandBuilder = Nothing

Try

'daOrders = New SqlDataAdapter("SELECT * FROM Orders", cnNwind)

'To accommodate timestamp column

daOrders = New SqlDataAdapter(strOrdersSelect, cnNwind)

cbOrders = New SqlCommandBuilder(daOrders)

cbOrders.ConflictOption = ConflictOption.CompareAllSearchableValues

daOrders.Update(dsNwind, "Orders")

Return True

Catch excSys As Exception

Dim excSoap As New SoapException(excSys.Message, _

SoapException.ClientFaultCode, Context.Request.Url.AbsoluteUri)

Throw excSoap

Return False

Finally

cbOrders.Dispose()

daOrders.Dispose()

dsNwind.Dispose()

End Try

End Function

Compare el código anterior con el que se necesitaba para actualizar las tablas Orders yOrders detail en el ejemplo anterior de NWOrdersWS. Creando una instancia Command-Builder en tiempo de ejecución para generar objetos DeleteCommand, InsertCommand, yUpdateCommand, hace bajar la efectividad del código y, por lo tanto, no es la mejor práctica.

3.9 Use FxCop para validar el código del proyectoFxCop es una herramienta de Microsoft para analizar código que comprueba que losensamblajes de código gestionado sean conformes a las directrices .NET FrameworkDesign Guidelines y los estándares de código. Aproximadamente la mitad de los 200tests comprueban la conformidad con las Design Guidelines. FxCop se originó en las ver-siones de línea de comando de Windows, pionero en esta tarea, como miembro de lacolección de herramientas GotDotNet y .NET Framework 2.0 incluye clases FxCop. VS2005 Team System (VSTS) integra el análisis opcional con FxCop para todos los proyec-tos. Para activar FxCop se ha de abrir la ventana Propiedades del <nombre proyecto>, selec-cionar la ficha Compilar y deseleccionar el cuadro de verificación Deshabilitar todas lasadvertencias. Se pueden desactivar las reglas de nueve categorías y expandir los nodosde categoría para leer las descripciones de las reglas y desactivarlas individualmente.

Ejecutar un proyecto relativamente sencillo –DataAccessQuickStart.sln para este ejemplocon CodeAnalysis de VSTS activado– da 1 error y 38 advertencias; FxCop v.1.312 da 49errores y mensajes.

105

Concretando proyectos reales

VisualBasic2005_03.qxp 02/08/2007 16:18 PÆgina 105

Page 37: 2.5.1 Comparando los diseñadores de datos de ADO.NET …galeon.com/melissacalleja1/basesdatos3.pdf ·  · 2012-11-09riores de Windows – excepto DataSet- con los siguientes objetos

Para mostrar las advertencias de Code Analysis en los proyectos de ejemplo, escríbalos de nuevo.Si la ventana Errors no es visible, seleccione en el menú Ver, la opción Lista de errores.

Un sencillo proyecto con DataSet genera 90 errores y advertencias en FxCop 1.312 conOffice 2003 instalado en la máquina que ejecuta VS 2005. FxCop utiliza el dicionarioestándar y los diccionarios personalizados, si los hay. Prácticamente todos los mensa-jes provienen del código autogenerado VB 2005. Es evidente que los desarrolladores deMicrosoft que escribieron el generador de código para los DataSet no se atuvieron a lasreglas FxCop sobre clases autogeneradas. Los actuales juegos de reglas de Code Analysisy FxCop superan con creces la capacidad de la mayoría de proyectos formulario deWindows. Se puede personalizar el juego de reglas aplicado a un proyecto específicoyFxCop o VSTS lo perpetuarán cuando se cierre el proyecto. No obstante, establecer unjuego de reglas personalizado que se pueda aplicar a todos los proyectos representa unesfuerzo considerable. El cuadro de diálogo Opciones no permite especificar un juegode reglas FxCop por defecto para todos los proyectos.

3.10 Automatizar Test-Driven DevelopmentTest-driven development (TDD) es una metodología de programación basada en la veri-ficación del código por pequeños segmentos (unidades) y en la escritura de unidadesde test automatizado (unit tests) antes de escribir el código de la aplicación. Los unittests han de ser conformes a las especificaciones de la aplicación y hay que escribir elcódigo para determinar si las unidades son conformes o no a los requerimientos espe-cificados. Después se añaden instrucciones especiales al código para definir cada uni-dad de test. Mientras se desarrolla la aplicación, las unidades de test definidas pasan aser miembros de un test completo que se ejecutará al construir el proyecto. Una de lasprincipales ventajas del test por unidades es que el proceso detecta los bugs de regre-sión que tantas veces aparecen en proyectos largos realizados por varios equipos dedesarrollo.

VSTS es un conjunto de herramientas add-on para VS 2005 con cinco ediciones dedica-das respectivamente a los arquitectos, adminsitradores de proyecto, desarrolladoresindividuales, desarrolladores de grupo y verificadores (testers). Las ediciones VSTS forDevelopers y VSTS for Testers incluyen la posibilidad de generar y ejecutar unit tests auto-matizadas y totalmente integradas. Instalando VSTS for Developers o Testers se añadenplantillas Test Project y Empty Test Project al cuadro de diálogo Add New Project.

3.11 Ejecutar Best Practices Analyzer para SQL Server 2000La herramienta Best Practices Analyzer (BPA) para el SQL Server 2000 de Microsoft es unaaplicación .NET 1.1 que testa las instancias SQL Server y MSDE 2000 para mejores prác-ticas en seguridad y administración. Esta aplicación está dirigida básicamente a losadministradores de IT y DBAs, aunque los desarrolladores de bases de datos pueden ydeberían ejecutar análisis periódicos en sus servidores de desarrollo y testeo. Una vezconfigurado el BPA, los tests se pueden sincronizar para su ejecución nocturna o enotros periodos de baja actividad para la base de datos

106

Bases de datos con Visual Basic

VisualBasic2005_03.qxp 02/08/2007 16:18 PÆgina 106

Page 38: 2.5.1 Comparando los diseñadores de datos de ADO.NET …galeon.com/melissacalleja1/basesdatos3.pdf ·  · 2012-11-09riores de Windows – excepto DataSet- con los siguientes objetos

El análisis incluye las categorías de Backup y Recovery, Configuration Options, Data-base Administration, Database Design, Deprecation, Full-Text, General Administra-tion, SQL Server 2005 Readiness, y T-SQL. Curiosamente, BPA no incluye ninguna cate-goría de test de seguridad que verifique la existencia y la potencia de de contraseñas sapara instancias que implementan el modo mixto de autentificación. Al instalar BPA secrea una base de datos sqlbpa de reposición en el servidor BPA que se indique. Despuéshay que especificar las instancias de SQL Server, MSDE o SQL Express para testar y con-figurar los grupos Best Practices Groups (BPGs) para cada instancia, y especificar los gru-pos a ejecutar, tal como muestra la siguiente figura.

Pulsando el vínculo Scan SQL Server Instances aparece una lista de los servidores paralos que se han especificado grupos BPGs y seleccionado para la ejecución. Pulsando elvínculo Next se inicia el escaneo del servidor, cuya duración depende de la carga y ren-dimiento del servidor o la red, y del número de objetos en el servidor. Una vez comple-tado el análisis, los resultados se pueden filtrar con non-compliance para destacar laspartes que necesiten corrección, tal como muestra la figura de la páginasiguiente.

3.12 Applicar Best Practices específicas a los proyectos de ADO.NET 2.0Si se ha tomado el tiempo de leer las publicaciones P&P de Microsoft que pertencen aADO.NET, probablemente estará familiarizado con casi todas –si no todas– las mejoresprácticas recomendadas para ADO.NET 2.0 que veremos a continuación.

3.12.1 Use cadenas de conexión idénticas para las conexiones de bases de datos Pool

Todos los proveedores de datos ADO.NET, Microsoft y otros, soportan el pooling deconexión a la base de datos. El primer cliente en conectarse a la base de datos añadeautomáticamente una conexión al pool, si el pool no se ha creado todavía. Todos los

107

Concretando proyectos reales

VisualBasic2005_03.qxp 02/08/2007 16:18 PÆgina 107

Page 39: 2.5.1 Comparando los diseñadores de datos de ADO.NET …galeon.com/melissacalleja1/basesdatos3.pdf ·  · 2012-11-09riores de Windows – excepto DataSet- con los siguientes objetos

demás clientes con valores idénticos en ConnectionString comparten conexiones en pool.Un cambio mínimo en el valor de un ConnectionString para un servidor y una base dedatos específicos, como cambiar IntegratedSecurity=SSPI por IntegratedSecurity=True oañadir/eliminar un espacio, genera un nuevo pool de conexión.

Crear una conexión nueva en el Explorador de Servidores genera una cadena de conexiónestándar para la autentificación de Windows o SQL Server. De todos modos, no se tieneacceso directo al texto de la cadena de conexión en este punto. Asegurar una armoníaperfecta entre las cadenas de conexión que se añaden al código y los generados porExplorador de Servidores implica el mantenimiento de copias de referencia. Guarde laversión del Explorador de Servidores en un archivo ConnectionStrings.txt la primera vezque lo use en un proyecto. Puede copiar la cadena de conexión en el archivo de textodel cuadro de texto expandiendo el botón Cadena de conexión en el primer paso delAsistente para la configuración de orígenes de datos, Elija la conexión de datos.

3.12.2 Definir el tamaño del pool de conexión

El tamaño mínimo por defecto del pool es 0 y el tamaño máximo por defecto es 100. Sepuede maximizar el rendimiento de clientes ampliamente visitados incrementando eltamaño mínimo por defecto del pool hasta 10 o más, e incrementando el tamaño máxi-mo hasta el número esperado de clientes conectados simultáneamente. Por ejemplo, lasiguiente cadena de conexión establece un tamaño mínimo de pool de 10 y un máximode 200:

Dim strConn As String = Server=OAKLEAF-MS16;Database=Northwind; + _

Integrated Security=True;Min Pool Size=10;Max Pool Size=200

108

Bases de datos con Visual Basic

VisualBasic2005_03.qxp 02/08/2007 16:18 PÆgina 108

Page 40: 2.5.1 Comparando los diseñadores de datos de ADO.NET …galeon.com/melissacalleja1/basesdatos3.pdf ·  · 2012-11-09riores de Windows – excepto DataSet- con los siguientes objetos

Crear el pool de diez conexiones supone una disminución del rendimiento para el pri-mer cliente que abre una conexión, pero mejora el rendimiento en los otros nueve clien-tes que se conectan simultáneamente. Definir un valor MinPoolSize para los serviciosWeb es una práctica común, ya que la primera llamada a un servicio Web ASP.NET nooculto implica un retraso de instanciación mucho más largo que el tiempo requeridopara crear las diez conexiones.

3.12.3 Guardar cadenas de conexión en archivos de configuración

Es una práctica común incluir un ConnectionString o un atributo key de nombre similara los archivos App.config o Web.config. Cuando se selecciona el cuadro de verificación Sí,guardar la conexión como… en el cuadro de diálogo Guardar cadena de conexión… del Asis-tente para la configuración de orígenes de datos, el diseñador de juegos de datos guarda lacadena de conexión en el archivo App.config, como se indica aquí en negrita:

<configuration>

<connectionStrings>

<add name= ProjectName.MySettings.ConnectionName value= ClientConnectionString /></connectionStrings>

</configuration>

El diseñador de DataSet añade la entrada a la lista de de la página de propiedadesMyProject.MySettings, y código en el procedimiento InitConnection del archivo DataSet-Name.Designer.vb para restablecer el valor ClientConnectionString de App.config. De esemodo ya no será necesario alterar el código fuente ni reescribir los proyectos cuandocambien los nombres del servidor o de la base de datos.

3.12.4 Encriptar cadenas de conexión que contienen nombres de usuario y contraseñas

Parece bastante razonable someter a la cadena string de conexión a su autentificaciónpor parte de Windows; el archivo Web.config para páginas ASP.NET o servicios Web noes accesible a los usuarios de Internet o intranets. Para ellos, el archivo.config sólo reve-la los nombres del servidor y la base de datos. Cualquier cadena de conexión que con-tenga un userID o valores debería estar encriptado, independientemente de que seencuentre en el código fuente del proyecto o en los archivos Web.config o App.config.ASP.NET 2.0 proporciona dos nuevos proveedores de código de encriptación –DataPro-tectionConfigurationProvider y RSAProtectedConfigurationProvider– pensados específica-mente para simplificar la protección de secciones específicas de los archivos Web.config.De todos modos, una vez protegida la sección <connectionStrings> con encriptamiento,habrá que desencriptar y reencriptar cualquier cambio que se realice en la cadena deconexión de la aplicación.

3.12.5 Ejecutar el SQL Server Profiler para inspeccionar las consultas SQL y RPC

El SQL Server Profiler es su amigo. Puede utilizar Profiler para inspeccionar las senten-cias batch SQL enviadas para su ejecución directa o las llamadas execsp_executesqlRPCcon sentencias SQL parametrizadas. Profiler también le puede mostrar el tiempo que elservidor SQL necesita para ejecutar las consultas y los procedimientos almacenados.

109

Concretando proyectos reales

VisualBasic2005_03.qxp 02/08/2007 16:18 PÆgina 109

Page 41: 2.5.1 Comparando los diseñadores de datos de ADO.NET …galeon.com/melissacalleja1/basesdatos3.pdf ·  · 2012-11-09riores de Windows – excepto DataSet- con los siguientes objetos

Profiler genera trazas basadas en un juego de plantillas estándar diseñadas para tareasespecíficas. Se puede modificar la plantilla estándar o bien diseñar plantillas persona-lizadas para crear trazas con la información más importante para analizar el rendimien-to del sistema o realizar otro tipo de análisis.

En la siguiente figura vemos al Profiler mostrando en la plantilla de trazas T-SQL_Du-ration eventos capturados por DataSetWSClient al ejecutar los métodos Web DataSetWS.Las trazas de Profiler son igualmente útiles para comparar el rendimiento de las actua-lizaciones con batches con el de las actualizaciones convencionales que requieren acce-der al servidor en cada cambio introducido en un juego de datos, pero ese es el temade otro apartado, más adelante en este capítulo.

3.12.6 Evitar añadir instancias CommandBuilder en tiempo de ejecución

Microsoft recomienda no instanciar objetos CommandBuilder en tiempo de ejecución, ymuchos gurus y formadores de ADO.NET están de acuerdo con ello. Tal y como semencionó anteriormente en este capítulo, los objetos CommandBuilder generan instan-cias DeleteCommand, InsertCommand, y UpdateCommand desde la sentencia SQL de Se-lectCommand. Regenerar esos comandos en tiempo de ejecución provoca una caída delrendimiento. Las mejores prácticas requiren escribir código para definir una colecciónSqlParameter estática en tiempo de diseño para las habituales operaciones CRUD. Otraalternativa es cachear los parámetros con la técnica usada por DAAB.

El objeto actualizado SqlCommandBuilder de VS 2005 permite paliar en parte la dismi-nución de rendimiento en tiempo de ejecución especificando el miembro CompareRow-Version u OverwriteChanges de la enumeración ConflictOption. Más adelante se describecómo conseguir esta mejora en el rendimiento.

3.12.7 Sustituir las consultas SQL Batch por procedimientos almacenados

Esta mejor práctica sólo dice lo evidente, pero verá que la mayoría de ejemplos de códi-go DataReader y DataSet, incluyendo algunos de este libro, ejecutan sentencias SQL en

110

Bases de datos con Visual Basic

VisualBasic2005_03.qxp 02/08/2007 16:18 PÆgina 110

Page 42: 2.5.1 Comparando los diseñadores de datos de ADO.NET …galeon.com/melissacalleja1/basesdatos3.pdf ·  · 2012-11-09riores de Windows – excepto DataSet- con los siguientes objetos

operaciones CRUD en lugar de procedimientos almacenados. Arrastrando tablas delSQL Server desde la ventana Orígenes de datos a un formulario de Windows genera sen-tencias SQL para las cuatro operaciones. Sustituir procedimientos almacenados ya exis-tentes o nuevos por sentencias SQL requiere reconfigurar los DataSet en el diseñador.

Las sentencias SQL ejecutadas por aplicaciones que conectan a back ends de bases dedatos que soportan procedimientos almacenados o sus equivalentes se pueden justifi-car en aplicaciones prototipo y en ejemplos de código sencillos o situaciones en las queno sería práctico trabajar con un gran número de procedimientos almacenados. Por lodemás, las mejores prácticas dictan que todos los front ends de las bases de datosdevuelvan vistas o ejecuten procedimientos almacenados y no accedan directamente alas tablas base.

Las diferencias de rendimiento entre los procedimientos alm. parametrizados y las sen-tencias batch SQL ejecutadas con llamadas RPC exec sp_executesql realmente tan fuertes.Los tests de rendimiento a gran alcance con SQL Server 2000 indican que las consultasSQL batch parametrizadas, transactuadas, actualizan juegos típicos de datos relaciona-dos (Northwind Orders y Order Details) en torno a un 13 por ciento más rápido que eje-cutando procedimientos múltiples almacenados dentro de una transacción específica.No obstante, las operaciones SELECT e INSERT son más rápidas con procedimientosalmacenados.

3.12.8 Definir valores por defecto en los parámetros que no son necesarios

Si gestiona sus propias colecciones SqlParameter, puede minimizar el tamaño de las sen-tencias exec para los procedimientos almacenados definiendo valores por defecto en losparámetros de campos que no requieren ningún valor en casos específicos. Por ejem-plo, en la BE de Orders, los campos RequiredDate, ShippedDate, Freight, Region yPostalCode pueden tener valor nulo. Si asigna NULL como valor por defecto a los pará-metros de estos campos, puede omitir los miembros correspondientes de la colecciónde parámetros mencionados cuando actualice o inserte nuevos datos. Esta práctica con-lleva la ventaja añadida de no insertar Enero 1, 0001 como valor nulo de System.Xml(0001-01-01T00:00:00.0000000-07:00 como Pacific Standard Time) de las fechas serializa-das en los documentos XML.

3.12.9 Utilizar sp_executesql y parámetros con nombre para reutilizar los Cached Query Plans

Si tiene que usar sentencias SQL parametrizadas para actualizar tablas base, aprovechelas ventajas de sp_executesql para impedir que se regenere un nuevo plan query cada vezque se ejecuta una sentencia SQL. Este consejo es válido si ejecuta su propio códigocliente de actualización en lugar de usar las instancias autogeneradas DeleteCommand,InsertCommand, y UpdateCommand del Data Adapter.

Tests parecidos a los del apartado substituir consultas batch SQL por procedimientosalmacenados muestran que utilizando sp_executesql con un parámetro con nombre y unvalor aleatorio para devolver un objeto Order aumenta el rendimiento en un 37 porciento frente a ejecutar la misma sentencia con el valor OrderID como parámetro sin

111

Concretando proyectos reales

VisualBasic2005_03.qxp 02/08/2007 16:18 PÆgina 111