Erstellen von Parametern für datengebundene Felder durch ein Datenquellensteuerelement
Aktualisiert: November 2007
Wenn Sie ein datengebundenes Steuerelement, z. B. ein GridView-Steuerelement, ein DetailsView-Steuerelement oder ein FormView-Steuerelement zusammen mit einem ASP.NET-Datenquellensteuerelement verwenden, kann das datengebundene Steuerelement auf Grundlage seiner gebundenen Felder Parameternamen und -werte an das Datenquellensteuerelement übergeben. Das Datenquellensteuerelement fügt dann die Feldnamen und -werte in die Parameterauflistung für die Auswahl- oder Aktualisierungsoperationen ein. Weitere Informationen finden Sie unter Verwenden von Parametern mit dem SqlDataSource-Steuerelement und Verwenden von Parametern mit dem ObjectDataSource-Steuerelement.
Übergeben von Wörterbüchern an Datenquellensteuerelemente
Wenn ein datengebundenes Steuerelement eine Operation von dem Datenquellensteuerelement anfordert, übergibt es eine oder mehrere IDictionary-Auflistungen, die die Parameternamen und -werte für die angeforderte Datenoperation enthalten. Die Werte der Name-Wert-Paare im Wörterbuch sind von untergeordneten Steuerelementen abgeleitet. Bei einem Aktualisierungsvorgang beispielsweise liest das datengebundene Steuerelement Parameterwerte aus TextBox-Steuerelementen oder CheckBox-Steuerelementen, die im Bearbeitungsmodus angezeigt werden. Die Namen für die Name-Wert-Paare stammen von den Namen der Felder, die an die untergeordneten Steuerelemente gebunden sind, sowie von den in der DataKeyNames-Eigenschaft angegebenen Feldnamen. Bei einem Aktualisierungs- oder Löschvorgang kann das datengebundene Steuerelement auch ein Wörterbuch übergeben, das die Originalwerte des Datensatzes enthält.
Name-Wert-Paare werden mittels der folgenden IDictionary-Auflistungen übergeben:
Values-Auflistung: Wird für einen Einfügevorgang übergeben. Enthält die Name-Wert-Paare für einen neuen Datensatz. Feldnamen und -werte für die Values-Auflistung werden den untergeordneten Steuerelementen in einem InsertItemTemplate oder den gebundenen Feldern in einem DetailsView-Steuerelement entnommen, dessen InsertVisible-Eigenschaft auf true festgelegt ist.
Keys-Auflistung: Wird für Aktualisierungs- und Löschvorgänge übergeben. Enthält den oder die Primärschlüssel für den Datensatz, der aktualisiert oder gelöscht wird. Wenn die Schlüsselfelder in der Datenquelle geändert werden können, enthält die Keys-Auflistung außerdem die Originalwerte der Schlüsselfelder. Wenn ein datengebundenes Steuerelement mit Daten aus dem Datenquellensteuerelement aufgefüllt wird, verwaltet es diese Daten im Ansichtszustand. Wenn ein Aktualisierungs- oder Löschvorgang angefordert wird, wird die Keys-Auflistung mit vorher im Ansichtszustand gespeicherten Werten aufgefüllt. Wenn die EnableViewState-Eigenschaft des datengebundenen Steuerelements auf false festgelegt ist, wird die Keys-Auflistung für den Aktualisierungs- oder Löschvorgang nicht aufgefüllt.
NewValues-Auflistung: Wird für einen Aktualisierungsvorgang übergeben. Enthält die Name-Wert-Paare mit neuen Werten für das aktualisierte Element, einschließlich neuer Werte für aktualisierbare Schlüsselfelder. Feldnamen und -werte für die NewValues-Auflistung sind den untergeordneten Steuerelementen in einem EditItemTemplate oder den gebundenen Feldern in einem DetailsView-Steuerelement entnommen, dessen ReadOnly-Eigenschaft auf false festgelegt ist.
OldValues-Auflistung: Wird für Aktualisierungs- oder Löschvorgänge übergeben. Enthält die ursprünglichen Werte für den Datensatz, die für die Prüfung auf vollständige Parallelität verwendet werden sollen. (Weitere Informationen über die Prüfung auf vollständige Parallelität finden Sie in den Informationen zur ConflictDetection -Eigenschaft des Datenquellensteuerelements, mit dem Sie arbeiten.) Werte für Schlüsselfelder, die von der DataKeyNames -Eigenschaft identifiziert werden, sind nicht in der OldValues-Auflistung enthalten. Schlüsselfeldnamen und -werte sind nur in der Keys-Auflistung enthalten. Wenn ein datengebundenes Steuerelement mit Daten aus dem Datenquellensteuerelement aufgefüllt wird, verwaltet es diese Daten im Ansichtszustand. Wenn ein Aktualisierungs- oder Löschvorgang angefordert wird, wird die OldValues-Auflistung mit vorher im Ansichtszustand gespeicherten Werten aufgefüllt. Wenn die EnableViewState-Eigenschaft des datengebundenen Steuerelements auf false festgelegt ist, wird die OldValues-Auflistung für den Aktualisierungs- oder Löschvorgang nicht aufgefüllt.
Sie können auf alle diese Auflistungen zugreifen, indem Sie die Argumente verwenden, die mit dem Ereignis des datengebundenen Steuerelements für die angeforderte Operation übergeben werden. So bietet beispielsweise im RowUpdating-Ereignis des GridView-Steuerelements die GridViewUpdateEventArgs-Klasse Zugriff auf die NewValues-Auflistung.
Parameternamen
Das Datenquellensteuerelement erstellt automatisch Parameter für die Werte, die in den IDictionary-Auflistungen übergeben werden. Bei einem Einfügevorgang füllt das Datenquellensteuerelement seine InsertParameters-Auflistung mit Werten aus den Name-Wert-Paaren in der Values-Auflistung auf. Bei einem Aktualisierungsvorgang füllt das Datenquellensteuerelement seine UpdateParameters-Auflistung mit Werten aus den Name-Wert-Paaren in der Keys-Auflistung, der NewValues-Auflistung und der OldValues-Auflistung auf. Bei einem Löschvorgang füllt das Datenquellensteuerelement seine DeleteParameters-Auflistung mit Werten aus den Name-Wert-Paaren in der Keys-Auflistung und der OldValues-Auflistung auf.
Die OldValues-Auflistung wird nicht standardmäßig aufgefüllt. Sie wird nur aufgefüllt, wenn die ConflictDetection -Eigenschaft des Datenquellensteuerelements auf CompareAllValues festgelegt ist.
Für eine Aktualisierung oder einen Löschvorgang werden standardmäßig nur Parameter für aktuell gebundene Werte erstellt. Wenn Sie sowohl Zugriff auf die aktuellen als auch auf die ursprünglichen gebundenen Werte benötigen (z. B. in einem Szenario mit vollständiger Parallelität), können Sie das Datenquellensteuerelement anweisen, Parameter sowohl für die aktuellen als auch für die ursprünglichen Werte zu erzeugen. Dazu müssen Sie eine Namenskonvention für die Parameter erstellen, in der die ursprünglichen Werte enthalten sind. Das Format der Parameter für die ursprünglichen Werte wird von der OldValuesParameterFormatString-Eigenschaft bestimmt. Legen Sie die OldValuesParameterFormatString-Eigenschaft auf eine Zeichenfolge fest, die "{0}" als Platzhalter für den Namen des Felds enthält. Wenn Sie beispielsweise das SqlDataSource-Steuerelement verwenden und die OldValuesParameterFormatString-Eigenschaft auf "old_{0}" festlegen, erhalten die Parameter mit den ursprünglichen Werten einen Feldnamen mit dem Präfix "@old_". (Das SqlDataSource-Steuerelement hängt am Anfang aller Parameternamen ein "@"-Zeichen an.) Gehen wir von einem Aktualisierungsvorgang aus, der ein Feld mit dem Namen LastModifiedDate einschließt. Der aktuelle Wert des Felds wird im Values-Wörterbuch, der ursprüngliche Wert des Felds im OldValues-Wörterbuch übergeben. Zur Übergabe des aktuellen Werts wird ein Parameter mit dem Namen @LastModifiedDate erstellt und zur Übergabe des ursprünglichen Werts ein Parameter mit dem Namen @old\_LastModifiedDate. Danach können beide Parameter zur Unterscheidung zwischen dem aktuellen und dem ursprünglichen Wert in einer SQL-Anweisung verwendet werden, wie das folgende Beispiel zeigt:
UPDATE Table1 SET LastModifiedDate = @LastModifiedDate
WHERE Key = @Key AND LastModifiedDate = @old_LastModifiedDate
Sie müssen nicht direkt auf die IDictionary-Auflistungen von Name-Wert-Paaren zugreifen. Die automatisch generierten Parameternamen können einfach in die SQL-Anweisungen aufgenommen werden (wenn die Datenquelle benannte Parameter unterstützt) oder als die Namen der Parameter für die Datenmethoden in einem Geschäftsobjekt dienen, wenn Sie mit einem ObjectDataSource-Steuerelement auf ein Geschäftsobjekt zugreifen.
Wahlweise können Sie in der UpdateParameters-Auflistung, der InsertParameters-Auflistung oder der DeleteParameters-Auflistung des Datenquellensteuerelements Parameter-Objekte definieren, um die vom datengebundenen Steuerelement übergebenen Werte anzupassen. Sie haben die Möglichkeit, Parameter-Objekte zu erstellen, um den Wert stark zu typisieren oder um einen Standardwert für den Fall anzugeben, dass null übergeben wird.
Das folgende Codebeispiel zeigt ein an ein SqlDataSource-Steuerelement gebundenes DetailsView-Steuerelement. Die Eigenschaften InsertCommand, UpdateCommand und DeleteCommand des SqlDataSource-Steuerelements verwenden die Parameternamen, die automatisch vom SqlDataSource-Steuerelement generiert werden. Die Parameterwerte werden auf Grundlage des Keys-Wörterbuchs und des NewValues-Wörterbuchs aufgefüllt. Das OldValues-Wörterbuch wird nicht verwendet, da die ConflictDetection-Eigenschaft auf ConflictOptions.OverwriteChanges (Standard) festgelegt wurde.
<%@ 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
Konzepte
Verwenden von Parametern für Datenquellen-Steuerelemente
Verwenden von Parametern mit dem SqlDataSource-Steuerelement
Verwenden von Parametern mit dem ObjectDataSource-Steuerelement