TALLER DE PROGRAMACIÓN WEB Ing. David Gil Unidad Didáctica: Taller de Programación Web | 2 Datos Desconectados En las sesiones de aprendizaje anteriores, tuvimos una aproximación a la gestión de datos con ASP.NET nutilizado las características basadas en la conexión. En el enfoque de datos desconectados, los datos dejan de tener algo que ver con el origen de datos al momento en que se recuperan. Depende del código de seguimiento a las acciones del usuario, almacenar la información, y determinar cuándo un nuevo comando debe ser generado y ejecutado. ADO.NET hace hincapié en una filosofía totalmente diferente con el objeto DataSet. Cuando se conecta a una base de datos, se llena el conjunto de datos con una copia de la información extraída de la base de datos. Si cambia la información en el conjunto de datos, la información en la tabla correspondiente en la base de datos no cambia. Eso significa que usted puede fácilmente procesar y manipular los datos sin preocuparse, porque no está utilizando una conexión de base de datos. Si es necesario, puede volver a conectar a la fuente de datos original y aplicar todos los cambios realizados en el DataSet en una sola operación de lote. Por supuesto, esta ventaja no está exenta de inconvenientes, tales como problemas de concurrencia. Dependiendo de la forma en que su aplicación se ha diseñado, un lote completo de cambios podrán ser presentadas a la vez. Un simple error (como el intento de actualizar un registro que otro usuario ha actualizado en el ínterin) puede hacer descarrilar todo el proceso de actualización. Con una estudiosa codificación puede proteger su aplicación de estos problemas, pero requiere un esfuerzo adicional. Por otro lado, a veces puede que desee utilizar el modelo de acceso desconectado de ADO.NET y el DataSet. Algunos de los escenarios en los que un DataSet es más fácil de utilizar que un DataReader son los siguientes: Cuando usted necesita un paquete conveniente para enviar los datos a otro componente (por ejemplo, si va a compartir información con otros componentes o distribuirlos a clientes a través de un servicio web). Cuando usted necesita un cómodo formato de archivo para serializar los datos en el disco (el DataSet incluye una funcionalidad integrada que le permite guardar en un archivo XML). Cuando se quiere navegar hacia atrás y hacia adelante a través de una gran cantidad de datos. Por ejemplo, podría utilizar un DataSet para soportar una lista de control de paginado que muestra un subconjunto de la información a la vez. El DataReader, por otra parte, puede moverse en una sola dirección: hacia delante. Cuando desee navegar entre varias tablas diferentes. El DataSet puede almacenar todas estas tablas, y la información sobre las relaciones entre ellas, lo que permite crear facilmente páginas maestrodetalle sin necesidad de consultar la base de datos más de una vez. Cuando se desea utilizar el enlace de datos con los controles de interfaz de usuario. Usted puede utilizar un DataReader para enlace de datos, pero porque el DataReader es un cursor de sólo avance, no se puede enlazar sus datos a múltiples controles. Tampoco tendrán la capacidad de aplicar criterios personalizados de clasificación y filtrado, como si se puede hacer con el DataSet. Cuando se quiere manipular los datos como XML. Cuando se desea proporcionar actualizaciones por lotes. Por ejemplo, podría crear un servicio web que permite a un cliente para descargar un DataTable completo de filas, realizar varios cambios y, a continuación, volver a enviarlo más tarde. En ese momento, el servicio web puede aplicar todos los cambios en una sola operación (suponiendo que no se producen conflictos) Módulo 3: Gestión de Aplicaciones para Internet y Producción Multimedia Ing. David Gil Unidad Didáctica: Taller de Programación Web | 3 El DataSet (Conjunto de Datos) El DataSet es el corazón de acceso a datos desconectados. El DataSet contiene dos ingredientes importantes: una colección de cero o más tablas (expuesta a través de la propiedad Tables) y una colección de cero o más relaciones que se pueden utilizar para vincular tablas juntos (expuesta a través de la propiedad Relations). La figura siguiente muestra la estructura básica del DataSet. Como se puede ver en la figura, cada elemento de la colección Tables del DataSet, es un DataTable. El DataTable contiene sus propias colecciones, la colección Columns de objetos DataColumn (que describen el nombre y tipo de datos de cada campo) y la colección Rows de objetos DataRow (que contienen los datos reales de cada registro). Cada registro en un DataTable está representado por un objeto DataRow. Cada objeto DataRow representa un único registro en una tabla que se ha recuperado de la fuente de datos. El DataRow es el contenedor de los valores actuales del campo. Usted puede acceder a ellos por el nombre de campo. Siempre recuerde que los datos de la fuente de datos no se tocan en absoluto cuando se trabaja con los objetos DataSet. En cambio, todos los cambios se realizan localmente en el DataSet en la memoria. El DataSet no mantiene ningún tipo de conexión a una fuente de datos. El conjunto de datos también tiene métodos que pueden escribir y leer datos XML y esquemas y tiene métodos que puede utilizar para limpiar y duplicar datos rápidamente. En la tabla que se presenta a continuación se describen estos métodos. Módulo 3: Gestión de Aplicaciones para Internet y Producción Multimedia Ing. David Gil Unidad Didáctica: Taller de Programación Web | 4 DataSet XML y Diversos Métodos Método Descripción GetXml() y Devuelve una cadena con los datos (en XML markup) o esquema de información para el DataSet. La información de esquema es la información estructural, como el número de tablas, sus nombres, sus columnas, sus tipos de datos, y sus relaciones. GetXmlSchema() WriteXml() y WriteXmlSchema() ReadXml() y ReadXmlSchema() Persiste los datos y el esquema representado por el conjunto de datos a un archivo o una secuencia en formato XML. Crea las tablas en un DataSet basado en un documento XML existente o documento de esquema XML. Las fuentes en XML puede ser un archivo o cualquier otra fuente. Clear() Vacía todos los datos de las tablas. Sin embargo, este método hace que el esquema y relaciones de información queden intactas. Copy() Devuelve un duplicado exacto del conjunto de datos, con el mismo conjunto de tablas, relaciones, y los datos. Clone() Devuelve un conjunto de datos con la misma estructura (tablas y relaciones), pero no datos. Merge() Toma otro DataSet, un DataTable o una colección de objetos DataRow como entrada y los combina en el DataSet actual, añadiendo las nuevas tablas y la fusión de las tablas existentes. La clase DataAdapter Para extraer los registros de una base de datos y utilizarlos para llenarr una tabla en un DataSet, se necesita usar otro objeto ADO.NET: un DataAdapter. El DataAdapter viene en un objeto proveedor específico, por lo que es una clase DataAdapter separada para cada proveedor (como SqlDataAdapter, OracleDataAdapter, y así sucesivamente). El DataAdapter sirve como un puente entre un único DataTable en el DataSet y el origen de datos. Contiene todos los comandos disponibles para consultar y actualizar la fuente de datos. Para habilitar el DataAdapter para editar, borrar y añadir filas, es necesario especificar los objetos de comando para las propiedades UpdateCommand, DeleteCommand e InsertCommand del DataAdapter. Para utilizar el DataAdapter para llenar un DataSet, debe establecer el SelectCommand. El DataAdapter proporciona tres métodos fundamentales, como se indican en la tabla siguiente: Módulo 3: Gestión de Aplicaciones para Internet y Producción Multimedia Ing. David Gil Unidad Didáctica: Taller de Programación Web | 5 Métodos DataAdapter Método Descripción Fill() Agrega un DataTable a un DataSet mediante la ejecución de la consulta en el SelectCommand. Si la consulta devuelve varios conjuntos de resultados, este método va a añadir varios objetos DataTable a la vez. También puede utilizar este método para agregar datos a un DataTable existente. FillSchema() Agrega un DataTable a un conjunto de datos mediante la ejecución de la consulta en el SelectCommand y recupera información de esquema solamente. Este método no agrega ningún dato al DataTable. En su lugar, simplemente preconfigura el DataTable con detallada información acerca de los nombres de columna, tipos de datos, claves primarias y las restricciones únicas. Update() Examina todos los cambios en un único DataTable y se aplica este lote de cambios en el origen de datos mediante la ejecución de la apropiada operación InsertCommand, UpdateCommand y DeleteCommand operaciones Módulo 3: Gestión de Aplicaciones para Internet y Producción Multimedia Ing. David Gil Unidad Didáctica: Taller de Programación Web | 6 Rich Data Controls (Controles de datos enriquecidos) La Evolución de los Controles de Datos Enriquecidos de ASP.NET Los controles de datos enriquecidos vienen cambiando más que cualquier otro cunjunto de controles en ASP.NET. Con el fin de proporcionar a los desarrolladores mejores controles para sus aplicaciones orientadas a datos con un minimo codigo, los controles de datos que fueron originalmente incluidos con ASP.NET 1.x (el DataGrid, DataList, y Repeater) fueron remplazados con herramientas más poderosas en ASP.NET 2.0 (el GridView, DetailsView, y FormView) y ASP.NET 3.5 (el ListView). Los ASP.NET 1.x originales aun existen, pero la mayoria de promadores ASP.NET no los usa excepto para mantener la compatibilidad. A continuación tenemos una vista rápida de todos los controles de datos de ASP.NET : • DataGrid: DataGrid fue introducido en ASP.NET 1.0 pero fue completamente remplazado por GridView en ASP.NET 2.0. GridView propociona el mismo conjunto de características (y más) y simplifica el modo de codificar. Por defecto, DataGrid no aparece en el Toolbox de Visual Studio. • DataList: DataList fue introducido en ASP.NET 1.0 y también fue remplazado por GridView, el proporciona un conjunto de plantillas similares y modelo de codigo mucho más simple. El control DataList tiene una característica que no es proporcionada por el control GridView: la habilidad para crear una tabla multicolumna donde cada celda es un registro separado. El control GridView no soporta este inusual diseño, ya que forza a cada registro a ocupar una fila separada. De cualquier manera, se puede obtener este resultado con el nuevo control ListView. • Repeater: El control Repeater fue introducido en ASP.NET 1.0. El control Repeater fue remplazado por el control ListView, el cual ofrece la misma flexibilidad pero además incluye características como selección, ordenamiento y edicción. • GridView: El control GridView es el control todo en uno en ASP.NET. Este control muestra registros en la fila de una tabla, esto usando multiples columnas, plantillas, o alguna combinación de las dos. El control GridView fue introducido en ASP.NET 2.0 y se mantiene sin cambios en ASP.NET 3.5. • ListView: Es un control flexible basado en plantilla que no ofrece todas las características de el control GridView pero proporciona flexibilidad para renderiar los datos con una etiqueta <table>. El control ListView es nuevo en ASP.NET 3.5. • DetailsView: El control DetailsView es el más poderoso control ASP.NET para mostrar los datos desde un solo registro a la vez. Este control usa un diseño tabular y soporta plantillas. Fue introducido en ASP.NET 2.0 y se mantine sin cambios en ASP.NET 3.5. • FormView: El control FormView, al igual que el DetailsView, esta diseñado para mostrar datos desde un solo registro. También requiere plantillas. La unica ventaja real es que proporciona la habilidad para mostrar datos de forma no tabular. Este control fue introducido en ASP.NET 2.0 y se mantiene sin cambios en ASP.NET 3.5. Módulo 3: Gestión de Aplicaciones para Internet y Producción Multimedia Ing. David Gil Unidad Didáctica: Taller de Programación Web | 7 El control GridView Es un control de cuadrícula estremadamente flexible para mostrar datos en una cuadrícula básica consistente de filas y columnas. Este control incluye un amplio rango de características, incluyendo selección, paginación, ordenamiento y edición. Además estas características son extensibles a través de plantillas. La gran ventaja de los controles GridView sobre los DataGrid es que soportan diferentes escenarios de codigo. Usando GridView, puedes realizar muchas tareas comunes, como paginación y selección, sin escribir codigo. Definir columnas Los ejemplos de GridView vistos hasta ahora, la propiedad GridView.AutoGenerateColumns ha sido establecida a true. Cuando se establece esta propiedad, el GridView utiliza la reflexión para examinar el objeto de datos y encuentra todos los campos (de un registro) o propiedades (de un objeto personalizado). A continuación, crea una columna para cada uno, en el orden en que se encuentran. Esta generación automática de la columna es ideal para la creación rápida de páginas de prueba, pero esto limita la flexibilidad que como programdor desea. Por ejemplo, ¿qué pasa si desea ocultar las columnas, cambiar su orden, o configurar algún aspecto de su pantalla, como el formato de texto de cabecera? En todos estos casos, usted tendrá que configurar AutoGenerateColumns en falso y definir las columnas por ti mismo en la sección de la etiqueta <Columns> del control GridView. Cada columna puede ser de cualquiera de varios tipos diferentes, como se describe en la Tabla a continuación. El orden de las etiquetas de columna determina el orden de derecha a izquierda de las columnas en el GridView. Tipos de Columna Columna Descripción BoundField Esta columna muestra texto de un campo en la fuente de datos. ButtonField Esta columna muestra un botón para cada item en la lista. CheckBoxField Esta columna muestra una casilla de verificación para cada elemento de la lista. Se usa automáticamente para campos verdadero/falso. CommandField Esta columna propociona botones de selección o edición. HyperLinkField Esta columna muestra su contenido (un campo de la fuente de datos o de texto estático) como un hipervínculo. ImageField Esta columna muestra los datos de imagen de un campo binario (siempre que pueda interpretarse con éxito el formato de imagen compatible). TemplateField Esta columna le permite especificar varios campos, controles personalizados, y HTML arbitrario usando una plantilla personalizada. Le da el más alto grado de control, pero requiere más trabajo. Al declarar explícitamente un bound field, tiene la oportunidad de establecer otras propiedades. La tabla que se muestra a continuación, lista de estas propiedades. Módulo 3: Gestión de Aplicaciones para Internet y Producción Multimedia Ing. David Gil Unidad Didáctica: Taller de Programación Web | 8 Propiedades de BoundField Propiedad Descripción DataField Esta propiedad indica el nombre del campo (de una fila) o propiedad (de un objeto) del elemento de datos que desea mostrar en esta columna. DataFormatString Esta propiedad formate los campos. Es útil para conseguir la representación correcta de números y fechas. ApplyFormatInEditMode Si es verdero, la cadena de formato se utlizará para dar formato al valor aún cuando aparezca en un cuadro de texto en modo de edición. El valor predeterminado es falso, lo que significa que sólo el formato subyacente normal se utilizará. HeaderText, FooterText, y HeaderImageUrl Las dos primera propiedades establecen el texto en la región de encabezado y pie de página de la cuadrícula, si esta cuadrícula tiene una cabecera (GridView.ShowHeader es verdadero) y pie de página (GridView.ShowFooter es verdadero). La cabecera es más comúnmente utilizada para un título descriptivo, como el campo nombre, mientras que el pie de página puede contener un valor calculado dinámicamente, como un resumen. Para mostrar una imagen en el encabezado en lugar de texto, establezca la Propiedad HeaderImageUrl. ReadOnly Si es verdadero, el valor para esta columna no puede ser cambiado en modo de edición. InsertVisible Si es falso, el valor de estta columna no puede establecers en modo de inserción. Si quiere un valor de columna para establecer mediante programación o sobre la base de un valor por defecto definido en la base de datos, puede utilizar esta característica. Visible Si es falsa, la columna no será visible en la página. Esta propiedad le da una manera conveniente de programación para ocultar o mostrar columnas específicas, al cambiar la visión de conjunto de los datos. SortExpression Esta propiedad especifica una expresión que puede ser añadida a una consulta para realizar una ordenación basada en esta columna. HtmlEncode Si es verdadero (por defecto), todo el texto se codifica en HTML. NullDisplayText Esta propiedad define el texto que se mostrará pora un valor nulo. El valor predeterminado es una cadena vacía, aunque podría cambiar a un valor no modificable. Módulo 3: Gestión de Aplicaciones para Internet y Producción Multimedia Ing. David Gil Unidad Didáctica: Taller de Programación Web | 9 ConvertEmptyStringToNull Si es verdadeo, antes de que una edición se complete, todas las cadenas vacias se convertirán a valores nulos. ControlStyle, HeaderStyle, FooterStyle, y ItemStyle Estas propiedades configuran la apariencia sólo de esta columna, anulando los estilos de la fila. El control ListView El control ListView es el único nuevo control de datos en ASP.NET 3.5. Está diseñado para reemplazar al control Repeater. Esencialmente, el ListView es un control enlazado a datos muy flexible que despliega su contenido sobre la base de las plantillas que usted define. A diferencia del Repeater, el ListView añade características de nivel superior tales como la selección y edición, que trabajan de la misma forma que los del GridView. Pero a diferencia del GridView, el control ListView no admite un modelo basado en campos para la creación rápida y fácil de cuadriculas con un mínimo de lenguaje de marcado. ListView incluye un conjunto amplio de plantillas que se muestran a continuación: Plantillas ListView Modo Descripción ItemTemplate Establece el contenido de cada elemento de datos (si usted no está utilizando el AlternatingItemTemplate) o celdaS impares de datos (si lo está). AlternatingItemTemplate Utilizada en conjunto con la propiedad ItemTemplate para dar formato a filas pares e impares de manera diferente. ItemSeparatorTemplate Establece el contenido del separador que es trazada entre los items. SelectedItemTemplate Establece el contenido del elemento que está seleccionado actualmente. EditItemTemplate Establece los controles utilizados para un elemento en modo de edición. InsertItemTemplate Establece los controles utilizados para insertar un nueve elemento. LayoutTemplate Establece el lenguaje de marcado que envuelve a la lista de elementos. GroupTemplate Establece el lenguaje de marcado que envuelve a cada grupo de artículos, si estás utilizando la función de agrupación. GroupSeparatorTemplate Establece el contenido del separador que es trazado entre los grupos de elementos. Módulo 3: Gestión de Aplicaciones para Internet y Producción Multimedia Ing. David Gil Unidad Didáctica: Taller de Programación Web | 10 EmptyItemTemplate Establece el contenido que se utiliza para rellenar los valores vacíos en el último grupo, si está utilizando la agrupación. EmptyDataTemplate Establece el lenguaje de marcado usado si el objeto de enlace de datos esta vacio. El control DetailsView El DetailsView está diseñado para mostrar un único registro a la vez. Se coloca cada pieza de información (ya sea un campo o una propiedad) en una fila distinta de una tabla. El control DetailsView también puede enlazarce a una colección de elementos. En este caso, muestra el primer elemento en el grupo. También le permite pasar de un registro a otro usando los controles de paginación, si usted ha establecido la propiedad AllowPaging en verdadero. Puede configurar los controles de paginación utilizando las propiedades PagingStyle y PagingSettings de la misma forma que ajustar el localizador para el GridView. La única diferencia es que no hay soporte paginación personalizada, lo que significa que todos los datos del objeto de origen de datos siempre se recuperan. El control FormView Si necesita la máxima flexibilidad de las plantillas, FormView proporciona un modelo de control único para la visualización y edición de un único registro. El modelo de plantilla de FormView es que coincide mucho con el modelo de la TemplateField en GridView. Por lo tanto, usted tiene las siguientes plantillas para trabajar: • ItemTemplate • EditItemTemplate • InsertItemTemplate • FooterTemplate • HeaderTemplate • EmptyDataTemplate • PagerTemplate Esto significa que puede tomar el modelo exacto del contenido que se pone en un TemplateField en un GridView y colocarlo dentro del FormView. Módulo 3: Gestión de Aplicaciones para Internet y Producción Multimedia Ing. David Gil