ASP.NET 数据源控件可以接受输入参数,这样就可以在运行时将值传递给这些参数。可以使用参数执行下列操作:提供用于数据检索的搜索条件;提供要在数据存储区中插入、更新或删除的值;提供用于排序、分页和筛选的值。借助参数,使用少量自定义代码或不使用自定义代码就可筛选数据和创建主/从应用程序。
对于通过支持自动更新、插入和删除操作的数据绑定控件(如 GridView 或 FormView 控件)传递给数据源的值,也可以使用参数对其进行自定义。例如,可以使用参数对象对值进行强类型化,或从数据源中检索输出值。此外,参数化的查询可以防止 SQL 注入攻击,因此使得应用程序更加安全。
参数值可以从多种源中获取。通过 Parameter 对象,可以从 Web 服务器控件属性、Cookie、会话状态、QueryString 字段、用户配置文件属性及其他源中为参数化数据操作提供值。
一、参数类型
可以在 Web 应用程序中指定多种类型的参数对象。参数对象的类型确定参数值的来源。Parameter 类是所有参数对象的基类,其中包括所有参数类型通用的 Name、Type、Direction 和 DefaultValue 属性。通常使用 Parameter 基类指定数据源如何对从关联的数据绑定控件中获取的参数值(如 GridView 控件为 Update 或 Delete 操作传递的值)进行处理。
可以使用从 Parameter 类派生的参数类型来获取其他源中的值,如下表所述。
参数类型 |
说明 |
||
将参数设置为 ASP.NET 网页中的 Control 的属性值。使用 ControlID 属性指定 Control。使用 ControlParameter 对象的 PropertyName 属性指定提供参数值的属性的名称。 从 Control 派生的某些控件将定义 ControlValuePropertyAttribute,从而确定从中检索控件值的默认属性。只要没有显式设置 PropertyName 属性,就会使用默认属性。ControlValuePropertyAttribute 应用于以下控件属性: |
|||
将参数设置为 HttpCookie 对象的值。使用 CookieName 属性指定 HttpCookie 对象的名称。如果指定的 HttpCookie 对象不存在,则将使用 DefaultValue 属性的值作为参数值。
|
|||
将参数设置为 HTML 窗体字段的值。使用 FormField 属性指定 HTML 窗体字段的名称。如果指定的 HTML 窗体字段值不存在,则将使用 DefaultValue 属性的值作为参数值。 |
|||
将参数设置为当前用户配置文件 (Profile) 中的属性的值。使用 PropertyName 属性指定配置文件属性的名称。如果指定的配置文件属性不存在,则将使用 DefaultValue 属性的值作为参数值。 有关用户配置文件的信息,请参见 ASP.NET 配置文件属性概述。 |
|||
将参数设置为 QueryString 字段的值。使用 QueryStringField 属性指定 QueryString 字段的名称。如果指定的 QueryString 字段不存在,则将使用 DefaultValue 属性的值作为参数值。 |
|||
将参数设置为 Session 对象的值。使用 SessionField 属性指定 Session 对象的名称。如果指定的 Session 对象不存在,则将使用 DefaultValue 属性的值作为参数值。 |
1.1、将参数值强类型化
默认情况下,参数将被类型化为 Object。如果参数值是其他类型(如 DateTime 或 Int32),则可以显式创建 Parameter 对象,并将参数的 Type 属性设置为 TypeCode 值。
1.2、参数定向
默认情况下,参数为输入参数。在某些情况下,如在使用存储过程时,可能需要读取从数据源返回的值。如果是这样,可以设置 Parameter 对象的 Direction 属性,从而确保捕获数据源返回给 Web 应用程序的信息。受支持的参数定向设置为 Input、InputOutput、Output 和 ReturnValue。通常,需要处理数据源控件事件(如 Inserted 或 Updated 事件)以在完成数据操作后获取参数的返回值。
二、数据源控件和参数
数据源控件以不同的方式支持参数化操作。例如,LinqDataSource 控件允许替代 LINQ 查询子句中的运行时值。而通过 SqlDataSource 和 AccessDataSource 控件,可以在 SQL 语句(例如 SelectCommand)中指定参数占位符。ObjectDataSource 控件使用参数确定为执行特定的数据操作而调用的适当方法签名,如 SelectMethod。
通常,对于每个数据操作,数据源控件都包含一个参数集合。选择数据时,可以指定一个 SelectParameters 集合,更新数据项时,可以指定一个 UpdateParameters 集合,依此类推。然后将使用特定操作的参数集合内容为基础数据源提供值。插入、更新或删除数据时,数据源控件将为绑定字段创建参数,将它们与显式指定的参数集合(如果有)进行组合,然后将生成的集合传递到数据源。
2.1、下面的示例演示一个 SqlDataSource 控件,该控件根据 QueryString 字段中的值检索信息。
<asp:SqlDataSource id="Employees1" runat="server"
ConnectionString="<%$ ConnectionStrings:Northwind %>"
SelectCommand="SELECT EmployeeID, LastName, FirstName FROM Employees
WHERE EmployeeID = @empId">
<SelectParameters>
<asp:QueryStringParameter Name="empId" QueryStringField="empId" />
</SelectParameters>
</asp:SqlDataSource>
2.2、下面的示例演示一个 SqlDataSource 控件,该控件根据页上的其他控件的值检索信息。
<asp:DropDownList id="DropDownList1" runat="server"
autopostback="True">
<asp:listitem selected>Sales Representative</asp:listitem>
<asp:listitem>Sales Manager</asp:listitem>
<asp:listitem>Vice President, Sales</asp:listitem>
</asp:DropDownList></p>
<asp:SqlDataSource id="Employees" runat="server"
ConnectionString="<%$ ConnectionStrings:Northwind%>"
SelectCommand="SELECT LastName FROM Employees WHERE Title = @Title">
<SelectParameters>
<asp:ControlParameter Name="Title"
ControlID="DropDownList1"
PropertyName="SelectedValue"/>
</SelectParameters>
</asp:sqldatasource>
2.3、下面的示例演示了一个 LinqDataSource 控件,该控件可基于 QueryString 字段中的值创建 Where 子句。
<asp:LinqDataSource
ContextTypeName="NorthwindDataContext"
TableName="Employees"
Where="EmployeeID = @empID"
ID="LinqDataSource1"
runat="server">
<WhereParameters>
<asp:QueryStringParameter Type="Int32" DefaultValue="1"
Name="empID" QueryStringField="empID" />
</WhereParameters>
</asp:LinqDataSource>
2.4、下面的示例演示了一个 LinqDataSource 控件,该控件可基于用户选择的内容创建 Order By 子句。AutoGenerateOrderByClause 属性设置为 true。因此,LinqDataSource 控件将使用 OrderByParameters 集合中的参数创建 Order By 子句。
<asp:DropDownList AutoPostBack="true" ID="DropDownList1" runat="server">
<asp:ListItem Value="Category"></asp:ListItem>
<asp:ListItem Value="Price"></asp:ListItem>
</asp:DropDownList>
<asp:LinqDataSource
ContextTypeName="ExampleDataContext"
TableName="Products"
AutoGenerateOrderByClause="true"
ID="LinqDataSource1"
runat="server">
<OrderByParameters>
<asp:ControlParameter
ControlID="DropDownList1"
Type="String" />
</OrderByParameters>
</asp:LinqDataSource>
2.5、下面的示例演示了一个 SqlDataSource 控件,该控件可使用参数化命令查询和修改数据绑定控件中的数据。为了对参数值进行强类型化并指定输出参数,必须显式指定参数。
<%@ Page language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
void EmployeesDropDownList_OnSelectedIndexChanged(Object sender, EventArgs e)
{
EmployeeDetailsView.DataBind();
}
void EmployeeDetailsView_ItemUpdated(Object sender, DetailsViewUpdatedEventArgs e)
{
EmployeesDropDownList.DataBind();
EmployeesDropDownList.SelectedValue = e.Keys["EmployeeID"].ToString();
EmployeeDetailsView.DataBind();
}
void EmployeeDetailsView_ItemDeleted(Object sender, DetailsViewDeletedEventArgs e)
{
EmployeesDropDownList.DataBind();
}
void EmployeeDetailsSqlDataSource_OnInserted(Object sender, SqlDataSourceStatusEventArgs e)
{
System.Data.Common.DbCommand command = e.Command;
EmployeesDropDownList.DataBind();
EmployeesDropDownList.SelectedValue =
command.Parameters["@EmpID"].Value.ToString();
EmployeeDetailsView.DataBind();
}
</script>
<html >
<head runat="server">
<title>Northwind Employees</title>
</head>
<body>
<form id="form1" runat="server">
<h3>Northwind Employees</h3>
<table cellspacing="10">
<tr>
<td valign="top">
<asp:DropDownList ID="EmployeesDropDownList"
DataSourceID="EmployeesSqlDataSource"
DataValueField="EmployeeID"
DataTextField="FullName"
AutoPostBack="True"
OnSelectedIndexChanged="EmployeesDropDownList_OnSelectedIndexChanged"
RunAt="Server" />
</td>
<td valign="top">
<asp:DetailsView ID="EmployeeDetailsView"
DataSourceID="EmployeeDetailsSqlDataSource"
AutoGenerateRows="false"
AutoGenerateInsertbutton="true"
AutoGenerateEditbutton="true"
AutoGenerateDeletebutton="true"
DataKeyNames="EmployeeID"
Gridlines="Both"
OnItemUpdated="EmployeeDetailsView_ItemUpdated"
OnItemDeleted="EmployeeDetailsView_ItemDeleted"
RunAt="server">
<HeaderStyle backcolor="Navy"
forecolor="White"/>
<RowStyle backcolor="White"/>
<AlternatingRowStyle backcolor="LightGray"/>
font-size: