Configurar los valores de parámetro de ObjectDataSource mediante programación (VB)
por Scott Mitchell
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
.
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 Integer
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.
Figura 2: adición de 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
.
@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.
Figura 4: elija 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.
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.vb
y agregue el método siguiente:
<System.ComponentModel.DataObjectMethodAttribute _
(System.ComponentModel.DataObjectMethodType.Select, False)> _
Public Function GetEmployeesByHiredDateMonth(ByVal month As Integer) _
As Northwind.EmployeesDataTable
Return Adapter.GetEmployeesByHiredDateMonth(month)
End Function
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)
.
Figura 6: use la clase EmployeesBLL
(haga clic para ver la imagen a tamaño completo)
Figura 7: seleccione 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.
Figura 8: deje 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. Como tercera opción, puede crear el controlador de eventos seleccionando ObjectDataSource y su evento Selecting
en las dos listas desplegables de la parte superior de la clase de código subyacente de la página.
Figura 9: haga 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 Sub ObjectDataSource1_Selecting _
(sender As Object, e As ObjectDataSourceSelectingEventArgs) _
Handles ObjectDataSource1.Selecting
e.InputParameters("month") = DateTime.Now.Month
End Sub
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.
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, entrenador 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, que se puede encontrar en http://ScottOnWriting.NET.
Agradecimientos especiales a
Esta serie de tutoriales fue revisada por muchos revisores de gran ayuda. El revisor principal de este tutorial fue Hilton Giesenow. ¿Le interesaría revisar mis próximos artículos de MSDN? Si fuera así, escríbame a mitchell@4GuysFromRolla.com.