对数据源控件使用参数(MSDN)
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 属性的值作为参数值。 |
将参数值强类型化
默认情况下,参数将被类型化为 Object。如果参数值是其他类型(如 DateTime 或 Int32),则可以显式创建 Parameter 对象,并将参数的 Type 属性设置为 TypeCode 值。
参数定向
默认情况下,参数为输入参数。在某些情况下,如在使用存储过程时,可能需要读取从数据源返回的值。如果是这样,可以设置 Parameter 对象的 Direction 属性,从而确保捕获数据源返回给 Web 应用程序的信息。受支持的参数定向设置为 Input、InputOutput、Output 和 ReturnValue。通常,需要处理数据源控件事件(如 Inserted 或 Updated 事件)以在完成数据操作后获取参数的返回值。
数据源控件和参数
数据源控件以不同的方式支持参数化操作。例如,通过 SqlDataSource 和 AccessDataSource 控件,可以在 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 控件,该控件使用参数化命令查询和修改数据绑定控件中的数据。为了对参数值进行强类型化并指定输出参数,必须显式指定参数。
<%@ 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>