Tips para usar el ObjectDataSource como fuente de datos

Como ustedes saben ahora existen diversos controles DataSource para el enlace a datos en una aplicación ASP.NET. Ya hemos hablados de algunos de ellos: ObjectDataSource, y XmlDataSource. Pero en este post vamos hablar un poco más del control ObjectDataSource.


Si han estado usando un control GridView enlazado a un control ObjectDataSource, y han implementado el método eliminar en su componente de negocio, se habrán podido dar cuenta que no funciona el comando eliminar del GridView. Depuramos y efectivamente el método si es llamado, pero el parámetro del código del registro que deseamos borrar contiene cero:



Ustedes dicen -pero que pasa, vuelven a ejecutar y nada, verifican que el parámetro del comando eliminar del ObjectDataSource sea igual al nombre de la columna, pero nada:


   <DeleteParameters>
      <asp:Parameter Name=”NOTCod” Type=”Int32″ />
   </DeleteParameters>


Volvemos a ejecutar pero nada, ejecutamos otra vez y nada (en este momento empiezan a silbar, y a pedir su plata). Pero después que terminar de silbar, vamos por los detalles, de que esta pasando y porque no elimina.


Lo que pasa es que el GridView no identifica el campo clave que se usará como parámetro, por más que pongamos el mismo nombre. Lo que debemos hacer es, agregar la propiedad DataKeyNames al GridView:


   DataKeyNames=”NOTCod”  


Con esto el GridView sabrá que esa será la columna con la clave principal, y esa será usada para llamar al método eliminar. Ojo no necesariamente el nombre del parámetro eliminar del ObjectDataSource debe ser el mismo, por ejemplo yo puedo llamar a mi parámetro, en mi método, así:


   <DeleteParameters>
      <asp:Parameter Name=”pNOTCod” Type=”Int32″ />
   </DeleteParameters>


Pero en este caso debemos agregar una propiedad al ObjectDataSource, OldValuesParameterFormatString, para que pueda cambiar el formato del string del parámetro pasado:


   OldValuesParameterFormatString=”p{0}”


Con esto le decimos que tome el valor del campo seleccionado en el GridView, NOTCod, y cambie el formato a pNOTCod, antes de pasarlo al método eliminar o actualizar. Esta propiedad sólo se aplica a las claves principales, es decir las que identificamos con la propiedad DataKeyNames en el GridView.


Les gustaría saber como generar automáticamente la propiedad DataKeyNames, con la clave de nuestro objeto de negocio?, o lo dejo para otro post *-), jeje, mejor lo cuento ahora, pero sólo para ustedes.


Primero ubican su objeto de negocio, y la clave principal, y le agregamos el siguiente atributo, DataObjectFieldAttribute, al atributo NOTCodigo de nuestra clase:


   [DataObjectField(true,true)]
   public Nullable<int> NOTCodigo
   {
      get { return notCodigo; }
      set { notCodigo = value; }
   }


Con esto le decimos que NOTCodigo, será la clave principal, y además es de tipo Identity. Ahora cuando enlacen un GridView a un ObjectDataSource, la propiedad DataKeyNames se generará automáticamente, siempre y cuando el método retorne una colección de objetos de este tipo.


Lo que también podemos hacer, es agregar los siguientes atributos al componente de negocio, DataObjectAttribute y DataObjectMethodAttribute:


   [DataObject]
   public class NOTAgenteNoticia
   {
      [DataObjectMethod(DataObjectMethodType.Select,true)]
      public static List<BONOT.BONoticia> Listar(int pAreCodigo)
      { 
         int nroNoticias = int.Parse(NOTUtil.Settings(“NOTNroNoticias”)); 
         BLNOT.BLNoticia objBLNOT = new BLNOT.BLNoticia(); 
         return objBLNOT.ListarNoticias(pAreCodigo,nroNoticias); 
      }

      [DataObjectMethod(DataObjectMethodType.Delete,true)]
      public static bool Eliminar(int pNOTCod)
      {
         BLNOT.BLNoticia objBLNOT = new BLNOT.BLNoticia(); 
         return objBLNOT.Eliminar(pNOTCod); 
      }

   } 


Con el atributo DataObject agregado a nuestro componente de negocio, o la clase que se usa para conectar el FrontEnd con los componentes de negocio, en mi caso agente, hacemos que sólo esta clase sea recocida para mostrar en las opciones del asistente para crear el ObjectDataSource:



Como pueden apreciar al marcar “Show only data components”, sólo veremos las clases que tengan el atributo DataObject, y no todo el montón de clases que normalmente salen.


Con el atributo DataObjectMethod, le decimos que reconozca a este método como Eliminar, o Insertar, dependiendo de la enumeración DataObjectMethodType, con sus posibles valores: Delete, Fill, Insert, Select, y Update, para las diversas operaciones que necesitemos hacer hacia nuestra fuente de datos.


También visitar:



Saludos,


Post cruzado

5 comentarios en “Tips para usar el ObjectDataSource como fuente de datos”

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *