[WebForms] Todavía no usas el ObjectDataSource?

Este es el intento N, de enviar un post de introducción al ObjectDataSource. Muchos post extensos se han quedado en el draft, veremos si este ve la luz.

ASP.NET disponible de varios controles para mostrar datos: GridView, ListView, DataList, Repeater, el mismo FormView. En cuanto controles para el artículo vamos a usar el GridView y el FormView. Veamos algunos ejemplos y al final intentamos definir al ObjectDataSource.

 

Mostrando datos

La forma tradicional, es el clásico:

   1: //enlazar gridView

   2: grdCategories.DataSource = blCatManager.GetAll();

   3: grdCategories.DataBind(); 

Con el ObjectDataSource no hago nada y todo es declarativo:

   1: <asp:GridView ID="grdCategories" runat="server" 

   2:        AutoGenerateColumns="False" 

   3:     DataKeyNames="CategoryID" DataSourceID="odsCategorias">

   4:     <Columns> <!-- Aqui Columnas --> </Columns>

   5:   </asp:GridView>

   6: <asp:ObjectDataSource ID="odsCategorias" runat="server" 

   7:     OldValuesParameterFormatString="original_{0}" SelectMethod="getAll" 

   8:     TypeName="CategoryManager">

   9: </asp:ObjectDataSource>

Este código no hay que aprenderlo de memoria, lo puede generar el asistente. Para grandes cantidades de información debemos usar paginación personalizada, el control GridView + ObjectDataSource, soportan esto de manera transparente, sólo hay que agregar un método count y mapearlo. Revisar más detalles en el siguiente artículo: Paginando Eficientemente en ASP.NET.

 

Ingreso de datos

Creo que este es el fuerte de los ObjectDataSource y una de las cosas por la cual lo uso en todos los proyectos de ASP.NET en que participo. Cuando he tenido la oportunidad de integrar nuevos equipos de desarrollo o visitar a algunos, muchos todavía siguen con el clásico recuperar/asignar el contenido de las cajas de texto de uno a uno, muchas veces por el desconocimiento de la existencia del control ObjectDataSource. Después de unas demos con el ObjectDataSource, también terminan adoptándolo, salvo algunos casos en que resisten al cambio, y trabajar con mas orden o porque tienen el famoso código: “mírame y no me toques”. si ese código donde si cambias un C= A + B, a C = B + A, la aplicación completa deja de funcionar.

Si quiere cargar el detalle de un registro en un formulario que tengo que hacer:

   1: //asignar información de objetos a las cajas de texto

   2: CategoryNameTextBox.Text = objItem.CategoryName; 

Y por el contrario si quiero recuperar el objeto para guardarlo en la base de datos, lo primero que debo hacer es recuperarlo de la caja de texto:

   1: //recuperar la información de las cajas de texto, para guardarlas en un objeto

   2: objItem.CategoryName = CategoryNameTextBox.Text; 

Un control FormView + ObjectDataSource, hace esto por ti, y todo de manera declarativa:

   1: <asp:FormView ID="frvDetCategoria" runat="server" 

   2:      DataKeyNames="CategoryID" 

   3:      DataSourceID="odsCatDetails">

   4:      <EditItemTemplate>

   5:        CategoryID:

   6:        <asp:Label ID="CategoryIDLabel1" runat="server" 

   7:          Text='<%# Eval("CategoryID") %>' />

   8:        <br />

   9:        CategoryName:

  10:        <asp:TextBox ID="CategoryNameTextBox" runat="server" 

  11:          Text='<%# Bind("CategoryName") %>' />

  12:        <br />

  13:        CategoryDescription:

  14:        <asp:TextBox ID="CategoryDescriptionTextBox" runat="server" 

  15:          Text='<%# Bind("CategoryDescription") %>' />

  16:        <br />

  17:        <asp:LinkButton ID="UpdateButton" runat="server" 

  18:           CausesValidation="True" 

  19:          CommandName="Update" Text="Actualizar" />

  20:        &nbsp;<asp:LinkButton ID="UpdateCancelButton" runat="server" 

  21:          CausesValidation="False" 

  22:           CommandName="Cancel" Text="Cancelar" />

  23:      </EditItemTemplate>

  24:      <InsertItemTemplate><!-- El formulario insert puede 

  25:             ser distinto por ya no se 

  26:              actualiza los campos claves --></InsertItemTemplate>

  27:      <ItemTemplate><!-- Informacion solo lectura --></ItemTemplate>

  28:    </asp:FormView>

  29:    <asp:ObjectDataSource ID="odsCatDetails" runat="server" 

  30:      DataObjectTypeName="Category" DeleteMethod="Delete" 

  31:      InsertMethod="Insert" 

  32:      OldValuesParameterFormatString="original_{0}" 

  33:      SelectMethod="getOneByID" 

  34:      TypeName="CategoryManager" UpdateMethod="Update">

  35:      <SelectParameters>

  36:        <asp:ControlParameter ControlID="grdCategories" 

  37:           Name="categoryID" 

  38:          PropertyName="SelectedValue" Type="Int32" />

  39:      </SelectParameters>

  40:    </asp:ObjectDataSource>

Con el control FormView se puede hacer prácticamente todo tipo de mantenimiento, se puede poner combos dentro de el y además que esté enlazados a base de datos a través de otro control ObjectDataSource. Podemos decir que el ObjectDataSource es un motorcito que permite mapear automáticamente controles de datos (tanto para mostrar como para recuperar) con clases y objetos. Imaginen un formulario de 20 campos y tener que asignar/recuperar uno por uno. Con el ObjectDataSource no es nada.

Para terminar, si están desarrollando en ASP.NET con WebForms, los animo a intentar usar el FormView + ObjectDataSource en los escenarios de mantenimiento que tengan, y si tienen alguna duda, puede dejar sus comentarios y vemos como los ayudamos. En base a las preguntas que tengan, podemos hacer ejemplos más elaborados y más puntuales.

Pueden descargar la aplicación ejemplo aquí: CRUD usando ObjectDataSource. (completar los acceso a datos del Insert, Update, Delete).

Página en el navegador:

El código que tiene la página aspx es:

   1: //pagina ASPX

   2: using System;

   3:  

   4: public partial class wfCategories : System.Web.UI.Page

   5: {

   6:     protected void Page_Load(object sender, EventArgs e)

   7:     {

   8:  

   9:     }

  10: }

La clase que use para el ObjectDataSource es la siguiente:

   1: //CategoryManager

   2: using System;

   3: using System.Collections.Generic;

   4: using System.ComponentModel;

   5:  

   6: [DataObject]

   7: public class CategoryManager

   8: {

   9:  

  10:   #region GetAll, getOne

  11:  

  12:   [DataObjectMethod(DataObjectMethodType.Select, true)]

  13:   public List<Category> getAll()

  14:   {

  15:     CategoryRepository catRep = new CategoryRepository();

  16:  

  17:     return catRep.getAll();

  18:   }

  19:  

  20:   [DataObjectMethod(DataObjectMethodType.Select, false)]

  21:   public Category getOneByID(Int32 categoryID)

  22:   {

  23:     CategoryRepository catRep = new CategoryRepository();

  24:     return catRep.getOneByID(categoryID);

  25:   }

  26:  

  27:   #endregion

  28:  

  29:   #region Insert, Update, Delete

  30:  

  31:   [DataObjectMethod(DataObjectMethodType.Insert,true)]

  32:   public void Insert(Category objItem)

  33:   {

  34:     //pendiente de implementacion

  35:   }

  36:  

  37:   [DataObjectMethod(DataObjectMethodType.Update, true)]

  38:   public void Update(Category objItem)

  39:   {

  40:     //pendiente de implementacion

  41:   }

  42:  

  43:   [DataObjectMethod(DataObjectMethodType.Delete, true)]

  44:   public void Delete(Category objItem)

  45:   {

  46:     //pendiente de implementacion

  47:   }

  48:  

  49:   #endregion

  50:  

  51: }

Saludos,

RAD con Oracle Application Express 4.0

Si han tenido la oportunidad de descargar Oracle Express Edition, se han podido percatar  que la herramienta de consulta (QueryAnalyzer o Sql Management Tool) era una interface Web, que además de poder hacer de consultas a las tablas, te permitía crear formularios, reportes, aplicaciones, entre otros, al estilo de lo que se puede hacer con una base de datos Access, esa Web es Oracle Application Express.

Parece que ya no es suficiente con tener versiones Express (Sql Express Edition y Oracle Express Edition), ahora veremos quien avanza más en el terreno de “algo mas”, que en este caso Oracle le lleva ventaja con el Oracle Application Express.

¿Se pueden hacer aplicaciones “serias” con este tipo de herramientas? Con MS Access he visto aplicaciones “serias” estilo ERP, claro con su limitantes, pero en producción y funcionando al fin y al cabo. ¿Imaginen poder hacer lo mismo, pero atrás una base de datos como SQL Server o Oracle?

Recientemente se ha liberado Oracle Application Express 4.0, pueden hacer una evaluación gratuita (crear base de datos, y crear aplicaciones de ejemplo) sin la necesidad de instalar Oracle, usando: apex.oracle.com.

Nuevas funcionalidades de Oracle Application Express 4.0 [] (en ingles para no atarantar con la traducción):

  • Websheets, is a quick and easy way to get content on the web.
  • Dynamic Actions, Users are demanding more user interactivity and client-side functionality whereby the application responds as soon as a value is changed or the user leaves a field.
  • Plug-Ins, allow for the Application Express framework to be readily extended with custom item types, region types, application processes and Dynamic Actions.
  • Team Development, is designed to manage software development.
  • Improved Charting with Gantts and Maps, the underlying charting engine has been upgraded to AnyChart 5.1 which is faster, provides better graphics, and decreases rendering time.
  • RESTful Web Services Support, are becoming more common, especially amongst public Web service providers, as an alternative to SOAP Web Services.
  • Enhanced Interactive Reports, Available since Application Express 3.1, Interactive Reports take much of the burden off developers to produce all the different online reports end-users want by allowing end-users to manipulate the data provided for themselves.
  • Improved Application Builder, has undergone a large overhaul designed to improve navigation and make it faster and easier for developers to create, maintain and enhance Oracle Application Express applications.
  • Better Themes, Application Express provides 20 themes.
  • APEX Listener, is a new Java based listener that can run on a J2EE based Web Server, such as Oracle WebLogic Server or OC4J.

 

Les recomiendo crearse una cuenta, y ver pueden hacer ustedes con esta herramienta, o también para tomar prestada alguna funcionalidad. En mi caso acabo de crear un cuenta, y una opción interesante para crear una tabla (con mantenimiento incluido) es importando información de hoja de calculo:

Y he aquí mi mantenimiento:

 

Además también hay una aplicación ejemplo para poder el poder de esta herramienta:

Saludos,