Verwenden von Parametern für Datenquellen-Steuerelemente
Aktualisiert: November 2007
ASP.NET-Datenquellen-Steuerelemente können Eingabeparameter verwenden. Dies ermöglicht die Übergabe von Werten an das jeweilige Steuerelement zur Laufzeit. Parameter können beispielsweise verwendet werden, um Suchkriterien zum Abrufen von Daten zu übermitteln oder um Werte zu übermitteln, die in einen Datenspeicher eingefügt, aktualisiert oder aus dem Datenspeicher gelöscht werden sollen. Ebenso können Parameter verwendet werden, um Werte zu übermitteln, die für das Sortieren, Paging oder Filtern erforderlich sind. Mithilfe von Parametern können Sie Daten filtern und Master-Detail-Anwendungen mit wenig oder ganz ohne benutzerdefinierten Code erstellen.
Sie können mit Parametern auch die Werte anpassen, die von einem datengebundenen Steuerelement an eine Datenquelle übergeben werden, z. B. ein GridView-Steuerelement oder ein FormView-Steuerelement, das automatische Aktualisierungs-, Einfüge- und Löschvorgänge unterstützt. Sie können beispielsweise Parameterobjekte verwenden, um Werte stark zu typisieren oder Ausgabewerte aus der Datenquelle abzurufen. Zusätzlich können parametrisierte Abfragen die Sicherheit einer Anwendung steigern, da sie vor SQL-Injection-Angriffen schützen.
Parameterwerte können aus den unterschiedlichsten Quellen abgerufen werden. Mit Parameter-Objekten können Sie Werte an parametrisierte Datenoperationen übergeben, die in Eigenschaften von Webserversteuerelementen, Cookies, dem Sitzungszustand, QueryString-Feldern, Benutzerprofileigenschaften und anderen Quellen enthalten sind.
Parametertypen
Sie können in der Webanwendung mehrere Parameterobjekttypen angeben. Anhand des Typs des Parameterobjekts wird bestimmt, aus welcher Quelle der Parameterwert stammt. Die Parameter-Klasse ist die Basisklasse aller Parameterobjekte. Sie enthält unter anderem die Name-Eigenschaft, die Type-Eigenschaft, die Direction-Eigenschaft und die DefaultValue-Eigenschaft, über die alle Parametertypen verfügen. In der Regel wird die Parameter-Basisklasse verwendet, um festzulegen, wie eine Datenquelle Parameterwerte behandeln soll, die sie von einem zugeordneten datengebundenen Steuerelement erhält. Dies können zum Beispiel die Werte sein, die von einem GridView-Steuerelement zur Verwendung bei einer Update-Operation oder einer Delete-Operation übergeben werden.
Zum Abrufen von Werten aus anderen Quellen können Sie die in der Tabelle beschriebenen, von der Parameter-Klasse abgeleiteten Parametertypen verwenden.
Parametertyp |
Beschreibung |
---|---|
Legt einen Parameter auf den Eigenschaftenwert eines Control in einer ASP.NET-Webseite fest. Das Control wird mithilfe der ControlID-Eigenschaft angegeben. Der Name der Eigenschaft, die den Parameterwert liefert, wird mithilfe der PropertyName-Eigenschaft des ControlParameter-Objekts angegeben. Einige Steuerelemente, die von Control abgeleitet sind, definieren ein ControlValuePropertyAttribute. Dieses Attribut bestimmt die Standardeigenschaft, aus der der Wert des Steuerelements abgerufen wird. Die Standardeigenschaft wird immer dann verwendet, wenn die PropertyName-Eigenschaft nicht explizit festgelegt wird. Das ControlValuePropertyAttribute wird auf folgende Steuerelementeigenschaften angewendet: |
|
Legt einen Parameter auf den Wert eines HttpCookie-Objekts fest. Der Name des HttpCookie-Objekts wird mithilfe der CookieName-Eigenschaft angegeben. Falls das angegebene HttpCookie-Objekt nicht vorhanden ist, wird der Wert der DefaultValue-Eigenschaft als Parameterwert verwendet.
Hinweis:
Es werden nur einwertige Cookies unterstützt.
|
|
Legt einen Parameter auf den Wert eines HTML-Formularfelds fest. Der Name des HTML-Formularfelds wird mithilfe der FormField-Eigenschaft angegeben. Falls das angegebene HTML-Formularfeld nicht vorhanden ist, wird der Wert der DefaultValue-Eigenschaft als Parameterwert verwendet. |
|
Legt einen Parameter auf den Wert einer Eigenschaft des aktuellen Benutzerprofils (Profile) fest. Der Name der Profileigenschaft wird mithilfe der PropertyName-Eigenschaft angegeben. Falls die angegebene Profileigenschaft nicht vorhanden ist, wird der Wert der DefaultValue-Eigenschaft als Parameterwert verwendet. Informationen zu Benutzerprofilen finden Sie unter Übersicht über ASP.NET-Profileigenschaften. |
|
Legt einen Parameter auf den Wert eines QueryString-Felds fest. Der Name des QueryString-Felds wird mithilfe der QueryStringField-Eigenschaft angegeben. Falls das angegebene QueryString-Feld nicht vorhanden ist, wird der Wert der DefaultValue-Eigenschaft als Parameterwert verwendet. |
|
Legt einen Parameter auf den Wert eines Session-Objekts fest. Der Name des Session-Objekts wird mithilfe der SessionField-Eigenschaft angegeben. Falls das angegebene Session-Objekt nicht vorhanden ist, wird der Wert der DefaultValue-Eigenschaft als Parameterwert verwendet. |
Starkes Typisieren von Parameterwerten
Standardmäßig werden Parameter als Object typisiert. Wenn ein Parameterwert von einem anderen Typ ist, z. B. DateTime oder Int32, können Sie explizit Parameter-Objekte erstellen und die Type-Eigenschaft des Parameters auf einen TypeCode-Wert festlegen.
Parameterrichtung
Parameter sind standardmäßig Eingabeparameter. In einigen Fällen, z. B. bei der Verwendung gespeicherter Prozeduren, kann es vorkommen, dass Sie einen von einer Datenquelle zurückgegebenen Wert lesen müssen. In diesem Fall können Sie die Direction-Eigenschaft des Parameter-Objekts festlegen, um sicherzustellen, dass Sie die Informationen erfassen, die die Datenquelle an die Webanwendung zurückgibt. Die unterstützten Parameterrichtungseinstellungen sind Input, InputOutput, Output und ReturnValue. In der Regel wird ein Ereignis eines Datenquellensteuerelements behandelt, z. B. ein Inserted-Ereignis oder ein Updated-Ereignis, um den Rückgabewert des Parameters abzurufen, nachdem die Datenoperation abgeschlossen wurde.
Datenquellensteuerelemente und Parameter
Datenquellensteuerelemente unterstützen parametrisierte Operationen auf unterschiedliche Art und Weise. Mithilfe des LinqDataSource-Steuerelements können Sie Laufzeitwerte in eine Klausel in einer LINQ-Abfrage umwandeln. Mithilfe der Steuerelemente SqlDataSource und AccessDataSource können Sie Parameterplatzhalter in einer SQL-Anweisung angeben, z. B. in der SelectCommand-Anweisung. Das ObjectDataSource-Steuerelement verwendet Parameter, um die geeignete Methodensignatur für den Aufruf einer bestimmten Datenoperation zu bestimmen, z. B. SelectMethod. Weitere Informationen finden Sie unter Verwenden von Parametern mit dem SqlDataSource-Steuerelement und Verwenden von Parametern mit dem ObjectDataSource-Steuerelement.
Datenquellensteuerelemente enthalten im Allgemeinen eine Parameterauflistung für jede Datenoperation. Für die Auswahl von Daten können Sie eine SelectParameters-Auflistung angeben, für die Aktualisierung eines Datenelements können Sie eine UpdateParameters-Auflistung angeben usw. Anschließend werden die Inhalte der Parameterauflistung für eine bestimmte Aktion verwendet, um die zugrunde liegende Datenquelle mit Werten zu versorgen. Beim Einfügen, Aktualisieren oder Löschen von Daten erstellt das Datenquellensteuerelement Parameter für gebundene Felder, kombiniert diese mit der explizit angegebenen Parameterauflistung (falls vorhanden) und übergibt die daraus entstehende Auflistung an die Datenquelle. Informationen zu Parameternamen und -werten, die ein Datenquellensteuerelement basierend auf den Daten in einem gebundenen Steuerelement erstellt, finden Sie unter Erstellen von Parametern für datengebundene Felder durch ein Datenquellensteuerelement.
Das folgende Beispiel zeigt ein SqlDataSource-Steuerelement, das Informationen abruft, die auf dem Wert in einem QueryString-Feld basieren.
<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>
Das folgende Beispiel zeigt ein SqlDataSource-Steuerelement, das Informationen abruft, die auf einem Wert basieren, der in einem anderen Steuerelement auf der Seite enthalten ist.
<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>
Das folgende Beispiel zeigt ein LinqDataSource-Steuerelement, das die Where-Klausel anhand eines Werts aus einem QueryString-Feld erstellt.
<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>
Das folgende Beispiel zeigt ein LinqDataSource-Steuerelement, das die Order By-Klausel basierend auf einer Auswahl des Benutzers erstellt. Die AutoGenerateOrderByClause-Eigenschaft ist auf true festgelegt. Aus diesem Grund erstellt das LinqDataSource-Steuerelement die Order By-Klausel mit den Parametern in der OrderByParameters-Auflistung.
<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>
Das folgende Beispiel zeigt ein SqlDataSource-Steuerelement, das parametrisierte Befehle verwendet, um Daten eines datengebundenen Steuerelements abzufragen und zu ändern. Die Parameter werden explizit angegeben, um die Parameterwerte stark zu typisieren und die Ausgabeparameter angeben zu können.
<%@ 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>
Siehe auch
Aufgaben
Gewusst wie: Aktualisieren, Einfügen und Löschen von Daten mit dem LinqDataSource-Steuerelement
Konzepte
Verwenden von Parametern mit dem SqlDataSource-Steuerelement
Verwenden von Parametern mit dem ObjectDataSource-Steuerelement
Erstellen von Parametern für datengebundene Felder durch ein Datenquellensteuerelement
Übersicht über Datenquellensteuerelemente