Bearbeiten von Daten mithilfe des SqlDataSource-Steuerelements
Aktualisiert: November 2007
Sie können das SqlDataSource-Steuerelement verwenden, um Daten in einer Datenbank zu ändern. Am häufigsten wird das SqlDataSource-Steuerelement in Aktualisierungsszenarios verwendet, in denen Daten abgerufen und mithilfe eines datengebundenen Webserversteuerelements, z. B. GridView, DetailsView oder FormView, angezeigt werden. Dazu konfigurieren Sie das datengebundene Steuerelement und das SqlDataSource für die Aktualisierung der Daten. Die meisten datengebundenen Steuerelemente können für die Unterstützung von Einfüge-, Aktualisierungs- und Löschvorgängen konfiguriert werden, wobei sie die zu aktualisierenden Daten an das Datenquellensteuerelement übergeben. Anschließend überträgt das Datenquellensteuerelement die aktualisierten Werte mithilfe einer SQL-Anweisung oder einer gespeicherten Prozedur in die Datenbank.
Das SqlDataSource-Steuerelement wurde für die Aktualisierung jeweils eines Datensatzes entworfen. Wenn Sie Batchaktualisierungen durchführen möchten, müssen Sie eine explizite Schleifenlogik in die ASP.NET-Anwendung integrieren.
Die Grundlagen
Um mithilfe des SqlDataSource-Steuerelements Daten in einer Datenbank zu ändern, müssen Sie mindestens die folgenden Eigenschaften festlegen:
ProviderName Legen Sie die Eigenschaft auf den Namen des ADO.NET-Anbieters fest, der die verwendete Datenbank darstellt.
ConnectionString Legen Sie die Eigenschaft auf eine für die Datenbank gültige Verbindungszeichenfolge fest.
SqlDataSource-Befehlseigenschaften Legen Sie die Eigenschaft auf SQL-Anweisungen fest, die Daten in der Datenbank ändern.
In den folgenden Abschnitten werden diese Eigenschaften ausführlicher beschrieben.
Anbietername
Legen Sie die ProviderName-Eigenschaft auf den Namen des ADO.NET-Anbieters für den Datenbanktyp fest, in dem die Daten gespeichert sind. Unter anderem kann dies einer der folgenden Anbieter sein:
Wenn Sie Microsoft SQL Server verwenden, legen Sie die ProviderName-Eigenschaft auf "System.Data.SqlClient" fest. Dies ist der Standardanbieter, wenn Sie keinen anderen Anbieter angeben.
Wenn Sie eine Oracle-Datenbank verwenden, legen Sie die ProviderName-Eigenschaft auf "System.Data.OracleClient" fest.
Wenn Sie eine OLE DB-Datenquelle verwenden, legen Sie die ProviderName-Eigenschaft auf "System.Data.OleDb" fest.
Wenn Sie eine ODBC-Datenquelle verwenden, legen Sie die ProviderName-Eigenschaft auf "System.Data.Odbc" fest.
Verbindungszeichenfolge
Legen Sie die ConnectionString-Eigenschaft fest, um eine Verbindung mit einer bestimmten Datenbank herzustellen. Es wird empfohlen, dass Sie die Verbindungszeichenfolgen im ConnectionStrings-Element in der Konfigurationsdatei der Anwendung speichern. Sie können dann auf die gespeicherten Verbindungszeichenfolgen zugreifen, indem Sie im Markup des Steuerelements die <%$ ConnectionStrings:connectionStringName %>-Syntax verwenden. Die Verbindungszeichenfolge muss eine gültige Verbindungszeichenfolge für den angegebenen ProviderName sein.
Befehle
Das SqlDataSource-Steuerelement verfügt über drei Befehlseigenschaften, die eine SQL-Anweisung zum Ändern der Daten enthalten können: die InsertCommand-Eigenschaft, die UpdateCommand-Eigenschaft und die DeleteCommand-Eigenschaft. Die Befehlseigenschaften können auf eine SQL-Anweisung oder auf den Namen einer gespeicherten Prozedur festgelegt werden, sofern die Datenquelle gespeicherte Prozeduren unterstützt. Die tatsächliche Syntax der SQL-Anweisung hängt vom Datenschema und von der verwendeten Datenbank ab. Die Anweisung kann Parameter beinhalten, wenn die Datenquelle Parameter unterstützt.
Hinweis: |
---|
Die von Ihnen für die Befehlseigenschaft festgelegte Anweisung ist die gleiche Anweisung, die Sie für die CommandText-Eigenschaft eines ADO.NET-IDbCommand-Objekts festlegen, wenn Sie ADO.NET-Code für die Datenbearbeitung schreiben. |
Die in der UpdateCommand-Eigenschaft enthaltene SQL-Anweisung wird jedes Mal ausgeführt, wenn die Update-Methode aufgerufen wird. Die Update-Methode wird von datengebundenen Steuerelementen implizit aufgerufen, wenn ein Benutzer in einem GridView-Steuerelement, einem FormView-Steuerelement oder einem DetailsView-Steuerelement auf die Schaltfläche Aktualisieren klickt. Sie können diese Methode jedoch auch aus dem eigenen Code heraus explizit aufrufen. Die Insert-Methode und die Delete-Methode des SqlDataSource-Steuerelements funktionieren auf dieselbe Art und Weise.
Das folgende Codebeispiel veranschaulicht die Verwendung eines SqlDataSource-Steuerelements zum Einfügen, Aktualisieren und Löschen von Datensätzen, wobei zusätzlich ein FormView-Steuerelement verwendet wird. Im Beispiel wird eine Verbindung zur SQL Server-Datenbank Northwind hergestellt.
<%@ 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 EmployeesGridView_OnSelectedIndexChanged(sender As Object, e As EventArgs)
EmployeeDetailsSqlDataSource.SelectParameters("EmpID").DefaultValue = _
EmployeesGridView.SelectedValue.ToString()
EmployeeFormView.DataBind()
End Sub
Sub EmployeeFormView_ItemUpdated(sender As Object, e As FormViewUpdatedEventArgs)
EmployeesGridView.DataBind()
End Sub
Sub EmployeeFormView_ItemDeleted(sender As Object, e As FormViewDeletedEventArgs)
EmployeesGridView.DataBind()
End Sub
Sub EmployeeDetailsSqlDataSource_OnInserted(sender As Object, e As SqlDataSourceStatusEventArgs)
Dim command As System.Data.Common.DbCommand = e.Command
EmployeeDetailsSqlDataSource.SelectParameters("EmpID").DefaultValue = _
command.Parameters("@EmpID").Value.ToString()
EmployeesGridView.DataBind()
EmployeeFormView.DataBind()
End Sub
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
<title>FormView Example</title>
</head>
<body>
<form id="form1" >
<h3>FormView Example</h3>
<table cellspacing="10">
<tr>
<td>
<asp:GridView ID="EmployeesGridView"
DataSourceID="EmployeesSqlDataSource"
AutoGenerateColumns="false"
DataKeyNames="EmployeeID"
OnSelectedIndexChanged="EmployeesGridView_OnSelectedIndexChanged"
RunAt="Server">
<HeaderStyle backcolor="Navy"
forecolor="White" />
<Columns>
<asp:ButtonField Text="Details..."
HeaderText="Show<BR>Details"
CommandName="Select"/>
<asp:BoundField DataField="EmployeeID" HeaderText="Employee ID"/>
<asp:BoundField DataField="LastName" HeaderText="Last Name"/>
<asp:BoundField DataField="FirstName" HeaderText="First Name"/>
</Columns>
</asp:GridView>
</td>
<td valign="top">
<asp:FormView ID="EmployeeFormView"
DataSourceID="EmployeeDetailsSqlDataSource"
DataKeyNames="EmployeeID"
Gridlines="Both"
OnItemUpdated="EmployeeFormView_ItemUpdated"
OnItemDeleted="EmployeeFormView_ItemDeleted"
RunAt="server">
<HeaderStyle backcolor="Navy"
forecolor="White"/>
<RowStyle backcolor="White"/>
<EditRowStyle backcolor="LightCyan"/>
<ItemTemplate>
<table>
<tr><td align="right"><b>Employee ID:</b></td><td><%# Eval("EmployeeID") %></td></tr>
<tr><td align="right"><b>First Name:</b></td> <td><%# Eval("FirstName") %></td></tr>
<tr><td align="right"><b>Last Name:</b></td> <td><%# Eval("LastName") %></td></tr>
<tr>
<td colspan="2">
<asp:LinkButton ID="EditButton"
Text="Edit"
CommandName="Edit"
RunAt="server"/>
<asp:LinkButton ID="NewButton"
Text="New"
CommandName="New"
RunAt="server"/>
<asp:LinkButton ID="DeleteButton"
Text="Delete"
CommandName="Delete"
RunAt="server"/>
</td>
</tr>
</table>
</ItemTemplate>
<EditItemTemplate>
<table>
<tr><td align="right"><b>Employee ID:</b></td><td><%# Eval("EmployeeID") %></td></tr>
<tr><td align="right"><b>First Name:</b></td>
<td><asp:TextBox ID="EditFirstNameTextBox"
Text='<%# Bind("FirstName") %>'
RunAt="Server" /></td></tr>
<tr><td align="right"><b>Last Name:</b></td>
<td><asp:TextBox ID="EditLastNameTextBox"
Text='<%# Bind("LastName") %>'
RunAt="Server" /></td></tr>
<tr>
<td colspan="2">
<asp:LinkButton ID="UpdateButton"
Text="Update"
CommandName="Update"
RunAt="server"/>
<asp:LinkButton ID="CancelUpdateButton"
Text="Cancel"
CommandName="Cancel"
RunAt="server"/>
</td>
</tr>
</table>
</EditItemTemplate>
<InsertItemTemplate>
<table>
<tr><td align="right"><b>First Name:</b></td>
<td><asp:TextBox ID="InsertFirstNameTextBox"
Text='<%# Bind("FirstName") %>'
RunAt="Server" /></td></tr>
<tr><td align="right"><b>Last Name:</b></td>
<td><asp:TextBox ID="InsertLastNameTextBox"
Text='<%# Bind("LastName") %>'
RunAt="Server" /></td></tr>
<tr>
<td colspan="2">
<asp:LinkButton ID="InsertButton"
Text="Insert"
CommandName="Insert"
RunAt="server"/>
<asp:LinkButton ID="CancelInsertButton"
Text="Cancel"
CommandName="Cancel"
RunAt="server"/>
</td>
</tr>
</table>
</InsertItemTemplate>
</asp:FormView>
</td>
</tr>
</table>
<asp:sqlDataSource ID="EmployeesSqlDataSource"
selectCommand="SELECT EmployeeID, FirstName, LastName FROM Employees"
connectionstring="<%$ ConnectionStrings:NorthwindConnection %>"
RunAt="server">
</asp:sqlDataSource>
<asp:sqlDataSource ID="EmployeeDetailsSqlDataSource"
SelectCommand="SELECT EmployeeID, LastName, FirstName FROM Employees WHERE EmployeeID = @EmpID"
InsertCommand="INSERT INTO Employees(LastName, FirstName) VALUES (@LastName, @FirstName);
SELECT @EmpID = SCOPE_IDENTITY()"
UpdateCommand="UPDATE Employees SET LastName=@LastName, FirstName=@FirstName
WHERE EmployeeID=@EmployeeID"
DeleteCommand="DELETE Employees WHERE EmployeeID=@EmployeeID"
ConnectionString="<%$ ConnectionStrings:NorthwindConnection %>"
OnInserted="EmployeeDetailsSqlDataSource_OnInserted"
RunAt="server">
<SelectParameters>
<asp:Parameter Name="EmpID" Type="Int32" DefaultValue="0" />
</SelectParameters>
<InsertParameters>
<asp:Parameter Name="EmpID" Direction="Output" Type="Int32" DefaultValue="0" />
</InsertParameters>
</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 EmployeesGridView_OnSelectedIndexChanged(Object sender, EventArgs e)
{
EmployeeDetailsSqlDataSource.SelectParameters["EmpID"].DefaultValue =
EmployeesGridView.SelectedValue.ToString();
EmployeeFormView.DataBind();
}
void EmployeeFormView_ItemUpdated(Object sender, FormViewUpdatedEventArgs e)
{
EmployeesGridView.DataBind();
}
void EmployeeFormView_ItemDeleted(Object sender, FormViewDeletedEventArgs e)
{
EmployeesGridView.DataBind();
}
void EmployeeDetailsSqlDataSource_OnInserted(Object sender, SqlDataSourceStatusEventArgs e)
{
System.Data.Common.DbCommand command = e.Command;
EmployeeDetailsSqlDataSource.SelectParameters["EmpID"].DefaultValue =
command.Parameters["@EmpID"].Value.ToString();
EmployeesGridView.DataBind();
EmployeeFormView.DataBind();
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
<title>FormView Example</title>
</head>
<body>
<form id="form1" >
<h3>FormView Example</h3>
<table cellspacing="10">
<tr>
<td>
<asp:GridView ID="EmployeesGridView"
DataSourceID="EmployeesSqlDataSource"
AutoGenerateColumns="false"
DataKeyNames="EmployeeID"
OnSelectedIndexChanged="EmployeesGridView_OnSelectedIndexChanged"
RunAt="Server">
<HeaderStyle backcolor="Navy"
forecolor="White" />
<Columns>
<asp:ButtonField Text="Details..."
HeaderText="Show<BR>Details"
CommandName="Select"/>
<asp:BoundField DataField="EmployeeID" HeaderText="Employee ID"/>
<asp:BoundField DataField="LastName" HeaderText="Last Name"/>
<asp:BoundField DataField="FirstName" HeaderText="First Name"/>
</Columns>
</asp:GridView>
</td>
<td valign="top">
<asp:FormView ID="EmployeeFormView"
DataSourceID="EmployeeDetailsSqlDataSource"
DataKeyNames="EmployeeID"
Gridlines="Both"
OnItemUpdated="EmployeeFormView_ItemUpdated"
OnItemDeleted="EmployeeFormView_ItemDeleted"
RunAt="server">
<HeaderStyle backcolor="Navy"
forecolor="White"/>
<RowStyle backcolor="White"/>
<EditRowStyle backcolor="LightCyan"/>
<ItemTemplate>
<table>
<tr><td align="right"><b>Employee ID:</b></td><td><%# Eval("EmployeeID") %></td></tr>
<tr><td align="right"><b>First Name:</b></td> <td><%# Eval("FirstName") %></td></tr>
<tr><td align="right"><b>Last Name:</b></td> <td><%# Eval("LastName") %></td></tr>
<tr>
<td colspan="2">
<asp:LinkButton ID="EditButton"
Text="Edit"
CommandName="Edit"
RunAt="server"/>
<asp:LinkButton ID="NewButton"
Text="New"
CommandName="New"
RunAt="server"/>
<asp:LinkButton ID="DeleteButton"
Text="Delete"
CommandName="Delete"
RunAt="server"/>
</td>
</tr>
</table>
</ItemTemplate>
<EditItemTemplate>
<table>
<tr><td align="right"><b>Employee ID:</b></td><td><%# Eval("EmployeeID") %></td></tr>
<tr><td align="right"><b>First Name:</b></td>
<td><asp:TextBox ID="EditFirstNameTextBox"
Text='<%# Bind("FirstName") %>'
RunAt="Server" /></td></tr>
<tr><td align="right"><b>Last Name:</b></td>
<td><asp:TextBox ID="EditLastNameTextBox"
Text='<%# Bind("LastName") %>'
RunAt="Server" /></td></tr>
<tr>
<td colspan="2">
<asp:LinkButton ID="UpdateButton"
Text="Update"
CommandName="Update"
RunAt="server"/>
<asp:LinkButton ID="CancelUpdateButton"
Text="Cancel"
CommandName="Cancel"
RunAt="server"/>
</td>
</tr>
</table>
</EditItemTemplate>
<InsertItemTemplate>
<table>
<tr><td align="right"><b>First Name:</b></td>
<td><asp:TextBox ID="InsertFirstNameTextBox"
Text='<%# Bind("FirstName") %>'
RunAt="Server" /></td></tr>
<tr><td align="right"><b>Last Name:</b></td>
<td><asp:TextBox ID="InsertLastNameTextBox"
Text='<%# Bind("LastName") %>'
RunAt="Server" /></td></tr>
<tr>
<td colspan="2">
<asp:LinkButton ID="InsertButton"
Text="Insert"
CommandName="Insert"
RunAt="server"/>
<asp:LinkButton ID="CancelInsertButton"
Text="Cancel"
CommandName="Cancel"
RunAt="server"/>
</td>
</tr>
</table>
</InsertItemTemplate>
</asp:FormView>
</td>
</tr>
</table>
<asp:sqlDataSource ID="EmployeesSqlDataSource"
selectCommand="SELECT EmployeeID, FirstName, LastName FROM Employees"
connectionstring="<%$ ConnectionStrings:NorthwindConnection %>"
RunAt="server">
</asp:sqlDataSource>
<asp:sqlDataSource ID="EmployeeDetailsSqlDataSource"
SelectCommand="SELECT EmployeeID, LastName, FirstName FROM Employees WHERE EmployeeID = @EmpID"
InsertCommand="INSERT INTO Employees(LastName, FirstName) VALUES (@LastName, @FirstName);
SELECT @EmpID = SCOPE_IDENTITY()"
UpdateCommand="UPDATE Employees SET LastName=@LastName, FirstName=@FirstName
WHERE EmployeeID=@EmployeeID"
DeleteCommand="DELETE Employees WHERE EmployeeID=@EmployeeID"
ConnectionString="<%$ ConnectionStrings:NorthwindConnection %>"
OnInserted="EmployeeDetailsSqlDataSource_OnInserted"
RunAt="server">
<SelectParameters>
<asp:Parameter Name="EmpID" Type="Int32" DefaultValue="0" />
</SelectParameters>
<InsertParameters>
<asp:Parameter Name="EmpID" Direction="Output" Type="Int32" DefaultValue="0" />
</InsertParameters>
</asp:sqlDataSource>
</form>
</body>
</html>
Der Befehl kann der Name einer gespeicherten Prozedur sein, sofern die von Ihnen verwendete Datenbank gespeicherte Prozeduren unterstützt. Wenn Sie zum Aktualisieren von Daten gespeicherte Prozeduren verwenden, müssen Sie die UpdateCommandType-Eigenschaft auf StoredProcedure festlegen.
Parameter
Parameter werden verwendet, um die für das Einfügen, Aktualisieren und Löschen benötigten Werte zur Datenquelle zu übertragen. Parameternamen und -werte basieren auf Datenfeldern, die an ein Steuerelement gebunden sind, bzw. auf Parameterobjekten, die Sie explizit definiert haben. Die Parameter aus einem datengebundenen Steuerelement enthalten sowohl Werte für die Datenoperation als auch Schlüsselwerte, die zur Identifikation einer bestimmten Zeile dienen, wie in der DataKeyNames-Eigenschaft des gebundenen Steuerelements festgelegt.
Sie können explizite Parameter-Definitionen erstellen, um die Reihenfolge der Parameter, den Parametertyp und die Richtung des Parameters sowie zusätzliche Parameter anzugeben, die von den Parametern abweichen, die auf den an ein Steuerelement gebundenen Feldern basieren. So ist beispielsweise ein Ausgabeparameter denkbar, der einen von der Datenquelle automatisch generierten Wert zurückgibt, wie zum Beispiel einen automatisch erhöhten Primärschlüssel oder eine Datums-/Uhrzeitangabe.
Hinweis: |
---|
Die explizite Angabe von Parametern ist besonders wichtig, wenn der System.Data.OleDb-Anbieter oder der System.Data.Odbc-Anbieter verwendet werden, die benannte Parameter in SQL-Anweisungen nicht unterstützen, sondern stattdessen den Platzhalter '?' verwenden, um einen Parameter anzugeben. In diesen Fällen sollten Sie die Parameter in der Reihenfolge definieren, wie sie in der entsprechenden SQL-Anweisung angegeben ist. |
Weitere Informationen sowie Beispiele zur Verwendung von Parametern finden Sie unter Verwenden von Parametern mit dem SqlDataSource-Steuerelement und Erstellen von Parametern für datengebundene Felder durch ein Datenquellensteuerelement.
Ereignisse
Das SqlDataSource-Steuerelement löst Ereignisse aus, die Sie verwenden können, um vor und nach der Ausführung eines Einfüge-, Aktualisierungs- oder Löschvorgangs durch das Steuerelement eigenen Code auszuführen.
Das SqlDataSource-Steuerelement löst das Inserting-Ereignis, das Updating-Ereignis oder das Deleting-Ereignis aus, bevor es die SQL-Anweisung ausführt, die der entsprechenden Befehlseigenschaft zugeordnet ist. Sie können einen Handler für diese Ereignisse hinzufügen, um vor der Ausführung einer Anweisung die Parameter für diese Anweisung zu bearbeiten, in anderer Reihenfolge anzuordnen oder zu überprüfen. Ebenso können Sie die Ausführung des Befehls abbrechen. Wenn Sie beispielsweise einen QueryStringParameter mit dem SqlDataSource-Steuerelement verwenden, könnten Sie das Updating-Ereignis behandeln, um den Wert des Parameters vor dem Ausführen der Aktualisierung zu überprüfen. (Standardmäßig übernimmt der QueryStringParameter den Wert einer Variablen von einer Abfragezeichenfolge und überträgt diesen Wert ohne Validierung an die Datenbank.) Wenn der Wert nicht zulässig ist, können Sie die Aktualisierung abbrechen, indem Sie die Cancel-Eigenschaft des SqlDataSourceCommandEventArgs-Objekts von diesem Ereignis auf true festlegen.
Das SqlDataSource-Steuerelement löst nach Abschluss der Datenbankoperation ein Inserted-Ereignis, ein Updated-Ereignis oder ein Deleted-Ereignis aus. Sie können diese Ereignisse behandeln, um zu bestimmen, ob während der Datenbankoperation eine Ausnahme ausgelöst wurde, wie viele Datensätze von der Operation betroffen waren oder welche Ausgabewerte die Datenbankoperation zurückgegeben hat.
So werden im folgenden Codebeispiel das Updating-Ereignis und das Updated-Ereignis verwendet, um den Befehl UpdateCommand innerhalb einer Transaktion auszuführen.
<%@Page Language="VB" %>
<%@Import Namespace="System.Data" %>
<%@Import Namespace="System.Data.Common" %>
<%@Import Namespace="System.Diagnostics" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script >
Sub On_Click(ByVal source As Object, ByVal e As EventArgs)
SqlDataSource1.Update()
End Sub 'On_Click
Sub On_Sql_Updating(ByVal source As Object, ByVal e As SqlDataSourceCommandEventArgs)
Dim command as DbCommand
Dim connection as DbConnection
Dim transaction as DbTransaction
command = e.Command
connection = command.Connection
connection.Open()
transaction = connection.BeginTransaction()
command.Transaction = transaction
End Sub 'On_Sql_Updating
Sub On_Sql_Updated(ByVal source As Object, ByVal e As SqlDataSourceStatusEventArgs)
Dim command As DbCommand
Dim transaction As DbTransaction
command = e.Command
transaction = command.Transaction
' In this code example the OtherProcessSucceeded variable represents
' the outcome of some other process that occurs whenever the data is
' updated, and must succeed for the data change to be committed. For
' simplicity, we set this value to true.
Dim OtherProcessSucceeded as Boolean = True
If (OtherProcessSucceeded) Then
transaction.Commit()
Label2.Text="The record was updated successfully!"
Else
transaction.Rollback()
Label2.Text="The record was not updated."
End If
End Sub ' On_Sql_Updated
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
<title>ASP.NET Example</title>
</head>
<body>
<form id="form1" >
<asp:SqlDataSource
id="SqlDataSource1"
ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
SelectCommand="SELECT EmployeeID, LastName, Address FROM Employees"
UpdateCommand="UPDATE Employees SET Address=@Address WHERE EmployeeID=@EmployeeID"
OnUpdating="On_Sql_Updating"
OnUpdated ="On_Sql_Updated">
<UpdateParameters>
<asp:ControlParameter Name="Address" ControlId="TextBox1" PropertyName="Text"/>
<asp:ControlParameter Name="EmployeeID" ControlId="DropDownList1" PropertyName="SelectedValue"/>
</UpdateParameters>
</asp:SqlDataSource>
<asp:DropDownList
id="DropDownList1"
DataTextField="LastName"
DataValueField="EmployeeID"
DataSourceID="SqlDataSource1">
</asp:DropDownList>
<br />
<asp:Label id="Label1" Text="Enter a new address for the selected user."
AssociatedControlID="TextBox1" />
<asp:TextBox id="TextBox1" />
<asp:Button id="Submit" Text="Submit" OnClick="On_Click" />
<br /><asp:Label id="Label2" Text="" />
</form>
</body>
</html>
<%@Page Language="C#" %>
<%@Import Namespace="System.Data" %>
<%@Import Namespace="System.Data.Common" %>
<%@Import Namespace="System.Data.SqlClient" %>
<%@Import Namespace="System.Diagnostics" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script >
private void On_Click(Object source, EventArgs e) {
SqlDataSource1.Update();
}
private void OnSqlUpdating(Object source, SqlDataSourceCommandEventArgs e) {
DbCommand command = e.Command;
DbConnection cx = command.Connection;
cx.Open();
DbTransaction tx = cx.BeginTransaction();
command.Transaction = tx;
}
private void OnSqlUpdated(Object source, SqlDataSourceStatusEventArgs e) {
DbCommand command = e.Command;
DbTransaction tx = command.Transaction;
// In this code example the OtherProcessSucceeded variable represents
// the outcome of some other process that occurs whenever the data is
// updated, and must succeed for the data change to be committed. For
// simplicity, we set this value to true.
bool OtherProcessSucceeded = true;
if (OtherProcessSucceeded) {
tx.Commit();
Label2.Text="The record was updated successfully!";
}
else {
tx.Rollback();
Label2.Text="The record was not updated.";
}
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
<title>ASP.NET Example</title>
</head>
<body>
<form id="form1" >
<asp:SqlDataSource
id="SqlDataSource1"
ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
SelectCommand="SELECT EmployeeID, LastName, Address FROM Employees"
UpdateCommand="UPDATE Employees SET Address=@Address WHERE EmployeeID=@EmployeeID"
OnUpdating="OnSqlUpdating"
OnUpdated ="OnSqlUpdated">
<UpdateParameters>
<asp:ControlParameter Name="Address" ControlId="TextBox1" PropertyName="Text"/>
<asp:ControlParameter Name="EmployeeID" ControlId="DropDownList1" PropertyName="SelectedValue"/>
</UpdateParameters>
</asp:SqlDataSource>
<asp:DropDownList
id="DropDownList1"
DataTextField="LastName"
DataValueField="EmployeeID"
DataSourceID="SqlDataSource1">
</asp:DropDownList>
<br />
<asp:Label id="Label1" Text="Enter a new address for the selected user."
AssociatedControlID="TextBox1" />
<asp:TextBox id="TextBox1" />
<asp:Button id="Submit" Text="Submit" OnClick="On_Click" />
<br /><asp:Label id="Label2" Text="" />
</form>
</body>
</html>
<%@Page Language="VJ#" %>
<%@Import Namespace="System.Data" %>
<%@Import Namespace="System.Data.Common" %>
<%@Import Namespace="System.Diagnostics" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script >
private void On_Click(Object source, System.EventArgs e)
{
try {
SqlDataSource1.Update();
}
catch (System.Exception except) {
// Handle Exception
}
Label2.set_Text("The record was updated successfully!");
} //On_Click
private void OnSqlUpdate(Object source, SqlDataSourceCommandEventArgs e)
{
// Log the command in the Event Log on the Web server.
String logInfo = e.get_Command().get_CommandText()
+ " is being submitted to the database.";
IEnumerator ie = e.get_Command().get_Parameters().GetEnumerator();
while (ie.MoveNext()) {
DbParameter param = ((DbParameter)(ie.get_Current()));
logInfo = logInfo + " " + param.get_ParameterName()+ "="
+ param.get_Value();
}
EventLog log = new EventLog();
log.set_Log("Application");
log.set_Source("ASP.NET Example");
log.WriteEntry(logInfo);
} //OnSqlUpdate
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
<title>ASP.NET Example</title>
</head>
<body>
<form id="form1" >
<asp:SqlDataSource
id="SqlDataSource1"
ConnectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;"
SelectCommand="SELECT EmployeeID, LastName, Address FROM Employees"
UpdateCommand="UPDATE Employees SET Address=@Address WHERE EmployeeID=@EmployeeID"
OnUpdating="OnSqlUpdate">
<UpdateParameters>
<asp:ControlParameter Name="Address" ControlId="TextBox1" PropertyName="Text"/>
<asp:ControlParameter Name="EmployeeID" ControlId="DropDownList1" PropertyName="SelectedValue"/>
</UpdateParameters>
</asp:SqlDataSource>
<asp:DropDownList
id="DropDownList1"
DataTextField="LastName"
DataValueField="EmployeeID"
DataSourceID="SqlDataSource1">
</asp:DropDownList>
<br />
<asp:Label id="Label1" Text="Enter a new address for the selected user."
AssociatedControlID="TextBox1" />
<asp:TextBox id="TextBox1" />
<asp:Button id="Submit" Text="Submit" OnClick="On_Click" />
<br /><asp:Label id="Label2" Text="" />
</form>
</body>
</html>
Konflikterkennung
Das SqlDataSource-Steuerelement kann Aktualisierungs- und Löschvorgänge mit vollständiger Parallelität ausführen. Die vollständige Parallelität ist eine Datenbankstrategie, die vor dem Verlust von Änderungen in Szenarios schützt, in denen mehrere Benutzer Daten zur selben Zeit ändern. Das SqlDataSource-Steuerelement kann anhand der ConflictDetection-Eigenschaft bestimmen, welche Stufe der Prüfung auf vollständige Parallelität beim Ausführen von Aktualisierungs- und Löschvorgängen verwendet werden sollte.
Standardmäßig ist die ConflictDetection-Eigenschaft auf ConflictOptions.OverwriteChanges festgelegt. Dies bedeutet, dass bei Aktualisierungsvorgängen alle im Datensatz vorhandenen Werte überschrieben werden, ohne vorher zu überprüfen, ob der Datensatz durch eine andere Quelle geändert wurde. Dieses Szenario wird gelegentlich als "Der letzte Schreibzugriff gewinnt" (last writer wins) bezeichnet.
Sie können die ConflictDetection-Eigenschaft auf ConflictOptions.CompareAllValues festlegen. Dadurch stellen Sie sicher, dass das SqlDataSource-Steuerelement während eines Aktualisierungs- oder Löschvorgangs alle ursprünglich vorhandenen Werte berücksichtigt. Somit können Sie die SQL-Anweisung so schreiben, dass der Aktualisierungsvorgang nicht ausgeführt wird, wenn die gegenwärtig in der Datenbank enthaltenen Daten nicht mit den Daten übereinstimmen, die ursprünglich aus der Datenbank ausgelesen wurden. Ein Beispiel finden Sie unter Vollständige Parallelität (ADO.NET). Sie können das Updated-Ereignis behandeln, um zu überprüfen, wie viele Datensätze von einem Aktualisierungsvorgang betroffen sind. Wenn kein Datensatz aktualisiert wurde, ist eine Parallelitätsverletzung aufgetreten.