对数据源控件使用参数(MSDN)

ASP.NET 数据源控件可以接受输入参数,这样就可以在运行时将值传递给这些参数。可以使用参数提供数据检索的搜索条件,提供要在数据存储区中插入、更新或删除的值,以及提供要排序、分页和筛选的值。借助参数,使用少量自定义代码或不使用自定义代码就可筛选数据和创建主/从应用程序。

对于通过支持自动更新、插入和删除操作的数据绑定控件(如 GridViewFormView 控件)传递给数据源的值,也可以使用参数对其进行自定义。例如,可以使用参数对象对值进行强类型化,或从数据源中检索输出值。此外,参数化的查询可以防止 SQL 注入攻击,因此使得应用程序更加安全。

可以从各种源中获取参数值。通过 Parameter 对象,可以从 Web 服务器控件属性、Cookie、会话状态、QueryString 字段、用户配置文件属性及其他源中提供值给参数化数据操作。

参数类型

可以在 Web 应用程序中指定多种类型的参数对象。参数对象的类型确定参数值的来源。Parameter 类是所有参数对象的基类,其中包括所有参数类型通用的 NameTypeDirectionDefaultValue 属性。通常使用 Parameter 基类指定数据源如何对从关联的数据绑定控件中获取的参数值(如 GridView 控件为 UpdateDelete 操作传递的值)进行处理。

可以使用从 Parameter 类派生的参数类型来获取其他源中的值,如下表所述。

 
参数类型 说明

ControlParameter

将参数设置为 ASP.NET 网页中的 Control 的属性值。使用 ControlID 属性指定 Control。使用 ControlParameter 对象的 PropertyName 属性指定提供参数值的属性的名称。

Control 派生的某些控件将定义 ControlValuePropertyAttribute,从而确定从中检索控件值的默认属性。只要没有显式设置 PropertyName 属性,就会使用默认属性。ControlValuePropertyAttribute 应用于以下控件属性:

CookieParameter

将参数设置为 HttpCookie 对象的值。使用 CookieName 属性指定 HttpCookie 对象的名称。如果指定的 HttpCookie 对象不存在,则将使用 DefaultValue 属性的值作为参数值。

Note注意

仅支持单值 Cookie。

FormParameter

将参数设置为 HTML 窗体字段的值。使用 FormField 属性指定 HTML 窗体字段的名称。如果指定的 HTML 窗体字段值不存在,则将使用 DefaultValue 属性的值作为参数值。

ProfileParameter

将参数设置为当前用户配置文件 (Profile) 中的属性的值。使用 PropertyName 属性指定配置文件属性的名称。如果指定的配置文件属性不存在,则将使用 DefaultValue 属性的值作为参数值。

有关用户配置文件的信息,请参见 ASP.NET 配置文件属性

QueryStringParameter

将参数设置为 QueryString 字段的值。使用 QueryStringField 属性指定 QueryString 字段的名称。如果指定的 QueryString 字段不存在,则将使用 DefaultValue 属性的值作为参数值。

SessionParameter

将参数设置为 Session 对象的值。使用 SessionField 属性指定 Session 对象的名称。如果指定的 Session 对象不存在,则将使用 DefaultValue 属性的值作为参数值。

将参数值强类型化

默认情况下,参数将被类型化为 Object。如果参数值是其他类型(如 DateTimeInt32),则可以显式创建 Parameter 对象,并将参数的 Type 属性设置为 TypeCode 值。

参数定向

默认情况下,参数为输入参数。在某些情况下,如在使用存储过程时,可能需要读取从数据源返回的值。如果是这样,可以设置 Parameter 对象的 Direction 属性,从而确保捕获数据源返回给 Web 应用程序的信息。受支持的参数定向设置为 InputInputOutputOutputReturnValue。通常,需要处理数据源控件事件(如 InsertedUpdated 事件)以在完成数据操作后获取参数的返回值。

数据源控件和参数

数据源控件以不同的方式支持参数化操作。例如,通过 SqlDataSourceAccessDataSource 控件,可以在 SQL 语句(如 SelectCommand)中指定参数占位符。ObjectDataSource 控件使用参数确定为执行特定的数据操作而调用的适当方法签名,如 SelectMethod。有关更多信息,请参见对 SqlDataSource 控件使用参数对 ObjectDataSource 控件使用参数

通常,对于每个数据操作,数据源控件都包含一个参数集合。选择数据时,可以指定一个 SelectParameters 集合,更新数据项时,可以指定一个 UpdateParameters 集合,依此类推。然后将使用特定操作的参数集合内容为基础数据源提供值。插入、更新或删除数据时,数据源控件将为绑定字段创建参数,将它们与显式指定的参数集合(如果有)进行组合,然后将生成的集合传递到数据源。有关数据源控件基于绑定控件中的数据创建的参数名称和值的信息,请参见数据源控件如何为数据绑定字段创建参数

下面的示例演示一个 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>

下面的示例演示一个 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>

下面的代码示例演示一个 SqlDataSource 控件,该控件使用参数化命令查询和修改数据绑定控件中的数据。为了对参数值进行强类型化并指定输出参数,必须显式指定参数。

Visual Basic
<%@ Page language="VB" %>
<script RunAt="server">
Sub EmployeesDropDownList_OnSelectedIndexChanged(sender As Object, e As EventArgs)
EmployeeDetailsView.DataBind()
End Sub
Sub EmployeeDetailsView_ItemUpdated(sender As Object, e As DetailsViewUpdatedEventArgs)
EmployeesDropDownList.DataBind()
EmployeesDropDownList.SelectedValue = e.Keys("EmployeeID").ToString()
EmployeeDetailsView.DataBind()
End Sub
Sub EmployeeDetailsView_ItemDeleted(sender As Object, e As DetailsViewDeletedEventArgs)
EmployeesDropDownList.DataBind()
End Sub
Sub EmployeeDetailsSqlDataSource_OnInserted(sender As Object, e As SqlDataSourceStatusEventArgs)
Dim command As System.Data.Common.DbCommand = e.Command
EmployeesDropDownList.DataBind()
EmployeesDropDownList.SelectedValue = _
command.Parameters("@EmpID").Value.ToString()
EmployeeDetailsView.DataBind()
End Sub
</script>
<html>
<body>
<form 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"
Size="10"
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"/>
<EditRowStyle backcolor="LightCyan"/>
<Fields>
<asp:BoundField DataField="EmployeeID" HeaderText="Employee ID" InsertVisible="False" ReadOnly="true"/>
<asp:BoundField DataField="FirstName"  HeaderText="First Name"/>
<asp:BoundField DataField="LastName"   HeaderText="Last Name"/>
<asp:BoundField DataField="Address"    HeaderText="Address"/>
<asp:BoundField DataField="City"       HeaderText="City"/>
<asp:BoundField DataField="Region"     HeaderText="Region"/>
<asp:BoundField DataField="PostalCode" HeaderText="Postal Code"/>
</Fields>
</asp:DetailsView>
</td>
</tr>
</table>
<asp:SqlDataSource ID="EmployeesSqlDataSource"
SelectCommand="SELECT EmployeeID, LastName + ', ' + FirstName AS FullName FROM Employees" 
Connectionstring="<%$ ConnectionStrings:NorthwindConnection %>"
RunAt="server">
</asp:SqlDataSource>
<asp:SqlDataSource ID="EmployeeDetailsSqlDataSource"
SelectCommand="SELECT EmployeeID, LastName, FirstName, Address, City, Region, PostalCode
FROM Employees WHERE EmployeeID = @EmpID"
InsertCommand="INSERT INTO Employees(LastName, FirstName, Address, City, Region, PostalCode)
VALUES (@LastName, @FirstName, @Address, @City, @Region, @PostalCode);
SELECT @EmpID = SCOPE_IDENTITY()"
UpdateCommand="UPDATE Employees SET LastName=@LastName, FirstName=@FirstName, Address=@Address,
City=@City, Region=@Region, PostalCode=@PostalCode
WHERE EmployeeID=@EmployeeID"
DeleteCommand="DELETE Employees WHERE EmployeeID=@EmployeeID"
ConnectionString="<%$ ConnectionStrings:NorthwindConnection %>"
OnInserted="EmployeeDetailsSqlDataSource_OnInserted"
RunAt="server">
<SelectParameters>
<asp:ControlParameter ControlID="EmployeesDropDownList" PropertyName="SelectedValue"
Name="EmpID" Type="Int32" DefaultValue="0" />
</SelectParameters>
<InsertParameters>
<asp:Parameter Name="LastName"   Type="String" />
<asp:Parameter Name="FirstName"  Type="String" />
<asp:Parameter Name="Address"    Type="String" />
<asp:Parameter Name="City"       Type="String" />
<asp:Parameter Name="Region"     Type="String" />
<asp:Parameter Name="PostalCode" Type="String" />
<asp:Parameter Name="EmpID" Direction="Output" Type="Int32" DefaultValue="0" />
</InsertParameters>
<UpdateParameters>
<asp:Parameter Name="LastName"   Type="String" />
<asp:Parameter Name="FirstName"  Type="String" />
<asp:Parameter Name="Address"    Type="String" />
<asp:Parameter Name="City"       Type="String" />
<asp:Parameter Name="Region"     Type="String" />
<asp:Parameter Name="PostalCode" Type="String" />
<asp:Parameter Name="EmployeeID" Type="Int32" DefaultValue="0" />
</UpdateParameters>
<DeleteParameters>
<asp:Parameter Name="EmployeeID" Type="Int32" DefaultValue="0" />
</DeleteParameters>
</asp:SqlDataSource>
</form>
</body>
</html>
<%@ Page language="C#" %>
<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>
<body>
<form 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"
Size="10"
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"/>
<EditRowStyle backcolor="LightCyan"/>
<Fields>
<asp:BoundField DataField="EmployeeID" HeaderText="Employee ID" InsertVisible="False" ReadOnly="true"/>
<asp:BoundField DataField="FirstName"  HeaderText="First Name"/>
<asp:BoundField DataField="LastName"   HeaderText="Last Name"/>
<asp:BoundField DataField="Address"    HeaderText="Address"/>
<asp:BoundField DataField="City"       HeaderText="City"/>
<asp:BoundField DataField="Region"     HeaderText="Region"/>
<asp:BoundField DataField="PostalCode" HeaderText="Postal Code"/>
</Fields>
</asp:DetailsView>
</td>
</tr>
</table>
<asp:SqlDataSource ID="EmployeesSqlDataSource"
SelectCommand="SELECT EmployeeID, LastName + ', ' + FirstName AS FullName FROM Employees"
Connectionstring="<%$ ConnectionStrings:NorthwindConnection %>"
RunAt="server">
</asp:SqlDataSource>
<asp:SqlDataSource ID="EmployeeDetailsSqlDataSource"
SelectCommand="SELECT EmployeeID, LastName, FirstName, Address, City, Region, PostalCode
FROM Employees WHERE EmployeeID = @EmpID"
InsertCommand="INSERT INTO Employees(LastName, FirstName, Address, City, Region, PostalCode)
VALUES (@LastName, @FirstName, @Address, @City, @Region, @PostalCode);
SELECT @EmpID = SCOPE_IDENTITY()"
UpdateCommand="UPDATE Employees SET LastName=@LastName, FirstName=@FirstName, Address=@Address,
City=@City, Region=@Region, PostalCode=@PostalCode
WHERE EmployeeID=@EmployeeID"
DeleteCommand="DELETE Employees WHERE EmployeeID=@EmployeeID"
ConnectionString="<%$ ConnectionStrings:NorthwindConnection %>"
OnInserted="EmployeeDetailsSqlDataSource_OnInserted"
RunAt="server">
<SelectParameters>
<asp:ControlParameter ControlID="EmployeesDropDownList" PropertyName="SelectedValue"
Name="EmpID" Type="Int32" DefaultValue="0" />
</SelectParameters>
<InsertParameters>
<asp:Parameter Name="LastName"   Type="String" />
<asp:Parameter Name="FirstName"  Type="String" />
<asp:Parameter Name="Address"    Type="String" />
<asp:Parameter Name="City"       Type="String" />
<asp:Parameter Name="Region"     Type="String" />
<asp:Parameter Name="PostalCode" Type="String" />
<asp:Parameter Name="EmpID" Direction="Output" Type="Int32" DefaultValue="0" />
</InsertParameters>
<UpdateParameters>
<asp:Parameter Name="LastName"   Type="String" />
<asp:Parameter Name="FirstName"  Type="String" />
<asp:Parameter Name="Address"    Type="String" />
<asp:Parameter Name="City"       Type="String" />
<asp:Parameter Name="Region"     Type="String" />
<asp:Parameter Name="PostalCode" Type="String" />
<asp:Parameter Name="EmployeeID" Type="Int32" DefaultValue="0" />
</UpdateParameters>
<DeleteParameters>
<asp:Parameter Name="EmployeeID" Type="Int32" DefaultValue="0" />
</DeleteParameters>
</asp:SqlDataSource>
</form>
</body>
</html>
posted on 2006-09-26 09:58  头发乱了  阅读(1072)  评论(0编辑  收藏  举报