共用方式為


使用含有資料來源控制項的參數

更新:2007 年 11 月

ASP.NET 資料來源控制項能夠接受輸入參數,所以在執行階段可以將值傳遞給它們。您可以使用參數提供資料擷取的搜尋準則、提供資料存放區中要插入、更新或刪除的值,以及提供排序、分頁和篩選的值。使用參數可以讓您篩選資料,並且在使用少許或不使用自訂程式碼的情況下,建立主從式 (Master-Detail) 應用程式。

您也可以經由支援自動更新、插入和刪除作業的資料繫結控制項,例如 GridViewFormView 控制項,使用參數自訂傳遞至資料來源的值。例如,您可以使用參數物件強型別值,或是從資料來源擷取輸出值。此外,參數型查詢可以保護不受 SQL 插入攻擊,讓應用程式更安全。

您可以從各種來源取得參數值。Parameter 物件可以讓您從 Web 伺服器控制項屬性、Cookie、工作階段狀態、QueryString 欄位、使用者設定檔屬性和其他來源,提供值給參數型資料作業。

參數型別

您可以在 Web 應用程式中指定幾種參數物件型別。參數物件型別會判斷參數值的來源。Parameter 類別是所有參數物件的基底類別,並且包含所有參數型別通用的 NameTypeDirectionDefaultValue 屬性。通常會使用 Parameter 基底類別指定資料來源處理參數值的方式,而這些參數值是從關聯的資料繫結控制項取得,例如 GridView 控制項傳遞給 Update 或 Delete 作業的值。

您可以使用衍生自 Parameter 類別的參數型別取得其他來源的值,如同下表中所說明。

參數型別

說明

ControlParameter

設定 ASP.NET Web 網頁上 Control 的屬性值參數。您可以使用 ControlID 屬性指定 Control。使用 ControlParameter 物件的 PropertyName 屬性,指定提供參數值的屬性名稱。

某些衍生自 Control 的控制項會定義 ControlValuePropertyAttribute,以判斷從那個預設屬性擷取控制項的值。當並未明確設定 PropertyName 屬性時就會使用預設屬性。ControlValuePropertyAttribute 套用至下列控制項屬性:

CookieParameter

將參數設定為 HttpCookie 物件的值。使用 CookieName 屬性指定 HttpCookie 物件的名稱。如果指定的 HttpCookie 物件不存在,則 DefaultValue 屬性的值會用來做為參數值。

注意事項:
只支援單一數值的 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。您通常會需要處理資料來源控制項事件,例如 Inserted 或 Updated 事件,以便在資料作業完成後取得參數的傳回值。

資料來源控制項和參數

資料來源控制項以各種方式支援參數型作業。例如,LinqDataSource 控制項可讓您將執行階段值替換到 LINQ 查詢中的子句。SqlDataSourceAccessDataSource 控制項可以讓您在 SQL 陳述式中指定參數預留位置,例如 SelectCommandObjectDataSource 控制項會使用參數判斷呼叫特定資料作業所需的適當方法簽章,例如 SelectMethod。如需詳細資訊,請參閱使用參數和 SqlDataSource 控制項使用參數和 ObjectDataSource 控制項

資料來源控制項通常包含每個資料作業的參數集合。當選取資料時,您可以指定 SelectParameters 集合。當更新資料項目時,您可以指定 UpdateParameters 集合等等。特定動作的參數集合內容,就會用來提供值給基礎資料來源。當插入、更新或刪除資料時,資料來源控制項會建立繫結欄位的參數、使用明確指定的參數集合 (如果有的話) 將其組合,然後將結果集合傳遞給資料來源。如需資料來源控制項根據繫結控制項的資料,所建立之參數名稱和值的資訊,請參閱資料來源控制項如何建立資料繫結欄位的參數

下列程式碼範例,示範了根據 QueryString 欄位值擷取資訊的 SqlDataSource 控制項。

<asp:SqlDataSource id="Employees1" 
  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"  
    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" 
  ConnectionString="<%$ ConnectionStrings:Northwind%>"
  SelectCommand="SELECT LastName FROM Employees WHERE Title = @Title">
  <SelectParameters>
    <asp:ControlParameter Name="Title" 
      ControlID="DropDownList1"
      PropertyName="SelectedValue"/>
  </SelectParameters>
</asp:sqldatasource>

下列範例說明了根據 QueryString 欄位值建立 Where 子句的 LinqDataSource 控制項。

<asp:LinqDataSource 
      ContextTypeName="NorthwindDataContext" 
      TableName="Employees" 
      Where="EmployeeID = @empID" 
      ID="LinqDataSource1" 
      >
  <WhereParameters>
    <asp:QueryStringParameter Type="Int32" DefaultValue="1" 
        Name="empID" QueryStringField="empID" />
  </WhereParameters>
</asp:LinqDataSource>

下列範例說明了根據使用者選取範圍建立 Order By 子句的 LinqDataSource 控制項。AutoGenerateOrderByClause 屬性設定為 true。因此,LinqDataSource 控制項會使用 OrderByParameters 集合中的參數來建立 Order By 子句。

<asp:DropDownList AutoPostBack="true" ID="DropDownList1" >
    <asp:ListItem Value="Category"></asp:ListItem>
    <asp:ListItem Value="Price"></asp:ListItem>
</asp:DropDownList>
<asp:LinqDataSource 
    ContextTypeName="ExampleDataContext" 
    TableName="Products" 
    AutoGenerateOrderByClause="true"
    ID="LinqDataSource1" 
    >
    <OrderByParameters>
      <asp:ControlParameter
         ControlID="DropDownList1" 
         Type="String" />
    </OrderByParameters>
</asp:LinqDataSource>

下列範例示範使用參數型命令來查詢和修改資料繫結控制項資料的 SqlDataSource 控制項。參數已經明確指定,以便強型別參數值和指定輸出參數。

<%@ Page language="VB" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script >

  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 xmlns="http://www.w3.org/1999/xhtml" >
  <head >
    <title>Northwind Employees</title>
</head>
<body>
    <form id="form1" >

      <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"/>

                <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#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script >

  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 xmlns="http://www.w3.org/1999/xhtml" >
  <head >
    <title>Northwind Employees</title>
</head>
<body>
    <form id="form1" >

      <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"/>

                <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>

請參閱

工作

HOW TO:使用 LinqDataSource 控制項更新、插入和刪除資料

概念

使用參數和 SqlDataSource 控制項

使用參數和 ObjectDataSource 控制項

資料來源控制項如何建立資料繫結欄位的參數

資料來源控制項概觀

參考

Parameter