使用含有資料來源控制項的參數
更新:2007 年 11 月
ASP.NET 資料來源控制項能夠接受輸入參數,所以在執行階段可以將值傳遞給它們。您可以使用參數提供資料擷取的搜尋準則、提供資料存放區中要插入、更新或刪除的值,以及提供排序、分頁和篩選的值。使用參數可以讓您篩選資料,並且在使用少許或不使用自訂程式碼的情況下,建立主從式 (Master-Detail) 應用程式。
您也可以經由支援自動更新、插入和刪除作業的資料繫結控制項,例如 GridView 或 FormView 控制項,使用參數自訂傳遞至資料來源的值。例如,您可以使用參數物件強型別值,或是從資料來源擷取輸出值。此外,參數型查詢可以保護不受 SQL 插入攻擊,讓應用程式更安全。
您可以從各種來源取得參數值。Parameter 物件可以讓您從 Web 伺服器控制項屬性、Cookie、工作階段狀態、QueryString 欄位、使用者設定檔屬性和其他來源,提供值給參數型資料作業。
參數型別
您可以在 Web 應用程式中指定幾種參數物件型別。參數物件型別會判斷參數值的來源。Parameter 類別是所有參數物件的基底類別,並且包含所有參數型別通用的 Name、Type、Direction 和 DefaultValue 屬性。通常會使用 Parameter 基底類別指定資料來源處理參數值的方式,而這些參數值是從關聯的資料繫結控制項取得,例如 GridView 控制項傳遞給 Update 或 Delete 作業的值。
您可以使用衍生自 Parameter 類別的參數型別取得其他來源的值,如同下表中所說明。
參數型別 |
說明 |
---|---|
設定 ASP.NET Web 網頁上 Control 的屬性值參數。您可以使用 ControlID 屬性指定 Control。使用 ControlParameter 物件的 PropertyName 屬性,指定提供參數值的屬性名稱。 某些衍生自 Control 的控制項會定義 ControlValuePropertyAttribute,以判斷從那個預設屬性擷取控制項的值。當並未明確設定 PropertyName 屬性時就會使用預設屬性。ControlValuePropertyAttribute 套用至下列控制項屬性: |
|
將參數設定為 HttpCookie 物件的值。使用 CookieName 屬性指定 HttpCookie 物件的名稱。如果指定的 HttpCookie 物件不存在,則 DefaultValue 屬性的值會用來做為參數值。
注意事項:
只支援單一數值的 Cookie。
|
|
將參數設定為 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 事件,以便在資料作業完成後取得參數的傳回值。
資料來源控制項和參數
資料來源控制項以各種方式支援參數型作業。例如,LinqDataSource 控制項可讓您將執行階段值替換到 LINQ 查詢中的子句。SqlDataSource 和 AccessDataSource 控制項可以讓您在 SQL 陳述式中指定參數預留位置,例如 SelectCommand。ObjectDataSource 控制項會使用參數判斷呼叫特定資料作業所需的適當方法簽章,例如 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 控制項更新、插入和刪除資料