Modificar datos mediante el control SqlDataSource
Actualización: noviembre 2007
Puede utilizar el control SqlDataSource para modificar datos de una base de datos. La manera más común de utilizar el control SqlDataSource en escenarios de actualización consiste en recuperar los datos y mostrarlos mediante un control de servidor Web enlazado a datos, como GridView, DetailsView o FormView. El control enlazado a datos y el control SqlDataSource se pueden configurar para actualizar los datos. La mayor parte de los controles enlazados a datos se pueden configurar para permitir operaciones de inserción, actualización y eliminación, y pasan los valores que se deben actualizar al control del origen de datos. A continuación, el control del origen de datos envía los valores actualizados a la base de datos mediante una instrucción SQL o un procedimiento almacenado.
El control SqlDataSource se ha diseñado para actualizar datos, pero sólo actualiza un registro cada vez. Si necesita realizar actualizaciones por lotes, debe escribir lógica de bucle explícitamente en su aplicación ASP.NET.
Conceptos básicos
Para poder modificar datos en una base de datos mediante el control SqlDataSource, debe establecer al menos las siguientes propiedades:
ProviderName Establézcala en el nombre del proveedor ADO.NET que representa la base de datos con la que está trabajando.
ConnectionString Establézcala en una cadena de conexión que sea apropiada para su base de datos.
Propiedades del comando SqlDataSource Establézcalas en instrucciones SQL que modifiquen los datos de la base de datos.
En las secciones siguientes se describen estas propiedades más detalladamente.
Nombre del proveedor
Establezca la propiedad ProviderName en el nombre del proveedor ADO.NET para el tipo de base de datos en el que se almacenan los datos, que puede ser uno de los siguientes:
Si utiliza Microsoft SQL Server, establezca la propiedad ProviderName en "System.Data.SqlClient". Éste es el proveedor predeterminado si no especifica otro.
Si utiliza una base de datos de Oracle, establezca la propiedad ProviderName en "System.Data.OracleClient".
Si utiliza un origen de datos OLE DB, establezca la propiedad ProviderName en "System.Data.OleDb".
Si utiliza un origen de datos ODBC, establezca la propiedad ProviderName en "System.Data.Odbc".
Cadena de conexión
Establezca la propiedad ConnectionString para conectarse con una base de datos determinada. Se recomienda almacenar las cadenas de conexión en el elemento ConnectionStrings del archivo de configuración de la aplicación. A continuación, podrá hacer referencia a las cadenas de conexión almacenadas mediante la sintaxis <%$ ConnectionStrings:connectionStringName %> en el formato del control. La cadena de conexión debe ser una cadena de conexión válida para la propiedad ProviderName especificada.
Comandos
El control SqlDataSource dispone de tres propiedades de comando que pueden incluir instrucciones SQL que modifican los datos: InsertCommand, UpdateCommand y DeleteCommand. Las propiedades de comando se pueden establecer en una instrucción SQL o en el nombre de un procedimiento almacenado si el origen de datos admite el uso de procedimientos almacenados. La sintaxis real de la instrucción SQL depende del esquema de los datos y de la base de datos que se esté utilizando. La instrucción puede incluir parámetros si el origen de datos los admite.
Nota: |
---|
La instrucción que se establezca para la propiedad de comando es la misma que se ha establecido para la propiedad CommandText de un objeto IDbCommand de ADO.NET al escribir el código de manipulación de datos de ADO.NET. |
La instrucción SQL de la propiedad UpdateCommand se ejecuta siempre que se llama al método Update. Los controles enlazados a datos llaman de forma implícita al método Update cuando un usuario hace clic en un botón Actualizar en un control GridView, FormView o DetailsView. Si lo desea, también puede llamar a este método desde su propio código de forma explícita. Los métodos Insert y Delete del control SqlDataSource funcionan de forma similar.
En el ejemplo de código siguiente se muestra el uso de un control SqlDataSource para insertar, actualizar y eliminar registros mediante un control FormView. El ejemplo se conecta a la base de datos Northwind de SQL Server.
<%@ 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>
El comando puede ser el nombre de un procedimiento almacenado si la base de datos con la que está trabajando admite el uso de procedimientos almacenados. Si utiliza procedimientos almacenados para actualizar los datos, debe establecer la propiedad UpdateCommandType en StoredProcedure.
Parámetros
Los parámetros permiten enviar valores para las operaciones de inserción, actualización y eliminación al origen de datos. Los nombres y los valores de dichos parámetros se basan en campos de datos enlazados a un control o, de forma opcional, en objetos de parámetro que deben definirse explícitamente. Los parámetros de un control enlazado a datos incluyen los valores de la operación de datos y de los valores de clave necesarios para identificar una fila determinada, tal como se definen mediante la propiedad DataKeyNames de dicho control.
Puede crear definiciones Parameter explícitas para especificar el orden, el tipo y la dirección de los parámetros, así como parámetros adicionales distintos de los basados en campos enlazados a un control. Un ejemplo de esto sería un parámetro de salida que devuelve un valor generado automáticamente por el origen de datos, como una clave principal con incremento automático o una marca de fecha y hora.
Nota: |
---|
La especificación explícita de parámetros es de especial importancia cuando se trabaja con los proveedores System.Data.OleDb y System.Data.Odbc, ya que éstos no admiten el uso de parámetros con nombre en las instrucciones SQL y, en su lugar, utilizan el marcador de posición '?' para especificar un parámetro. En esos casos, debería definir los parámetros en el orden especificado en la instrucción SQL asociada. |
Para obtener más información y ejemplos del uso de los parámetros, vea Utilizar parámetros con el control SqlDataSource y Cómo un control de origen de datos crea parámetros para campos enlazados a datos.
Eventos
El control SqlDataSource produce eventos que puede controlar para que ejecuten su propio código antes y después de que el control realice una operación de inserción, actualización o eliminación.
El control SqlDataSource produce los eventos Inserting, Updating o Deleting antes de ejecutar la instrucción SQL para la propiedad de comando correspondiente. Puede agregar un controlador para estos eventos que le permita manipular, reordenar o validar los parámetros de una instrucción antes de que se ejecute, así como cancelar el comando. Por ejemplo, si utiliza un objeto QueryStringParameter con el control SqlDataSource, podría controlar el evento Updating para validar el valor del parámetro antes de realizar una actualización. (De forma predeterminada, QueryStringParameter toma el valor de una variable de cadena de consulta y lo envía a la base de datos sin realizar ninguna validación.) Si el valor no es aceptable, puede cancelar la actualización estableciendo la propiedad Cancel del objeto SqlDataSourceCommandEventArgs del evento en true.
El control SqlDataSource produce los eventos Inserted, Updated o Deleted una vez finalizada la operación de base de datos. Si lo desea, puede controlar estos eventos para determinar si se ha producido una excepción durante la operación de base de datos, a fin de averiguar cuántos registros se han visto afectados por la operación o examinar los valores de salida devueltos.
Por ejemplo, en el ejemplo de código siguiente se utilizan los eventos Updating y Updated para ejecutar UpdateCommand dentro de una transacción.
<%@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>
Detección de conflictos
El control SqlDataSource puede realizar operaciones de actualización y eliminación mediante la concurrencia optimista. La concurrencia optimista es una estrategia de base de datos que impide la pérdida de los cambios en un origen de datos en escenarios en los que varios usuarios están manipulando los datos al mismo tiempo. El control SqlDataSource utiliza la propiedad ConflictDetection para determinar el nivel de comprobación de concurrencia optimista que se debe utilizar al realizar operaciones de actualización y eliminación.
De forma predeterminada, la propiedad ConflictDetection se establece en ConflictOptions.OverwriteChanges, lo que significa que las operaciones de actualización sobrescriben los valores existentes en el registro sin determinar si éste ha sido modificado por otro origen. Este escenario en ocasiones se denomina "el último que escribe gana".
Puede establecer la propiedad ConflictDetection en ConflictOptions.CompareAllValues para asegurarse de que el control SqlDataSource incluye todos los valores originales durante el comando de actualización o de eliminación. Esto le permite escribir la instrucción SQL de tal forma que si los datos que están actualmente en la base de datos no coinciden con los datos leídos inicialmente de la base de datos, la operación de actualización no se realiza. Para obtener un ejemplo, vea Simultaneidad optimista (ADO.NET). Puede controlar el evento Updated para comprobar el número de registros afectados por una operación de actualización; si no se ha actualizado ningún registro, significa que se ha producido una infracción de concurrencia.