Enlace de elementos en controles de lista en ASP.NETMiércoles, 24 mar, 2010 @ 23:43 | Por Dario Krapp | ASP.NET |
Menos código
Me parece, luego de lo visto que este es el mejor momento para comentar la existencia de dos controles muy interesantes en ASP.NET, los controles SqlDataSource y ObjectDataSource. Ambos controles nos permitirán definir un origen de datos sin tener la necesidad de escribir ni una sola línea de código.
SqlDataSource
Comenzaremos por ver el control SqlDataSource y como éste encaja en el esquema que hemos visto hasta ahora.
SqlDataSource nos permitirá representar un origen de datos contra un proveedor ADO.NET los proveedores que vienen en ASP.NET listos para usar son SqlClient, OracleClient, OleDb y Odbc.
Si observamos las propiedades de SqlDataSource veremos que una de ellas es ConnectionString. En la misma deberemos establecer la cadena de conexión al servidor SQL.
Hay un detalle que no debemos pasar por alto, si hacemos memoria recordaremos que cada proveedor se encuentra implementado en clases específicas, por ejemplo, para el proveedor contra SQL Server tendremos un SQLCommand, un SQLConnection, etc dentro de namespace SqlClient, mientras para por ejemplo para el caso de ODBC tendremos un OdbcCommand y un OdbcConnection dentro del namespace Odbc.
Por este motivo al control SqlDataSource, que puede funcionar con cualquiera de ellos, deberá establecérsele cual de los mismos deberá utilizar, para tal fin el mismo contará con la propiedad ProviderName las opciones que vienen en ASP.NET son (System.Data.SqlClient, System.Data.OracleClient, System.Data.OleDb y System.Data.Odbc).
Como comentamos previamente, SqlDataSource nos permitirá establecer un origen de datos (contra un proveedor ADO.NET) en el diseñador sin escribir código, entonces no deberá sorprendernos que exista alguna manera de indicarle al control cuales serán los elementos de ese origen de datos que estamos creando, tampoco debería sorprendernos el hecho que dicha definición sea una sentencia SQL, la propiedad SelectCommand permitirá establecer el comando SQL de selección de los elementos que compondrán el origen de datos, a continuación se muestra un ejemplo concreto.
<asp:SqlDataSource
runat="server"
ID="SqlDS2"
ConnectionString="Data Source=(local);Initial Catalog… "
SelectCommand="SELECT TOP 11 * FROM Datos1"/>
En este ejemplo podemos ver la definición de la cadena de conexión y el comando de selección de datos, la propiedad ProviderName no se ha establecido ya que su valor por defecto es System.Data.SqlClient y en nuestro caso estamos utilizando un servidor de base de datos SQL Server 2008 Enterprise.
Cabe mencionar que el SQLDataSource cuenta también con una propiedad llamada SelectCommandType la cual puede establecerse como StoredProcedure para utilizar procedimientos almacenados y no la sentencia SQL como se muestra en el ejemplo, donde al no haberse establecido ningún valor para dicha propiedad, la misma ha tomado el valor por defecto que es Text.
Hasta este punto hemos podido crear un origen de datos sin escribir nada de código, la próxima pregunta imagino que será ¿de qué manera podrá enlazarse este origen de datos contra algunos de los controles de lista?, en este punto entrará en juego la propiedad DataSourceID de los controles de lista, donde deberá simplemente establecerse el nombre del control que suministrará el origen de datos y el enlace quedará listo, a continuación se muestra un ejemplo completo:
<asp:DropDownList runat="server" ID="DDL2" DataSourceID="SqlDS2" DataTextField="Descripcion"> </asp:DropDownList> <asp:SqlDataSource runat="server" ID="SqlDS2" ConnectionString="Data Source=(local);Initial Catalog… " SelectCommand="SELECT TOP 11 * FROM Datos1"/>
De esta forma nos hemos evitado todo el código que habíamos tenido que escribir en los ejemplos previos.
No hay dudas que si vemos esta definición, podrían abordarnos una cuantas inquietudes, sobre todo si le préstamos atención a la propiedad SelectCommand y si a la vez pensamos en la vida real donde las consultas pueden estar restringidas por diversas condiciones las cuales pueden a la vez encontrarse definidas de diversas formas. Por ejemplo podríamos desear obtener información en base a un valor existente en una cookie, en un valor pasado en el QueryString, etc. Este detalle no ha sido omitido y será posible leer parámetros desde:
• Query String
• Un valor de sesión
• Una cookie
• Un valor de perfil (Profile)
• Un valor del formulario (Form)
• Otro control
• Utilizar un parámetro fijo
Para tal fin dispondremos de los elementos:
• QueryStringParameter
• SessionParameter
• CookieParameter
• ProfileParameter
• ControlParameter
• Parameter
En el siguiente ejemplo, se utiliza un elemento ControlParameter para darle valor al parámetro @ID de la consulta perteneciente al SqlDataSource denominado SqlDS2 en base al valor de la propiedad text del control CtlParam (Comentado parece intrincado, pero en el ejemplo puede verse lo claro y simple que es realizar esta tarea).
<asp:DropDownList
runat="server"
ID="DDL2"
DataSourceID="SqlDS2"
DataTextField="Descripcion">
</asp:DropDownList>
<asp:TextBox
runat="server"
ID="CtlParam">
</asp:TextBox>
<asp:SqlDataSource
runat="server"
ID="SqlDS2"
ConnectionString="Data Source=(local);Initial Catalog… "
SelectCommand="SELECT TOP 11 * FROM Datos1 WHERE ID>@ID">
<SelectParameters>
<asp:ControlParameter
Name="ID"
Type="Int32"
ControlID="CtlParam"
PropertyName="text"
DefaultValue="110" />
</SelectParameters>
</asp:SqlDataSource>
Cada elemento “parámetro” contará con las propiedades necesarias para poder definir la captura de parámetros del origen deseado. Para quien no se sienta cómodo escribiendo tags, le será reconfortante saber que será posible establecer todas estas definiciones en modo Diseño. Seleccionando la opción “Configure Data Source …” en el control SqlDataSource deseado se desplegará un wizard.
Un detalle a mencionar es que por defecto el control SqlDataSource utilizará un DataSet para efectuar el enlace de datos, aunque será posible modificar dicho comportamiento estableciendo la propiedad DataSourceMode como “DataReader”.
ObjectDataSource
En la actualidad no puede negarse la tendencia a la utilización de componentes de acceso a datos, el control ObjectDataSource permitirá enlazar un control ASP.NET a una clase de acceso a datos, de forma similar a la que el control SqlDataSource permitía enlazar un control a un origen de datos SQL.
En este caso deberemos contar con una clase que efectuará las tareas de acceso a datos la cual será utilizada por el control ObjectDataSource y otra clase de objeto de datos que representará a la entidad a modelar. Un ejemplo permitirá entender estos conceptos en una forma más simple.
Para comenzar supondremos que estaremos modelando una entidad compuesta por un identificador y una descripción, en base a esto deberemos definir dos clases una clase de acceso a datos y una clase de objeto de datos, la clase de objeto de datos representará a la entidad que la clase de acceso a datos manejará. El primer paso será crear la clase de objeto de datos.
public class ObjectDataSourceDO
{
private int _ID;
private string _Descripcion;
public int ID
{
get { return _ID; }
set { _ID = value; }
}
public string Descripcion
{
get { return _Descripcion; }
set { _Descripcion = value; }
}
}
Es imprescindible que cada propiedad de la entidad sea modelada como una propiedad pública de la clase.
El próximo paso constará en definir la clase de acceso a datos.
public class ObjectDataSourceDB
{
public ObjectDataSourceDO[] GetWhereIdGreaterThan(int ID)
{
…
}
}
En este ejemplo solo se ha definido un metodo que devolverá un arreglo de objetos de datos ObjectDataSourceDO para aquellas entidades con un valor de ID mayor al pasado por parámetros, en este caso el código del metodo no se ha incluido, ya que no tiene repercusion en el ejemplo.
La clase de acceso a datos deberá cumplir con ciertas condiciones para que pueda ser utilizada sin problemas por un ObjectDataSource, deberá:
• Utilizar un solo método para cada operación (alta, baja, listado, etc)
• Utilizar un elemento que implemente la interfaz IEnumerable para devolver varios datos, cada dato a devolver además deberá ser un objeto de datos.
• La clase de acceso a datos no deberá mantener estados.
Estas restricciones se deben a que el elemento ObjectDataSource utilizará reflection para crear en tiempo de ejecución los objetos necesarios para acceder (a traves de al clase de acceso a datos) a los datos y obtener los resultados (en la clase de objetos de datos). Cada instancia será creada cuando sea necesaria y destruida luego de haberse utilizado.
En el siguiente ejemplo se utiliza el método GetWhereIdGreaterThan de la clase ObjectDataSourceDB para enlazar los resultados devueltos al control DDL1 y se utiliza un parámetro que tomará el valor de la sesión y se lo pasará al método GetWhereIdGreaterThan. Las opciones de parámetros mencionados para el SqlDataSource, como es de esperarse, se encontrarán también disponibles para el ObjectDataSource, al igual que la posibilidad de definirlo en modo diseño.
<asp:DropDownList
ID="DDL1"
runat="server"
DataSourceID="ObjDS1"
DataTextField="ID" >
</asp:DropDownList>
<asp:ObjectDataSource
runat="server"
ID="ObjDS1"
TypeName=" ObjectDataSourceDB"
SelectMethod="GetWhereIdGreaterThan">
<SelectParameters>
<asp:SessionParameter
DefaultValue="100"
DbType="Int32"
Name="ID"
/>
</SelectParameters>
</asp:ObjectDataSource>
En el ejemplo puede observarse que el parámetro ID solicitado por el metodo GetWhereIdGreaterThan es proporcionado en el ObjectDataSource ObjDS1, la propiedad Name del parametro SessionParameter deberá coincidir con el nombre del parametro esperado por el método GetWhereIdGreaterThan (sin importar mayusculas y minusculas) para que ASP.NET pueda realizar la invocación.
Si ejecutamos este codigo veremos que el DropDownList DDL1 es llenado por los valores proporcionados por el método GetWhereIdGreaterThan.
Con este último ejemplo doy por concluido este artículo donde si bien hemos visto las opciones que el enlace ofrece en ASP.NET, no hemos profundizado demasiado en cada una de ellas, en mi proximo articulo mi intención es retomar el tema desde este punto para adentrarnos en un control de enlace más intesante llamado GridView que nos permitirá explorar las opciones que ASP.NET nos ofrece para además de mostrar informacion en la interfaz de usuario, permitir la modificacion y transferencia de datos modificados hacia el origen de datos.
Espero que este articulo haya sido de utilidad para quienes nunca hayan utilizado enlace en ASP.NET y para quienes si ya lo hayan hecho, espero se hayan encontrado con algún detalle desconocido.
Reciente








Responder