Configurar los valores de parámetro de ObjectDataSource mediante programación (C#)

por Scott Mitchell

Descargar PDF

En este tutorial veremos cómo agregar un método a nuestras DAL (capa de acceso a datos) y BLL (capa de lógica de negocios) que acepta un único parámetro de entrada y devuelve datos. En el ejemplo se establecerá este parámetro mediante programación.

Introducción

Como hemos visto en el tutorial anterior, hay varias opciones disponibles para pasar valores de parámetro mediante declaración a los métodos de ObjectDataSource. Si el valor del parámetro está codificado de forma rígida, procede de un control web en la página o de cualquier otro origen legible por un objeto de origen de datos Parameter, por ejemplo, ese valor se puede enlazar al parámetro de entrada sin escribir una línea de código.

Sin embargo, puede haber ocasiones en las que el valor del parámetro procede de algún origen que aún no tenga en cuenta en uno de los objetos de origen de datos Parameter integrados. Si nuestro sitio admite cuentas de usuario, es posible que deseemos establecer el parámetro en función del identificador de usuario del visitante que ha iniciado sesión actualmente. O es posible que tengamos que personalizar el valor del parámetro antes de enviarlo al método del objeto subyacente de ObjectDataSource.

Cada vez que se invoca el método Select de ObjectDataSource, ObjectDataSource primero genera su evento Selecting. A continuación, se invoca el método del objeto subyacente de ObjectDataSource. Una vez que se completa, se activa el evento Selected de ObjectDataSource (la figura 1 muestra esta secuencia de eventos). Los valores de parámetro pasados al método del objeto subyacente de ObjectDataSource se pueden establecer o personalizar en un controlador de eventos para el evento Selecting.

The ObjectDataSource's Selected and Selecting Events Fire Before and After Its Underlying Object's Method is Invoked

Figura 1: los eventos Selected y Selecting de ObjectDataSource se activan antes y después de invocar el método del objeto subyacente (haga clic para ver la imagen a tamaño completo)

En este tutorial veremos cómo agregar un método a nuestras DAL y BLL que acepta un único parámetro Month de entrada, de tipo int y devuelve un objeto EmployeesDataTable rellenado con los empleados que tienen su aniversario de contratación en el Month especificado. En nuestro ejemplo se establecerá este parámetro mediante programación en función del mes actual, en el que se muestra una lista de "Aniversario de empleados este mes".

Comencemos.

Paso 1: agregar un método a EmployeesTableAdapter

Para nuestro primer ejemplo, necesitamos agregar un medio para recuperar los empleados cuyos HireDate se produjeron en un mes especificado. Para proporcionar esta funcionalidad de acuerdo con nuestra arquitectura, primero necesitamos crear un método en EmployeesTableAdapter que se asigne a la instrucción SQL adecuada. Para ello, comience abriendo el conjunto de datos con tipo Northwind. Haga clic con el botón derecho en la etiqueta EmployeesTableAdapter y elija Agregar consulta.

Add a New Query to the EmployeesTableAdapter

Figura 2: agregar una nueva columna a EmployeesTableAdapter (haga clic aquí para ver la imagen a tamaño completo)

Elija agregar una instrucción SQL que devuelva filas. Cuando llegue a la pantalla Especificar una instrucción SELECT, ya se habrá cargado la instrucción predeterminada SELECT para EmployeesTableAdapter. Simplemente agregue la cláusula WHERE: WHERE DATEPART(m, HireDate) = @Month. DATEPART es una función T-SQL que devuelve una parte de fecha determinada de un tipo datetime; en este caso, se usa DATEPART para devolver el mes de la columna HireDate.

Return Only Those Rows Where the HireDate Column is Less Than or Equal to the <span class=@HiredBeforeDate Parameter" />

Figura 3: devolver solo las filas en las que la columna HireDate es menor o igual que el parámetro @HiredBeforeDate (haga clic para ver la imagen a tamaño completo)

Por último, cambie los nombres de método FillBy y GetDataBy a FillByHiredDateMonth y GetEmployeesByHiredDateMonth, respectivamente.

Choose More Appropriate Method Names Than FillBy and GetDataBy

Figura 4: elegir nombres de método más adecuados que FillBy y GetDataBy (haga clic para ver la imagen a tamaño completo)

Haga clic en Finalizar para completar el asistente y volver a la superficie de diseño del conjunto de datos. Ahora EmployeesTableAdapter debería incluir un nuevo conjunto de métodos para acceder a los empleados contratados en un mes especificado.

The New Methods Appear in the DataSet's Design Surface

Figura 5: los nuevos métodos aparecen en la superficie de diseño del conjunto de datos (haga clic para ver la imagen a tamaño completo)

Paso 2: agregar el método GetEmployeesByHiredDateMonth(month) a la capa de lógica de negocios

Dado que nuestra arquitectura de la aplicación usa una capa independiente para la lógica de negocios y la lógica de acceso a datos, es necesario agregar un método a nuestro BLL que llame a la DAL para recuperar los empleados contratados antes de una fecha especificada. Abra el archivo EmployeesBLL.cs y agregue el método siguiente:

[System.ComponentModel.DataObjectMethodAttribute
    (System.ComponentModel.DataObjectMethodType.Select, false)]
public Northwind.EmployeesDataTable GetEmployeesByHiredDateMonth(int month)
{
    return Adapter.GetEmployeesByHiredDateMonth(month);
}

Al igual que con nuestros otros métodos de esta clase, GetEmployeesByHiredDateMonth(month) simplemente llama a la DAL y devuelve los resultados.

Paso 3: mostrar a los empleados cuyo aniversario de contratación es este mes

Nuestro último paso para este ejemplo es mostrar a los empleados cuyo aniversario de contratación es este mes. Empiece agregando una clase GridView a la página ProgrammaticParams.aspx de la carpeta BasicReporting y agregue un nuevo ObjectDataSource como origen de datos. Configure ObjectDataSource para que utilice la clase EmployeesBLL con SelectMethod establecido en GetEmployeesByHiredDateMonth(month).

Use the EmployeesBLL Class

Figura 6: usar la clase EmployeesBLL (haga clic para ver la imagen a tamaño completo)

Select From the GetEmployeesByHiredDateMonth(month) method

Figura 7: seleccionar en el método GetEmployeesByHiredDateMonth(month) (haga clic para ver la imagen a tamaño completo)

La pantalla final nos pide que proporcionemos el origen del valor del parámetro month. Puesto que estableceremos este valor mediante programación, deje el valor de Origen de parámetro establecido en la opción None predeterminada y haga clic en Finalizar.

Leave the Parameter Source Set to None

Figura 8: dejar los orígenes de parámetros establecidos en None (haga clic para ver la imagen a tamaño completo)

Esto creará un objeto Parameter en la colección SelectParameters de ObjectDataSource que no tiene un valor especificado.

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
    OldValuesParameterFormatString="original_{0}"
    SelectMethod="GetEmployeesByHiredDateMonth" TypeName="EmployeesBLL">
    <SelectParameters>
        <asp:Parameter Name="month" Type="Int32" />
    </SelectParameters>
</asp:ObjectDataSource>

Para establecer este valor mediante programación es necesario crear un controlador de eventos para el evento Selecting de ObjectDataSource. Para ello, vaya a la Vista de diseño y haga doble clic en ObjectDataSource. Como alternativa, seleccione ObjectDataSource, vaya a la ventana Propiedades y haga clic en el icono de rayo. A continuación, haga doble clic en el cuadro de texto situado junto al evento Selecting o escriba el nombre del controlador de eventos que desea usar.

Click on the Lightning Bolt Icon in the Properties Window to List a Web Control's Events

Figura 9: hacer clic en el icono rayo en la ventana Propiedades para enumerar los eventos de un control web

Los tres enfoques agregan un nuevo controlador de eventos para el evento Selecting de ObjectDataSource a la clase de código subyacente de la página. En este controlador de eventos, podemos leer y escribir en los valores de parámetro mediante e.InputParameters[parameterName], donde parameterName es el valor del atributo Name de la etiqueta <asp:Parameter> (la colección InputParameters también se puede indexar ordinalmente, como en e.InputParameters[index]). Para establecer el parámetro month en el mes actual, agregue lo siguiente al controlador de eventos Selecting:

protected void ObjectDataSource1_Selecting
    (object sender, ObjectDataSourceSelectingEventArgs e)
{
    e.InputParameters["month"] = DateTime.Now.Month;
}

Al visitar esta página a través de un explorador podemos ver que solo una empleada fue contratada este mes (marzo); Laura Callahan, que ha estado con la empresa desde 1994.

Those Employees Whose Anniversaries This Month Are Shown

Figura 10: los empleados cuyos aniversarios se muestran este mes (haga clic para ver la imagen a tamaño completo)

Resumen

Aunque los valores de los parámetros de ObjectDataSource normalmente se pueden establecer mediante declaración, sin necesidad de una línea de código, es fácil establecer los valores de parámetro mediante programación. Todo lo que necesitamos hacer es crear un controlador de eventos para el evento Selecting de ObjectDataSource, que se activa antes de invocarse el método del objeto subyacente, y establece manualmente los valores de uno o varios parámetros a través de la colección InputParameters.

En este tutorial se concluye la sección Informes básicos. El siguiente tutorial inicia la sección Escenarios de filtrado y detalles maestros, en la que veremos técnicas para permitir que el visitante filtre los datos y profundice desde un informe maestro en un informe detallado.

¡Feliz programación!

Acerca del autor

Scott Mitchell, autor de siete libros de ASP/ASP.NET y fundador de 4GuysFromRolla.com, ha estado trabajando con tecnologías web de Microsoft desde 1998. Scott trabaja como consultor independiente, instructor y escritor. Su último libro es Sams Teach Yourself ASP.NET 2.0 in 24 Hours. Puede ponerse en contacto con él en mitchell@4GuysFromRolla.com. o a través de su blog, http://ScottOnWriting.NET.

Agradecimientos especiales a

Esta serie de tutoriales contó con la revisión de muchos revisores que fueron de gran ayuda. El revisor principal de este tutorial fue Hilton Giesenow. ¿Le interesaría revisar mis próximos artículos de MSDN? Si es así, escríbame a mitchell@4GuysFromRolla.com.