动态向OjbectDataSource添加参数(转eddie005)
2007-08-24 10:58
246 查看
有很多可供选择的方式把参数的值传递到OjbectDataSource的方法里。假如参数值是采用硬编码方式,来源于页面上的一个Web控件,又或者其他可被数据源Parameter对象读取的源,那么这个值可以绑定到输入参数而不需要写一行的代码。
然而有些时候,参数值来自某些在数据源的内置Parameter对象里还没有计算出来的源。假如我们的站点支持我们的考虑那么我们也许希望参数基于当前登录用户。又或者我们在参数传送到ObjectDataSource的隐含对象的方法前做一些客户化定制。
无论什么时候调用ObjectDataSource的Seelect方法,它都会首先触发它的Selecting事件,然后才调用ObjectDataSource的隐含对象的方法,完成后则激发ObjectDataSource ObjectDataSource的Selected事件(图一说明这些事件的顺序)。可以在Selecting事件的事件委托中对参数的值进行设置或更改。
图1: ObjectDataSource的Selected和Selecting事件分别在调用它的隐含对象的方法之前和之后触发
这一节里我们将看看添加一个接受一个输入参数方法到DAL和BLL层,参数名为Month,int类型,方法返回一个EmployeesDataTable对象,里边包含的是雇佣周年纪念都指定月份的雇员。我们的例子将编码设置为基于当前月份,显示一个“本月雇用周年纪念员工”列表。
让我们开始吧!
第一步: 添加一个方法到EmployeesTableAdapter
在我们的第一个例子里,我们需要添加一个方法来获取那些雇用日期(HireDate)在某个指定月份的员工。在我们的程序架构下为了提供这个功能,我们首先需要在通过特定SQL语句映射出来的EmployeesTableAdapter中创建一个方法。为了实现这一点,首先打开Northwind类型化数据集,在EmployeesTableAdapter标签上右键选择“添加查询”。
图2: 在EmployeesTableAdapter里添加一个查询
选择返回一个或多个行和列的SQL语句。当到达指定SELECT语句窗口时,EmployeesTableAdapter已经装载了默认的SELECT语句。简单地,添加一个WHERE子句:WHERE DATEPART(m, HireDate) = @Month 。其中DATEPART是T-SQL里的一个函数,用作返回日期类型的一部分;在这里,我们使用DATEPART函数返回雇用日期(HireDate)列的月份部分。
图3: 仅返回HireDate列的值小于等于参数@HiredBeforeDate的行
最后,分别把默认的方法名FillBy和GetDataBy更改为FillByHiredDateMonth和GetEmployeesByHiredDateMonth。
图4: 选择比FillBy和GetDataBy更恰当的方法名称
点击“完成”结束向导并返回到数据集的设计界面。这时候EmployeesTableAdapter会包含一套新的方法来获取指定月份雇用的员工。
图5: 新的方法出现在数据集的设计界面
第二步: 在业务逻辑层添加方法GetEmployeesByHiredDateMonth(month)
因为我们的程序架构使用了单独的一层来处理业务逻辑和数据逻辑,我们需要在BLL里增加一个方法,该方法调用DAL的方法获取指定月份里雇用的员工。打开文件EmployeesBLL.cs并添加下面这个方法:
[System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Select, false)]
public Northwind.EmployeesDataTable GetEmployeesByHiredDateMonth(int month)
{
return Adapter.GetEmployeesByHiredDateMonth(month);
}
和此类里的其他方法一样,GetEmployeesByHiredDateMonth(month)仅仅是简单地调用DAL并返回结果。
第三步: 显示雇用周年纪念日在本月份的员工
最后一部我们举例说明如何显示雇用周年纪念在本月份的员工。首先,添加一个GridView控件到页面ProgrammaticParams.aspx,该页面在文件夹BasicReporting里。添加一个新的ObjectDataSource控件作为它的数据源。配置ObjectDataSource使用类EmployeesBLL并指定SelectMethod属性为GetEmployeesByHiredDateMonth(month)。
图6: 使用EmployeesBLL类
图7: 选择GetEmployeesByHiredDateMonth(month)方法
最后一屏要求我们给month参数提供参数源。既然我们将编码设置这个值,就让参数源维持它的默认选项None,点击“完成”。
图8: 让参数源设置为None
这将在ObjectDataSource的SelectParameters集合里创建一个未指定参数值的Parameter对象。
SelectMethod="GetEmployeesByHiredDateMonth" TypeName="EmployeesBLL">
<SelectParameters>
<asp:Parameter Name="month" Type="Int32" />
</SelectParameters>
</asp:ObjectDataSource>
要编码设置这个参数值,我们需要给ObjectDataSource的Selecting事件添加一个事件委托。为了实现这一点,到设计视图里在ObjectDataSource上双击。另一种方式是选中ObjectDataSource在属性窗口里点击黄色闪电小图标,然后,直接在Selecting这一栏里双击或者输入一个你要使用的事件委托的名称。
图9:点击属性窗口里的闪电图标列出Web控件的所有事件
两种途径都可以在页面的代码隐藏类里增加一个对ObjectDataSource的Selecting事件的事件委托。在这个事件委托里,我们可以通过使用e.InputParameters[parameterName]读取参数的值,其中parameterName的值是<asp:Parameter>标签里的属性Name的值(InputParameters也可以按照索引访问,用e.InputParameters[index])。为了把month参数设置为当前月份,需要在Selecting事件委托里加入如下代码:
protected void ObjectDataSource1_Selecting(object sender, ObjectDataSourceSelectingEventArgs e)
{
e.InputParameters["month"] = DateTime.Now.Month;
}
当通过浏览器访问该页面,我们可以看到只有一个员工是在当前月份(三月)雇用的:Laura Callahan,他从1994年3月开始雇用。
图10: 雇用周年纪念日在本月份的员工被显示出来了
总结
虽然可以用特定的方式声明ObjectDataSource的参数值而不需要写代码,编程设置参数值同样很容易。我们需要做的仅仅是给ObjectDataSource的Selecting事件增加一个事件委托,它在调用隐含对象的方式前触发,并且通过InputParameters集合手工设置一个或多个参数值。
然而有些时候,参数值来自某些在数据源的内置Parameter对象里还没有计算出来的源。假如我们的站点支持我们的考虑那么我们也许希望参数基于当前登录用户。又或者我们在参数传送到ObjectDataSource的隐含对象的方法前做一些客户化定制。
无论什么时候调用ObjectDataSource的Seelect方法,它都会首先触发它的Selecting事件,然后才调用ObjectDataSource的隐含对象的方法,完成后则激发ObjectDataSource ObjectDataSource的Selected事件(图一说明这些事件的顺序)。可以在Selecting事件的事件委托中对参数的值进行设置或更改。
图1: ObjectDataSource的Selected和Selecting事件分别在调用它的隐含对象的方法之前和之后触发
这一节里我们将看看添加一个接受一个输入参数方法到DAL和BLL层,参数名为Month,int类型,方法返回一个EmployeesDataTable对象,里边包含的是雇佣周年纪念都指定月份的雇员。我们的例子将编码设置为基于当前月份,显示一个“本月雇用周年纪念员工”列表。
让我们开始吧!
第一步: 添加一个方法到EmployeesTableAdapter
在我们的第一个例子里,我们需要添加一个方法来获取那些雇用日期(HireDate)在某个指定月份的员工。在我们的程序架构下为了提供这个功能,我们首先需要在通过特定SQL语句映射出来的EmployeesTableAdapter中创建一个方法。为了实现这一点,首先打开Northwind类型化数据集,在EmployeesTableAdapter标签上右键选择“添加查询”。
图2: 在EmployeesTableAdapter里添加一个查询
选择返回一个或多个行和列的SQL语句。当到达指定SELECT语句窗口时,EmployeesTableAdapter已经装载了默认的SELECT语句。简单地,添加一个WHERE子句:WHERE DATEPART(m, HireDate) = @Month 。其中DATEPART是T-SQL里的一个函数,用作返回日期类型的一部分;在这里,我们使用DATEPART函数返回雇用日期(HireDate)列的月份部分。
图3: 仅返回HireDate列的值小于等于参数@HiredBeforeDate的行
最后,分别把默认的方法名FillBy和GetDataBy更改为FillByHiredDateMonth和GetEmployeesByHiredDateMonth。
图4: 选择比FillBy和GetDataBy更恰当的方法名称
点击“完成”结束向导并返回到数据集的设计界面。这时候EmployeesTableAdapter会包含一套新的方法来获取指定月份雇用的员工。
图5: 新的方法出现在数据集的设计界面
第二步: 在业务逻辑层添加方法GetEmployeesByHiredDateMonth(month)
因为我们的程序架构使用了单独的一层来处理业务逻辑和数据逻辑,我们需要在BLL里增加一个方法,该方法调用DAL的方法获取指定月份里雇用的员工。打开文件EmployeesBLL.cs并添加下面这个方法:
[System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Select, false)]
public Northwind.EmployeesDataTable GetEmployeesByHiredDateMonth(int month)
{
return Adapter.GetEmployeesByHiredDateMonth(month);
}
和此类里的其他方法一样,GetEmployeesByHiredDateMonth(month)仅仅是简单地调用DAL并返回结果。
第三步: 显示雇用周年纪念日在本月份的员工
最后一部我们举例说明如何显示雇用周年纪念在本月份的员工。首先,添加一个GridView控件到页面ProgrammaticParams.aspx,该页面在文件夹BasicReporting里。添加一个新的ObjectDataSource控件作为它的数据源。配置ObjectDataSource使用类EmployeesBLL并指定SelectMethod属性为GetEmployeesByHiredDateMonth(month)。
图6: 使用EmployeesBLL类
图7: 选择GetEmployeesByHiredDateMonth(month)方法
最后一屏要求我们给month参数提供参数源。既然我们将编码设置这个值,就让参数源维持它的默认选项None,点击“完成”。
图8: 让参数源设置为None
这将在ObjectDataSource的SelectParameters集合里创建一个未指定参数值的Parameter对象。
SelectMethod="GetEmployeesByHiredDateMonth" TypeName="EmployeesBLL">
<SelectParameters>
<asp:Parameter Name="month" Type="Int32" />
</SelectParameters>
</asp:ObjectDataSource>
要编码设置这个参数值,我们需要给ObjectDataSource的Selecting事件添加一个事件委托。为了实现这一点,到设计视图里在ObjectDataSource上双击。另一种方式是选中ObjectDataSource在属性窗口里点击黄色闪电小图标,然后,直接在Selecting这一栏里双击或者输入一个你要使用的事件委托的名称。
图9:点击属性窗口里的闪电图标列出Web控件的所有事件
两种途径都可以在页面的代码隐藏类里增加一个对ObjectDataSource的Selecting事件的事件委托。在这个事件委托里,我们可以通过使用e.InputParameters[parameterName]读取参数的值,其中parameterName的值是<asp:Parameter>标签里的属性Name的值(InputParameters也可以按照索引访问,用e.InputParameters[index])。为了把month参数设置为当前月份,需要在Selecting事件委托里加入如下代码:
protected void ObjectDataSource1_Selecting(object sender, ObjectDataSourceSelectingEventArgs e)
{
e.InputParameters["month"] = DateTime.Now.Month;
}
当通过浏览器访问该页面,我们可以看到只有一个员工是在当前月份(三月)雇用的:Laura Callahan,他从1994年3月开始雇用。
图10: 雇用周年纪念日在本月份的员工被显示出来了
总结
虽然可以用特定的方式声明ObjectDataSource的参数值而不需要写代码,编程设置参数值同样很容易。我们需要做的仅仅是给ObjectDataSource的Selecting事件增加一个事件委托,它在调用隐含对象的方式前触发,并且通过InputParameters集合手工设置一个或多个参数值。
相关文章推荐
- sun黑科技之动态添加jvm参数
- Retrofit,Okhttp对每个Request统一动态添加header和参数
- JavaScript创建动态Form,添加请求参数,提交
- 向SqlParameter内动态添加参数
- 开发中遇到的问题-动态创建按钮并且添加带有参数的点击事件
- 解决动态添加带有含参数事件的语句拼接,个人理解
- 存储过程中动态条件的添加 where条件 in条件中字符串参数
- mybatis动态添加排序条件参数设置
- 解决使用AJax往DropDownList中动态添加数据时发生,回发或回调参数无效 的问题
- js动态添加事件并可传参数示例代码
- JDBC PreparedStatement 预编译语句 动态添加条件-SQL参数不定
- 初步的学会用数组动态添加参数(一个添加存储过程参数的例子)
- js动态添加onclick事件可传参数与不传参数
- 动态添加OracleParameter 参数
- jsp html中 window.location.href动态添加参数
- GridView 动态添加模板列并绑定数据 实现从外部直接传入控件 和 绑定字段参数
- JS动态添加网址参数,修改网址参数值的自定义功能函数
- JMeter怎么在get URL请求、POST请求中添加动态参数用于服务器段安全验证
- Spring MVC根据运行参数添加filter代理(启动时动态添加filter和listener)
- Rhino gha开发如何添加动态参数